簡體   English   中英

Delphi單詞自動化:在Dll中創建Ole對象

[英]Delphi word automation: Create Ole Object inside Dll

是否有人知道如何在DLL中創建ole對象。 我有一個加載DLL的應用程序,該DLL又創建了ole對象。 每次我的應用程序崩潰。

MSWord:= CreateOleObject('Word.Application');

假定已安裝Word,則您的代碼可能失敗的主要原因是未在調用線程中初始化COM。 那不是應該從DLL嘗試的事情,因為您希望DLL能夠與已經初始化COM的使用者一起使用。

因此,解決此問題的正確方法是將DLL聲明為DLL接口協定的一部分,而調用者必須初始化COM。 通常通過調用CoInitializeCoInitializeEx

另一條評論是,如果應用程序崩潰,則表明您的錯誤處理已損壞。 DLL中的所有函數都應采取步驟以捕獲任何異常並將其轉換為錯誤代碼以返回給調用者。 我懷疑您尚未執行此操作,並且正在從DLL中拋出Delphi異常。 你絕對不能那樣做。

請注意,我給出了廣泛而籠統的答案。 這與問題的廣泛性質以及問題中幾乎沒有細節的事實相吻合。 如果您提供了MCVE,我們可以提供更詳細的答復。

正如DavidH所指出的,必須在調用線程中調用CoInitialize。

與VCL應用程序的主線程有關的注意點是,VCL應用程序是否自動調用CoInitialize取決於它是否使用ComObj單元:如果是,則通過TApplication.Initialize和InitComObj例程調用CoInitialize。 ComObj; 如果不是,則必須自己調用(或CoInitializeEx)。

測試此問題的簡單方法是從一個不帶TApplication的控制台應用程序中調用DLL-這樣可以避免被ComObj誤用,而不是使用您的主機。

假設您有一個包含以下導出過程的DLL:

procedure CreateWordDoc;
var
  DocText : String;
  MSWord,
  Document : OleVariant;
begin
  MSWord := CreateOleObject('Word.Application');
  MSWord.Visible := True;
  Document := MSWord.Documents.Add;
  DocText := 'Hello Word!';
  MSWord.Selection.TypeText(DocText);
end;

那么您可以這樣稱呼它:

program WordCaller;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows, ActiveX;

type
  TWordProc = procedure;

var
  LibHandle : THandle;
  WordProc : TWordProc;
begin
  CoInitialize(Nil);
  LibHandle := LoadLibrary('WordDll.Dll');
  try
    if LibHandle <> 0 then begin
      try
        WordProc := GetProcAddress(LibHandle, 'CreateWordDoc');
         if Assigned(WordProc) then
             WordProc;
       finally
         FreeLibrary(LibHandle);
       end;
    end;
  finally
    CoUnInitialize;
    Readln;
  end;
end.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM