VS2008SP1 WinXP
LoadLibraryに失敗して困っています。確認したことは
・Unicode C/C++コマンドラインでUNICODEを確認
・ファイルのパス static CFile::GetStatusがFALSEでないものをロード
どこかのコードを追加した際、急にこの現象が起こるようになったことはわかっています。
出力は
'D:\xxxx\yyyy.dll' を読み込みました。シンボルが読み込まれました。
'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\msvcp90d.dll'
を読み込みました。シンボルが読み込まれました。
CArchive exception: readOnly.
0x7c812afb で初回の例外が発生しました: Microsoft C++ の例外: CArchiveException
(メモリの場所 0x0012e23c)。
'D:\xxxx\yyyy.dll' をアンロード
'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\msvcp90d.dll'
をアンロード
こんな感じで、LoadLibraryした後の戻り値ハンドルがNULLです。
おそらく自作のyyyy.dllが悪いのでしょうけれど、ハンドルがNULLですと
悪いコード位置にたどり着けないので皆様のお力をお借りしたく。。
なんか深読みしすぎな希ガス
重要なメッセージは CArchive exception: readOnly.
MFC ソースをちょっと追いかけるとこのメッセージは
CArchive::Write(), CArchive::WriteObject が !IsStoring() なときに出力されるとわ
かる。
単に Serialize の際の << と >> が逆向いてるだけだと思うが。
CArchiveを洗いなおしたら解決できました。ありがとうございます
CFileStatus fst;
if(CFile::GetStatus(lib_path, fst))
{
m_hDll = ::LoadLibrary(lib_path);
if(m_hDll)
{
...
}
else
{
::AfxMessageBox(error1);//動かない
}
}
この問題が起きているときAfxMessageBoxも動かなくなってしまうので一体何が。。。
とあせってました。直接の原因は>>では無かったですけど簡単なミスでした.
提示コードで LoadLibray 失敗の AfxMessageBox も表示されない、となると、
それは LoadLibrary 中に例外が投げられて unwind されているってことだ。
となると DllMain で例外投げてるということなのだろうけど、
DllMain 内部でやってよいことって制約があるので注意。
http://msdn.microsoft.com/ja-jp/library/aa290048(v=vs.71).aspx
ここんちの過去ログでもこんなのがあるし
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+201002/10020006.txt
今のうちにじっくり見直すほうがよさそう。
参考になります。ありがとうございました!