はじめまして。
タイトルの通りですが、AfxLoadLibraryを使用して、DLLのハンドルを取得しようとしています。(取得したハンドルでGetProcAddress関数を使用する為)
ここで、AfxLoadLibraryの戻り値となる、ハンドルがNULL(0x0000)となってしまい、GetProcAddressによる関数ポインタの設定が行えない状況となっています。
FormatMessage関数とGetLastErrorを使用し、原因を調べたところ、「指定されたモジュールが見つかりません」というメッセージとなりました。
AfxLoadLibraryで指定しているDLLについては、Exeファイルと同じフォルダ内に存在し、かつ、名前についても間違っていません。
試しに、別DLLを、上記NGとなるDLLと同様の名前で作成してみたところ、ハンドルの取得に成功したので、EXE側のコーディングミスという所は考えづらいところです。
お手数ですが、他の原因に心あたりがありましたらご教唆願います。
<コーディング(一部抜粋)>
----------------------------------------------------------------
HINSTANCE m_handle_Aaa;
typedef WORD (WINAPI *LPOpenAaa)();
LPOpenAaa lpOpenAaa;
BOOL DllLoad(void)
{
// Load Dll
m_handle_Aaa = AfxLoadLibrary("AaaDLL.dll");
if(m_handle_Aaa < (HINSTANCE)HINSTANCE_ERROR)
{
PutLastError(); // Error Message
return FALSE;
}
// Get Function Pointer
lpOpenAaa = (LPOpenAaa)GetProcAddress( m_handle_Aaa, "OpenAaa");
if(lpOpenAaa == NULL) return FALSE;
・
・
・
----------------------------------------------------------------
No.3
- 回答日時:
パス無しの場合
1. EXEが読み込まれたフォルダ
2. カレントフォルダ
の順に探すみたいですよ … WinXP SP2ですけど
No.2
- 回答日時:
>m_handle_Aaa = AfxLoadLibrary("AaaDLL.dll");
http://msdn.microsoft.com/ja-jp/library/zzk20sxw …
の「セキュリティに関するメモ」より
---
Windows NT 4、Windows 2000、または Windows XP (SP1 以前) でコードを実行する場合は、必ず DLL の完全パス名を指定してください。これらのオペレーティング システムでファイルを読み込むと、最初に現在のディレクトリが検索されます。ファイルにパスが付いていないと、目的のものでないファイルが読み込まれる場合があります。
---
まず
>Exeファイルと同じフォルダ内に存在し
という事であれば、ここは「EXE自身の絶対パス付きファイル名を取得し、その文字列からファイル名を取り除き、DLL名を連結し、DLLの絶対パス付きファイル名を生成」して、それを引数に与える必要があります。
このままでは「プログラムが期待していない、同名の別DLL」をロードする可能性があり、その「同名の別DLL」にエントリポイント関数が存在しなかったり、エントリポイント関数がFALSEを返した場合、AfxLoadLibraryはNULL値を返します。
また「同名の別DLL」が偶然にロード出来てしまった場合、何が起きるかは判りません。
因みに
>m_handle_Aaa = AfxLoadLibrary("AaaDLL.dll");
のような「パス無し」の場合「カレントディレクトリ」が1番最初に検索されます。
この「カレントディレクトリ」は、実行ファイルがある場所とは限りません。
一部のコンパイラでは「実行時の作業ディレクトリ(つまり、実行時のカレントディレクトリ)」を「EXEファイルと別のディレクトリ」に指定する事も可能です。
また、実行ファイルへのショートカットアイコンを作り、そのショートカットアイコンの「作業ディレクトリ」を「実行ファイルがあるフォルダと別のフォルダ」にして、ショートカットアイコン経由で実行ファイルを起動した場合「カレントディレクトリは実行ファイルがあるフォルダと別のフォルダ」になります。
そのような状況で「EXEがあるフォルダが検索パスのリストにない」場合は「EXEがあるフォルダは検索されない」ので「EXEがある場所にDLLを置いても読み込めない」と言う事が起きます。
そうなると「質問者さんのコーディングでは、DLLが読み込めないか、誤って同名の別DLLを読み込んでしまう」事になり、非常に危険です。
つまり
>m_handle_Aaa = AfxLoadLibrary("AaaDLL.dll");
と言う書き方は「セキュリティ上、非常に危険」なのです。
EXE自身の絶対パス付きファイル名を取得するなどし、必ず「(動的に作成した)絶対パス付きファイル名」で指定しましょう。
>試しに、別DLLを、上記NGとなるDLLと同様の名前で作成してみたところ、ハンドルの取得に成功したので、
その「別DLL」は「EXEがあるフォルダから読んだとは限らない」ので、読み込めてしまう可能性があります。
>EXE側のコーディングミスという所は考えづらいところです。
「パス無しでDLLを指定している」と言う、明らかな「EXE側のコーディングミス」です。
解答ありがとうございます。
「セキュリティに関するメモ」参照いたしました。
完全パス指定をしなければならない事については、
認識がありませんでした。
同名の別DLLをロードしている可能性があるようですので
上記を参考に、修正してみます。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Windows 10 IT初心者です! powershellで以下のようなエラーが出ました オブジェクト参照がオブジェクト 1 2023/05/17 11:30
- フリーソフト cygewf-2.dllがない、と表示され、ダウンロードしたファイルが動作しない 2 2023/03/27 11:05
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- C言語・C++・C# いまc言語を独学で勉強しているのですがいまいちわかりません。 https://monozukuri- 3 2023/07/06 18:59
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どんなプログラムを書いても指...
-
FTPでputすると空ファイルが出...
-
windows.hがincludeされない
-
フルパスから最後のディレクト...
-
ExcelVBAでカレントディレクト...
-
C言語を用いたファイルの一括削...
-
fopenで別ディレクトリにファイ...
-
VBAでサブフォルダ内の写真サイ...
-
VBAで自身のファイル名を取得す...
-
VBでフォルダ単位のFTP
-
「UNCパスはサポートされません...
-
Ubuntu テキストファイルをどこ...
-
VBA 探しているFileがないとき...
-
FindFirstFileについて
-
ファイルやディレクトリの存在...
-
圧縮(Zip)について
-
C#でカレントディレクトリの取...
-
セルに入力されたパスでフォル...
-
webアプリケーションでの画像フ...
-
ソフトウェアからオープンされ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フルパスから最後のディレクト...
-
FTPでputすると空ファイルが出...
-
どんなプログラムを書いても指...
-
ExcelVBAでカレントディレクト...
-
マイクラでPythonのプログラミ...
-
windows.hがincludeされない
-
「UNCパスはサポートされません...
-
ファイルやディレクトリの存在...
-
ネットワーク上のコンピュータ...
-
C言語を用いたファイルの一括削...
-
fopenで別ディレクトリにファイ...
-
GetPrivateProfileStringでini...
-
ExcelVBA サーバーの(共有フォ...
-
絶対パスの絶対て英語で何でし...
-
FTPでリモートのファイル一覧取得
-
webアプリケーションでの画像フ...
-
ファイルダイアログのカレント...
-
VBAで自身のファイル名を取得す...
-
AfxLoadLibrary関数で、DLLのハ...
-
Ubuntu テキストファイルをどこ...
おすすめ情報