GetLastError = 1157 – プログラミング – Home

通知
すべてクリア

[解決済] GetLastError = 1157


maki
 maki
(@maki)
ゲスト
結合: 23年前
投稿: 12
Topic starter  

再び質問させてください。
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が必要なんですか?

よろしくお願いします。


引用未解決
トピックタグ
maki
 maki
(@maki)
ゲスト
結合: 23年前
投稿: 12
Topic starter  

書き忘れましたが、
ロードしようとしたのは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;
}

よろしくお願いします、


返信引用
超初心者
 超初心者
(@超初心者)
ゲスト
結合: 23年前
投稿: 139
 

Dependency Walker で調べてみればいい。
運がよければすぐ原因が判るでしょう。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

ATLプロジェクトで作成する時にDLLをリンクしていれば、
当然、ATLを使おうとする時にそのDLLもロードしようとするでしょうから
ある意味、ちっとも変な話では無いと思います。
で、実際にはプロジェクトに特に指定していなくてもリンクされる物もあるでしょうし、
そのDLL内で何かの関数かクラスを使用する為にDLLをリンクするようになっていれば、
そのDLLが無いと動かない事になります。

超初心者さんが言われているように問題のDLLをDependency Walkerで調べて
見たほうが良いと思います。
特に動かないと言うME上でやってみれば、足りないDLLが直ぐにわかるのではないでしょ
うか。


返信引用
maki
 maki
(@maki)
ゲスト
結合: 23年前
投稿: 12
Topic starter  

Dependency Walkerでみてみました。
足らないDLLをおいてみましたが、結果は同じでした。

そこで、プロジェクトのプロパティを見てみると、
ATLの「ATLに動的にリンク」となっていたので、
「ATLに静的にリンク」に変更してビルドしてみたところ、
相変わらず、LoadLibraryでNULLはかりますが、
GetLastErrorで0がかえるようになりました。

WINMEマシンはOS標準以外のソフトはほとんど入れていなかった
ので、動的にロードすべきDLLがなかったように推測します。

しかし、0は「この操作を正しく終了しました。」という意味ですが、
正しく終了したのに、なぜNULLがかえってくる(ELSEに入る)のでしょうか?

ちなみに、WIN2000でも、WINMEと同じ結果が返って
きました。このマシンはOS標準以外のソフトは全く入っていません。

最初に書き忘れましたが、XPのマシンにはVC7.0が入っています。

アドバイスを頂きたいです。
よろしくお願いします。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

GetLastErrorはOSが捕らえる事ができるエラーなら捕まえられると思いますが、
OSレベルではなくてそのライブラリの内部エラーが原因で失敗しているなら
捉えられない状況も出てくると思います。
なのでGetLastErrorの結果が0でもロードに失敗する場面はあるのでは
ないでしょうか。
あと、ファイルとしては存在していてもバージョン違いで動作がうまく行かない
と言う事も考えられるのではないでしょうか。


返信引用
maki
 maki
(@maki)
ゲスト
結合: 23年前
投稿: 12
Topic starter  

とりあえず、解決しました。
ATLのウイザートで雛形を作るときに、「COM+1.0のサポート」
にチェックしため、COM+対応のアプリになっていたようです。
COM+ってなに?っていうレベルですけど、
とりあえず今回は関係がないので、チェックを外して雛形を作成したところ
WIN2000でも、MEでも正常に動きました。
COM+についても勉強したいですが、当面は置いておこうと思います。

ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました