0

Delphi サンプル コードからこのソース コードを見つけました。Delphi 動的 DLL 内にコントロールまたはコンポーネントを追加していますが、わかりません。

library DLLEntryLib;

uses
  SysUtils,
  Windows,
  Dialogs,
  Classes,
  msHTML,
  SHDocVw;

type
TMyWeb = class(TWebBrowser)
constructor create(Aowner: TComponent); override;
end;

var
web: TMyWeb;

// Initialize properties here
constructor TMyWeb.Create(AOwner: TComponent);
begin
inherited Create(Self);
end;

procedure getweb;
begin
    web := TmyWeb.create(nil);
    web.Navigate('http://mywebsite.com');
end;


procedure xDLLEntryPoint(dwReason: DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH:
    begin
    getweb; //I THINK THE ERROR IS HERE, HOW TO WORK THIS OUT?
    ShowMessage('Attaching to process');
    end;
    DLL_PROCESS_DETACH: ShowMessage('Detaching from process');
    DLL_THREAD_ATTACH:  MessageBeep(0);
    DLL_THREAD_DETACH:  MessageBeep(0);
  end;
end;

begin
  { First, assign the procedure to the DLLProc variable }
  DllProc := @xDLLEntryPoint;
  { Now invoke the procedure to reflect that the DLL is attaching to the
    process }
  xDLLEntryPoint(DLL_PROCESS_ATTACH);
end.


//IN MY APPLICATION FORM.
procedure TMainForm.btnLoadLibClick(Sender: TObject);
begin
if LibHandle = 0 then
begin
LibHandle := LoadLibrary('DLLENTRYLIB.DLL');
if LibHandle = 0 then
  raise Exception.Create('Unable to Load DLL');
end
else
MessageDlg('Library already loaded', mtWarning, [mbok], 0);
end;

エラーを取り除くにはどうすればよいですか? 多くの連続した例外を発生させます

4

1 に答える 1

1

あなたが書くとき:

inherited Create(Self);

あなたは書くべきです

inherited Create(AOwner);

コントロールに自分自身を所有するように求めています。それはうまくいきません。コンストラクターが失敗した場合、それはおそらく非終了再帰につながります。

もう 1 つの大きな問題は、内部で Web ブラウザー コントロールを作成していることですDllMain。それは非常に大きなノーノーです。あなたはそれをやめたいと思うでしょう。そのコードを別のエクスポートされた関数に移動します。では何もしませんDllMain

おそらく、呼び出し元は既に COM を初期化しています。そうでない場合は、呼び出し元がそうしていることを確認する必要があります。呼び出し元が VCL フォーム アプリの場合、COM は自動的に初期化されます。

于 2013-04-18T13:47:12.893 に答える