最近更新日期:Sep-22-2002
Q: 編譯 DLL 專案時出現錯誤:File not found: 'EzDllFm.dcu'。
A: 有兩種解決方法:
Q: 編譯 DLL 專案時出現錯誤:File not found: 'EzDllExport.dcu'
A: Ez DLL Pack 套件的 Dcu 路徑必須加入環境設定的 Library path 項目中。
Q: 編譯主程式時出現錯誤:Bad package unit format......。
A: Ez DLL Pack 套件的 Dcu 路徑必須加入環境設定的 Library path 項目中。
Q: 編譯範例程式時出現錯誤:Bad file format: 'Program~1\Borland\Delphi5\Projects\Bpl\EzDll5.dcp'。
A: 試試將專案選項的 runtime packages 清單重新抓取,方法是將 runtime packages 內容清除,,然後將 "Build with runtime packages" 項目取消勾選,再恢復勾選,執行時期套件清單就會自動重抓。
Q: 呼叫 IPlugin 介面的 CreateForm 方法時,出現錯誤:Exception EInvalidOperation in module XXX.dll at XXXXXXXX.。
A: 請檢查 DLL 專案的專案選項,必須將 "Build with runtime packages" 選項打勾。
Q: 呼叫 IPlugin 介面的 CreateForm 方法時,出現錯誤 "Exception EInvalidOperation in module vcl50.bpl at XXXXXXXX.。
A: 請檢查主程式的專案選項,必須將 "Build with runtime packages" 選項打勾。
Q: 如果在 DLL 程式中用到 ADO dataset 元件,是否需要自行呼叫 CoInitialize?
A: 當你的程式執行時出現 "CoInitialize has not been called" 的錯誤訊息時,你就必須在程式中(主程式和 DLL) uses ActiveX 單元,並且撰寫下列程式碼:
initialization CoInitialize(nil); finalization CoUninitialize; end.
Q: 若兩個子視窗分別放在不同的 DLL 裡面,這兩個子視窗能互相"看見"對方嗎?
A: 它們不能真的"看見"對方,但是只要你能夠取得對方的視窗代碼,你就可以透過傳遞視窗訊息的方式來溝通,你也可以利用 TEzSharedMemory 交換資料。
Q: 如何在 DLL 視窗裡開啟另一個 DLL 的視窗?
A: 你可以從 TEzDllForm 衍生一個 TBaseChildForm 類別,以後所有的 MDI 子視窗都繼承自這個類別,並且在此類別中提供一個 InvokeDllForm 方法,程式碼看起來可能像這樣:
type
TDllChildForm = class(TEzDllForm)
protected
procedure InvokeDllForm(ID, Param: string);
end;
procedure TDllChildForm.InvokeDllForm(ID, Param: string);
begin
// Send WM_COPYDATA message to Application.MainForm with
// ID, and Param which
// ID is the form ID (in my program, every form has an ID)
// Param contains parameters you want to pass to the child form.
end;
InvokeDllForm 會送出 WM_COPYDATA 訊息給主程式,請主程式代為建立另一個 DLL 視窗。主程式這邊則需要攔截並解讀 WM_COPYDATA 訊息的內容,根據參數 ID 得知要建立的視窗位於哪個 DLL,將 DLL 載入,並且在建立視窗時,把 Param 參內容傳遞過去。被載入的 DLL 視窗都有一個 CallerFormHandle 屬性,代表開啟它的視窗代碼。
Copyright(c) 2002 EZ Studio