再び質問させてください。
http://support.microsoft.com/default.aspx?scid=kb;ja;298109
で配布しているATLプロジェクトを参考にサンプルとほぼ同じ
DLLを作成しました。
これをAPからLoadLibraryすると、WINXPのマシンでは成功するのですが、
WINMEのマシンではNULLがかってきます。
GetLastErrorで調べたところ、1157でした。
1157とは「このアプリケーションの実行に必要なライブラリファイルの
1つが見つかりません。」ということのようです。
どのDLLが不足しているのかわかりません。
ATLって、MFCのように実行時に特別なDLLが必要なんですか?
よろしくお願いします。
書き忘れましたが、
ロードしようとしたのはDllRegisterServerです。
こんな感じです。
typedef HRESULT (__stdcall *PDllRegisterServer)(void);
PDllRegisterServer pDllRegisterServer;
HINSTANCE hLib;
BOOL bResult = FALSE;
hLib = LoadLibrary(str);
if(hLib) {
pDllRegisterServer = (PDllRegisterServer)GetProcAddress
(hLib, DllRegisterServer);
if(pDllRegisterServer) {
if((pDllRegisterServer)() == S_OK)
bResult = TRUE;
}
FreeLibrary(hLib);
if(!bResult){
AfxMessageBox(_T(失敗!),MB_OK|MB_ICONHAND,0);
return FALSE;
}
}else{
TCHAR sss[100];
int k = (int)::GetLastError();
_stprintf(sss,_T(%d),k);
AfxMessageBox(sss);
AfxMessageBox(_T(失敗!),MB_OK|MB_ICONHAND,0);
return FALSE;
}
よろしくお願いします、
Dependency Walker で調べてみればいい。
運がよければすぐ原因が判るでしょう。
ATLプロジェクトで作成する時にDLLをリンクしていれば、
当然、ATLを使おうとする時にそのDLLもロードしようとするでしょうから
ある意味、ちっとも変な話では無いと思います。
で、実際にはプロジェクトに特に指定していなくてもリンクされる物もあるでしょうし、
そのDLL内で何かの関数かクラスを使用する為にDLLをリンクするようになっていれば、
そのDLLが無いと動かない事になります。
超初心者さんが言われているように問題のDLLをDependency Walkerで調べて
見たほうが良いと思います。
特に動かないと言うME上でやってみれば、足りないDLLが直ぐにわかるのではないでしょ
うか。
Dependency Walkerでみてみました。
足らないDLLをおいてみましたが、結果は同じでした。
そこで、プロジェクトのプロパティを見てみると、
ATLの「ATLに動的にリンク」となっていたので、
「ATLに静的にリンク」に変更してビルドしてみたところ、
相変わらず、LoadLibraryでNULLはかりますが、
GetLastErrorで0がかえるようになりました。
WINMEマシンはOS標準以外のソフトはほとんど入れていなかった
ので、動的にロードすべきDLLがなかったように推測します。
しかし、0は「この操作を正しく終了しました。」という意味ですが、
正しく終了したのに、なぜNULLがかえってくる(ELSEに入る)のでしょうか?
ちなみに、WIN2000でも、WINMEと同じ結果が返って
きました。このマシンはOS標準以外のソフトは全く入っていません。
最初に書き忘れましたが、XPのマシンにはVC7.0が入っています。
アドバイスを頂きたいです。
よろしくお願いします。
GetLastErrorはOSが捕らえる事ができるエラーなら捕まえられると思いますが、
OSレベルではなくてそのライブラリの内部エラーが原因で失敗しているなら
捉えられない状況も出てくると思います。
なのでGetLastErrorの結果が0でもロードに失敗する場面はあるのでは
ないでしょうか。
あと、ファイルとしては存在していてもバージョン違いで動作がうまく行かない
と言う事も考えられるのではないでしょうか。
とりあえず、解決しました。
ATLのウイザートで雛形を作るときに、「COM+1.0のサポート」
にチェックしため、COM+対応のアプリになっていたようです。
COM+ってなに?っていうレベルですけど、
とりあえず今回は関係がないので、チェックを外して雛形を作成したところ
WIN2000でも、MEでも正常に動きました。
COM+についても勉強したいですが、当面は置いておこうと思います。
ありがとうございました。