2013/01/09

取得所有檔案頪型的版本資訊方法

資料來源:DLL file version

function getFileVersionStr( const sgFileName : string ) : string;
var infoSize: DWORD;
var verBuf:   pointer;
var verSize:  UINT;
var wnd:      UINT;
var FixedFileInfo : PVSFixedFileInfo;
begin
  infoSize := GetFileVersioninfoSize(PChar(sgFileName), wnd);

  result := '';

  if infoSize <> 0 then
  begin
    GetMem(verBuf, infoSize);
    try
      if GetFileVersionInfo(PChar(sgFileName), wnd, infoSize, verBuf) then
      begin
        VerQueryValue(verBuf, '\', Pointer(FixedFileInfo), verSize);

        result := IntToStr(FixedFileInfo.dwFileVersionMS div $10000) + '.' +
                  IntToStr(FixedFileInfo.dwFileVersionMS and $0FFFF) + '.' +
                  IntToStr(FixedFileInfo.dwFileVersionLS div $10000) + '.' +
                  IntToStr(FixedFileInfo.dwFileVersionLS and $0FFFF);
      end;
    finally
      FreeMem(verBuf);
    end;
  end;
end;

function getFileVersionInt( const sgFileName : string ) : Integer;
var infoSize: DWORD;
var verBuf:   pointer;
var verSize:  UINT;
var wnd:      UINT;
var FixedFileInfo : PVSFixedFileInfo;
begin
  infoSize := GetFileVersioninfoSize(PChar(sgFileName), wnd);

  result := 0;

  if infoSize <> 0 then
  begin
    GetMem(verBuf, infoSize);
    try
      if GetFileVersionInfo(PChar(sgFileName), wnd, infoSize, verBuf) then
      begin
        VerQueryValue(verBuf, '\', Pointer(FixedFileInfo), verSize);

        result := StrToInt( IntToStr(FixedFileInfo.dwFileVersionMS div $10000) +
                  IntToStr(FixedFileInfo.dwFileVersionMS and $0FFFF) +
                  IntToStr(FixedFileInfo.dwFileVersionLS div $10000) +
                  IntToStr(FixedFileInfo.dwFileVersionLS and $0FFFF) );
      end;
    finally
      FreeMem(verBuf);
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage(getFileVersionStr('C:\ABC.EXE'));
  ShowMessage(IntToStr(getFileVersionInt('D:\CDE.DLL')));
end;

2013/01/06

Delphi unicode string VS memorystream

資料來源:
1. Wrtiting string to TMemoryStream - Pointer to string

2. 现有 Delphi 项目迁移到 Tiburon 中的注意事项

擴充的TStreamEx,在D7, Delphi XE下都可正確使用,只能說歪國人真是太厲害了,學習!

procedure TStreamEx.WriteString(const data: string);
var
  len: cardinal;
  oString: UTF8String;
begin
  oString := UTF8String(data);
  len := length(oString);
  self.WriteBuffer(len, 4);
  if len > 0 then
    self.WriteBuffer(oString[1], len);
end;

procedure TStreamEx.ReadString(const data: string);
var
  len: cardinal;
  iString: UTF8String;
begin
  self.ReadBuffer(len, 4);
  if len > 0 then
  begin
    SetLength(iString, len);
    self.ReadBuffer(iString[1], len);
    result := string(iString);
  end
  else result := '';
end;

2013/01/03

Open Dbexpress 安裝中文說明

中文:
========
使用:
  一、移除舊版的Package(PkgDbxXXDrv{%Delphi版本號%}.bpl),並且移除舊版的搜尋路徑
 
  二、安裝新的Package到IDE中,路徑如下:
        dbxoodbc\lib\{%Delphi版本號%}\dbxoodbc*.bpl
      or
        dbxoodbc\lib\{%Delphi版本號%}\dbxoodbc*_emb.bpl
      ※第二個版本在輸出時不需要外部的「dbxoodbc.dll」
    
  三、複製"dbxoodbc\lib\dbxoodbc_driver\(%Platform%)\release\*dbxoodbc*"目錄下所有的檔案到系統目錄
      (例如:{%DELPHI}\Bin)
    
  四、把模組加入到你的專案中,例如:
      uses
        ..., DbxXXDrv;
      
      而下面的方式可以在輸出的時候不需要額外的「dbxoodbc.dll」
      uses
        ..., DbxOpenOdbcStatic;

如果你使用這套Driver時有問題,可以參照下列的方式進行檢查或故障排除

一、加入下列模組到你的專案,它可以讓你進入DbxOpenOdbc.pas進行Debug工作
    uses
      ..., DbxOpenOdbcStatic, DbxXXDrv;
    
二、如果 DbxOpenOdbc.pas 無法解決你的問題,你必須再深入到
      日誌模式(mode of journalizing)

三、要開啟日誌模式,你必須編輯「DbxOpenOdbc_options.inc」單元
    並將 {$DEFINE _DEBUG_} 和 {$DEFINE _TRACE_CALLS_} 開啟
    然後將 {.$DEFINE _RELEASE_} 關閉
    最後,重新編譯你的專案或 OpenODBC 驅動
  
四、偵錯訊息將會在Delphi IDE裡的EventLog視窗顯示,但只能在開發環境中運行
    其它的偵錯方式可使用「Debug View」,詳見:
    http://technet.microsoft.com/en-us/sysinternals/bb896647
    想更進一步偵錯可參考「DbxOpenOdbcTrace.pas」單元
  
五、在Debug視窗將顯示資料庫版本、ODBC驅動程式、OpenODBC和連線參數,
    你連線的問題將具體表現在這些資訊裡面,這有助於快速找尋及解決問題
    這日誌將記錄呼叫的方法...
  
六、中文翻譯不明白的地方,以英文版的說明為準