こんにちは
DllMain() の第2引数の値が DLL_PROCESS_ATTACH のときに
MessageBox( NULL, error, title, MB_OK | MB_ICONSTOP );
を呼び出すとアクセス違反を起こすのですが、何が原因でしょうか?
動作環境は Windows XP SP1、コンパイラは VS .NET 2003 です。
以上、よろしくお願いします。
そういう仕様です。
DllMain
http://msdn.microsoft.com/library/en-us/dllproc/base/dllmain.asp
のRemarksを参照。
|Calling imported functions other than those located in Kernel32.dll may result
|in problems that are difficult to diagnose.
日本語資料もありまっせ。
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/jpdllpro/html/_win32_DllMain.asp
の「解説」
> アタッチの際、開発者が作成した DLL エントリポイント関数の本体は、スレッド
> ローカル記憶域(TLS)の作成、オブジェクトの作成、ファイルのオープンなど
> 単純な初期化作業だけを行うべきです。
> TLS、オブジェクト作成、ファイル関数以外の Win32 関数を呼び出すと、診断
> しにくい問題が発生する可能性があります。たとえば、ユーザー関数、シェル関数、
> COM、RPC、Windows Sockets の各関数(または、これらの関数を呼び出す任意の
> 関数)を呼び出すと、アクセス違反のエラーが発生する可能性があります。
MessageBox は User32.dll の関数なので、上記「ユーザー関数」に該当します。
dairygoodsさん、シャノンさん、ありがとうございました。
マニュアルの警告を見逃していました。
DLL_PROCESS_ATTACHのタイミングでウィンドウにエラーメッセージを
表示するのは難しそうですね。別の方法を考えてみます。