9

Delphi で作成した DLL を扱うのに苦労しています。ライブラリで次のコードを使用して DllMain 関数を設定しました。

begin
  DllProc := DllMain;
end.

私のDllMain手順は次のようになります。

procedure DllMain(reason: Integer);
begin
  if reason = DLL_PROCESS_DETACH then
    OutputDebugString('DLL PROCESS DETACH')
  else if reason = DLL_PROCESS_ATTACH then
    OutputDebugString('DLL PROCESS ATTACH')
  else if reason = DLL_THREAD_ATTACH then
    OutputDebugString('DLL THREAD ATTACH')
  else if reason = DLL_THREAD_DETACH then
    OutputDebugString('DLL THREAD DETACH')
  else
    OutputDebugString('DllMain');
end;

私が見つけたのは、ATTACH が呼び出される前に、呼び出し元 (私が制御していない) によって DETACH が (2 回?!) 呼び出されたように見えることです。それは可能ですか、それともこれがどのように機能するかを誤解していますか? 私の予想では、すべての ATTACH 呼び出しが対応する DETACH 呼び出しで満たされると思いますが、そうではないようです。

ここで何が起こっているのですか?!

4

2 に答える 2

12

残念ながらbegin、DLL コードで が実行されると、OS は既にDllMainライブラリで呼び出しています。したがって、DllProc := DllMain;ステートメントが実行されたときは、すでに手遅れです。Delphi コンパイラは、dll がプロセスにアタッチされている場合、ユーザー コードの実行を許可しません。推奨される回避策 (回避策と呼べる場合) はDllMain、ユニットの初期化セクションまたはライブラリ コードで独自の関数を呼び出すことです。

begin
  DllProc := DllMain;
  DllMain(DLL_PROCESS_ATTACH);
end;

関連ドキュメント:

: DLL_PROCESS_ATTACH は、DLL の初期化コードがプロシージャを呼び出し、DLL_PROCESS_ATTACH をパラメーターとして指定する場合にのみ、プロシージャに渡されます。

于 2012-04-30T01:19:05.893 に答える