はじめまして、WOODSと申します。
開発環境:Win-NT4.0 VC6.0SP5 MFC
対象:VC++ラウンジ
DLLをLoadLibray関数で動的に読み込んでいます。
しかし、LoadLibrary関数からNULLが返されるため、
GetLastErrorでエラーコードを見ると
1114(A dynamic link library (DLL) initialization routine failed.)が
返って来ています。
調べたところ、読み込んでいるDLLのコンストラクタまで
たどり着いていない感じなのですが、なにが原因かもわかりません。
このような場合の対応策などアドバイスいただけたら幸いです。
皆様、よろしくお願いいたします。
DllMainがFALSEを返しているんじゃないですか?
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 );
}
読み込む CCTESTDLL.DLL をどこのフォルダに入れました?
DLLをロードするには、プロセスが起動したカレントディレクトリ、
システムフォルダの順番に読み込んでいきます。
VCから起動・デバッグする場合はプロジェクトファイルのある
ところがカレントディレクトリになるので、exeファイルのある
ところにdllを置いてもロードしてくれません。
確実なのは LoadLibrary の引数を絶対パスにしてまうこと
でしょうか。相対パスだと、不確かなところがあります。
joanさん、ありがとうございます。
読込むDLLは、実行環境のカレントに入っています。
現在、VC++からのデバッグで起動させていますが
「メニュー」→「プロジェクト」→「設定」のデバッグTABの「作業用のディレクトリ」に
対象となるDLLパス(この場合実行環境パス)を定義してありますので、
DLLが見つからずにエラーとなっている訳ではなさそうです。
絶対パスにして調査をしてみます。
LoadLibrary関数の引数として絶対パスにしてテストしてみましたが、
結果は変わらずでした。
また調査していて
「プロジェクトの設定」→「リンクTAB」でスタックアロケーションの予約と言うのは
そのアプリケーションで使用できるメモリ確保指定を意味しているのでしょうか?
これを64M指定(値に意図はありませんが、ただDLL内で32Mの
メモリアロケーションをしていることもあって)にしてデバッグをすると
今度は別の場所でCreateThreadで生成できずに、
GetLasttErrorの戻り値8(Not enough storage is available to process this
command.)が返されてしまいます。
底なし沼に入ってしまったようでどんどん身体が沈んでいってます・・・・。(T_T)
AfxLoadLibraryではどうですか?(MFC共有DLLの場合だけど)
>「プロジェクトの設定」→「リンクTAB」でスタックアロケーションの予約と言うのは
>そのアプリケーションで使用できるメモリ確保指定を意味しているのでしょうか?
違います。スタックサイズのことです。
スタックは関数の戻りアドレスや自動変数に使われます。
axさん、ありがとうございます。
今回ターゲットとしているDLLは、自作のDLLなので教えていただいたAfxLoadLibraryは
使えないということですね・・・・。(T_T)
WOODSです。
原因がわかりました。
NTでは、DLLの読み込み数に制限があって、そのためにエラーとなっていたようです。