LoadLibraryでNULLが返って来る・・・ – プログラミング – Home

通知
すべてクリア

[解決済] LoadLibraryでNULLが返って来る・・・


WOODS
 WOODS
(@WOODS)
ゲスト
結合: 22年前
投稿: 9
Topic starter  

はじめまして、WOODSと申します。

開発環境:Win-NT4.0 VC6.0SP5 MFC
対象:VC++ラウンジ

DLLをLoadLibray関数で動的に読み込んでいます。
しかし、LoadLibrary関数からNULLが返されるため、
GetLastErrorでエラーコードを見ると
1114(A dynamic link library (DLL) initialization routine failed.)が
返って来ています。
調べたところ、読み込んでいるDLLのコンストラクタまで
たどり着いていない感じなのですが、なにが原因かもわかりません。

このような場合の対応策などアドバイスいただけたら幸いです。

皆様、よろしくお願いいたします。


引用未解決
トピックタグ
ax
 ax
(@ax)
ゲスト
結合: 22年前
投稿: 10
 

DllMainがFALSEを返しているんじゃないですか?


返信引用
WOODS
 WOODS
(@WOODS)
ゲスト
結合: 22年前
投稿: 9
Topic starter  

axさん、アドバイスありがとうございます。

現在、読込んでいるDLLにはDllMainが定義されていません。
定義されていないDLLではどうなるのでしょうか?

現在、読込もうとしているDLLは下記の定義で構成されてます。
class DLLImportExport CTestDLL : public CObject
{
public:
CCTestDLL();
~CCTestDLL();
.
.
.
};

上記読み込みは以下のようになってます。
HMODULE hTestDLL = LoadLibrary( CCTESTDLL.DLL );
if( hTestDLL == NULL ) {
DWORD code = GetLastError();
return( code );
}


返信引用
joan
 joan
(@joan)
ゲスト
結合: 23年前
投稿: 42
 

読み込む CCTESTDLL.DLL をどこのフォルダに入れました?
DLLをロードするには、プロセスが起動したカレントディレクトリ、
システムフォルダの順番に読み込んでいきます。
VCから起動・デバッグする場合はプロジェクトファイルのある
ところがカレントディレクトリになるので、exeファイルのある
ところにdllを置いてもロードしてくれません。

確実なのは LoadLibrary の引数を絶対パスにしてまうこと
でしょうか。相対パスだと、不確かなところがあります。


返信引用
WOODS
 WOODS
(@WOODS)
ゲスト
結合: 22年前
投稿: 9
Topic starter  

joanさん、ありがとうございます。

読込むDLLは、実行環境のカレントに入っています。

現在、VC++からのデバッグで起動させていますが
「メニュー」→「プロジェクト」→「設定」のデバッグTABの「作業用のディレクトリ」に
対象となるDLLパス(この場合実行環境パス)を定義してありますので、
DLLが見つからずにエラーとなっている訳ではなさそうです。

絶対パスにして調査をしてみます。


返信引用
WOODS
 WOODS
(@WOODS)
ゲスト
結合: 22年前
投稿: 9
Topic starter  

LoadLibrary関数の引数として絶対パスにしてテストしてみましたが、
結果は変わらずでした。

また調査していて
「プロジェクトの設定」→「リンクTAB」でスタックアロケーションの予約と言うのは
そのアプリケーションで使用できるメモリ確保指定を意味しているのでしょうか?

これを64M指定(値に意図はありませんが、ただDLL内で32Mの
メモリアロケーションをしていることもあって)にしてデバッグをすると
今度は別の場所でCreateThreadで生成できずに、
GetLasttErrorの戻り値8(Not enough storage is available to process this
command.)が返されてしまいます。

底なし沼に入ってしまったようでどんどん身体が沈んでいってます・・・・。(T_T)


返信引用
ax
 ax
(@ax)
ゲスト
結合: 22年前
投稿: 10
 

AfxLoadLibraryではどうですか?(MFC共有DLLの場合だけど)

>「プロジェクトの設定」→「リンクTAB」でスタックアロケーションの予約と言うのは
>そのアプリケーションで使用できるメモリ確保指定を意味しているのでしょうか?

違います。スタックサイズのことです。
スタックは関数の戻りアドレスや自動変数に使われます。


返信引用
WOODS
 WOODS
(@WOODS)
ゲスト
結合: 22年前
投稿: 9
Topic starter  

axさん、ありがとうございます。

今回ターゲットとしているDLLは、自作のDLLなので教えていただいたAfxLoadLibraryは
使えないということですね・・・・。(T_T)


返信引用
WOODS
 WOODS
(@WOODS)
ゲスト
結合: 22年前
投稿: 9
Topic starter  

WOODSです。

原因がわかりました。
NTでは、DLLの読み込み数に制限があって、そのためにエラーとなっていたようです。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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