프로그래밍 노트

델파이에서 버젼 정보 얻기 본문

델파이

델파이에서 버젼 정보 얻기

띠리 2008. 1. 17. 21:21


델파이에서 원하는 버젼 정보를 문자열로 넘겨주는 함수의 예제
 

type
  TVerKind = (
    tvComments,         // 코멘트
    tvCompanyName,      // 회사명
    tvFileDescription,  // 설명
    tvFileVersion,      // 파일버젼
    tvInternalName,     // 내부명
    tvLegalCopyright,   // 저작권
    tvLegalTrademarks,  // 상표
    tvOriginalFilename, // 정식파일명
    tvPrivateBuild,     // Private Build
    tvProductName,      // 제품명
    tvProductVersion,   // 제품버젼
    tvSpecialBuild);    // Special Build

const
  csVerKey: array [TVerKind] of String = (
        'Comments',
        'CompanyName',
        'FileDescription',
        'FileVersion',
        'InternalName',
        'LegalCopyright',
        'LegalTrademarks',
        'OriginalFilename',
        'PrivateBuild',
        'ProductName',
        'ProductVersion',
        'SpecialBuild');

// 버젼 정보 얻기
function GetVersionInfo(KeyWord: TVerKind): string;
const
  cTranslation = '\VarFileInfo\Translation';
  cFileInfo = '\StringFileInfo\%0.4s%0.4s\';
var
  dBufSize    : DWORD;
  dHWnd       : DWORD;
  pVerInfoBuf : Pointer;
  pVerData    : Pointer;
  lVerDataLen : Longword;
  sPath       : String;
begin

  // 필요한 버퍼 사이즈 얻기
  dBufSize := GetFileVersionInfoSize(PChar(Application.ExeName), dHWnd);

  if dBufSize <> 0 then
  begin
    // 메모리확보
    GetMem(pVerInfoBuf, dBufSize);

    try
      GetFileVersionInfo(PChar(Application.ExeName), 0, dBufSize, pVerInfoBuf);

      // 변수정보 블럭안의 변환 테이블 지정
      VerQueryValue(pVerInfoBuf, PChar(cTranslation), pVerData, lVerDataLen);

      if not (lVerDataLen > 0) then
        raise Exception.Create('정보 수집 실패');

      // 8자리 16진수로 변환
      // →'\StringFileInfo\027382\FileDescription'
      sPath := Format(cFileInfo + csVerKey[KeyWord],
                      [IntToHex(Integer(pVerData^) and $FFFF, 4),
                      IntToHex((Integer(pVerData^) shr 16) and $FFFF, 4)]);
      VerQueryValue(pVerInfoBuf, PChar(sPath), pVerData, lVerDataLen);

      if lVerDataLen > 0 then
      begin
        // VerData는 제로로 끝나는 문자열이 아닌 것에 주의
        result := '';
        SetLength(result, lVerDataLen);
        StrLCopy(PChar(result), pVerData, lVerDataLen);
      end;
    finally
      // 개방
      FreeMem(pVerInfoBuf);
    end;
  end;
end;




 

Comments