Ez DLL Pack 問答集

最近更新日期:Sep-22-2002

索引

1. 與編譯相關的問題

2. 程式撰寫相關問題


1. 與編譯相關的問題

Q: 編譯 DLL 專案時出現錯誤:File not found: 'EzDllFm.dcu'。

A: 有兩種解決方法:

  1. DLL 專案的 'Build with runtime packages' 選項打勾,並且將 EzDll# 加入 runtime packages 清單。
  2. 將 EzDllFm.pas 加入專案。

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" 項目取消勾選,再恢復勾選,執行時期套件清單就會自動重抓。


2. 程式撰寫相關問題

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