1-3. 공용 라이브러리 공통으로 사용되는 함수와 변수, 상수들은 모아서 하나의 파일에 넣는다. 파일버전은 첫번째와 두번째 자리까지만 받아서 버전 관리에 사용한다. Revision, 혹은 Build 정보까지 필요하다면 버전 정보를 가져오는 함수와 DB의 버전정보 관리 Table을 수정해서 사용해야한다.
    unit simlaz_lib;

    {$mode objfpc}{$H+}

    interface

    uses
      windows, Classes, SysUtils, IdGlobal;

    const
      SIMLAZ_EOF = #9; // 전송항목간 구분자

      // 송/수신 구분자
      smlc_VERSION   = Ord('A'); // 버전 정보
      smlc_USERLIST  = Ord('B'); // 접속자 목록
      smlc_LOGIN     = Ord('C'); // 로그인
      smlc_OPENQUERY = Ord('D'); // Open Query
      smlc_EXECQUERY = Ord('E'); // Execute Query
      smlc_GETFILE   = Ord('F'); // 파일 다운로드
      smlc_ERROR     = Ord('X'); // Error
      smlc_CONNECT   = Ord('Y'); // 접속응답
      smlc_DUMMY     = Ord('Z'); // Dummy

    function GF_SIMLazFVer(AFileName: string): string; // 파일버전 가져오기
    procedure GP_SIMLazDec(var AValue: TIdBytes); // 데이터 해독
    procedure GP_SIMLazEnc(var AValue: TIdBytes); // 데이터 암호화

    // 송/수신 오류 메세지
    resourcestring
      ERR_SIMLAZ001 = '접근이 허용되지 않았습니다!';
      ERR_SIMLAZ002 = '잘못된 요청입니다!';
      ERR_SIMLAZ003 = '처리할 자료가 없습니다!';

      ERR_SIMLAZ101 = '사용 권한이 없습니다!';
      ERR_SIMLAZ102 = '암호가 잘못 되었습니다!';

      ERR_SIMLAZ201 = '전송할 파일이 존재하지 않습니다!';

      ERR_SIMLAZ301 = '수신된 데이터가 없습니다!';
      ERR_SIMLAZ302 = '서버에 연결되어 있지 않습니다!';
      ERR_SIMLAZ303 = '데이터 전송도중 오류가 발생하였습니다!';

      ERR_SIMLAZ999 = '알 수 없는 오류가 발생하였습니다!';

    implementation

    // 파일버전 가져오기
    function GF_SIMLazFVer(AFileName: string): string;
    var
      VerInfo: Pointer;
      VerValue: PVSFIXEDFILEINFO;
      VerInfoSize, VerValueSize, Dummy: DWORD;
    begin
      Dummy := 0;
      VerValue := nil;
      VerValueSize := 0;
      VerInfoSize := GetFileVersionInfoSize(PChar(AFileName), Dummy);
      GetMem(VerInfo, VerInfoSize);
      GetFileVersionInfo(PChar(AFileName), 0, VerInfoSize, VerInfo);
      VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
      with VerValue^ do
      begin
        Result := IntToStr(dwFileVersionMS shr 16);
        Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF);
      end;
      FreeMem(VerInfo, VerInfoSize);
    end;

    // 데이터 해독
    procedure GP_SIMLazDec(var AValue: TIdBytes);
    var
      i, l, x, k: Int32;
    begin
      l := Length(AValue);
      if l <= 0 then Exit;

      k := (l mod 100) + 21;
      for i := 0 to l - 1 do
      begin
        x := AValue[i] - k;
        if x < 0 then x := x + 256;
        AValue[i] := UInt8(x);
      end;
    end;

    // 데이터 암호화
    procedure GP_SIMLazEnc(var AValue: TIdBytes);
    var
      i, l, x, k: Int32;
    begin
      l := Length(AValue);
      if l <= 0 then Exit;

      k := (l mod 100) + 21;
      for i := 0 to l - 1 do
      begin
        x := AValue[i] + k;
        if x > 255 then x := x - 256;
        AValue[i] := UInt8(x);
      end;
    end;

    end.