• ベストアンサー

LoadLibraryについて

いつもお世話になっております。 現在、WindowsXP(SP2)、VisualBasic6.0(SP6)を使って開発中です。 他社が作成したソースを解析しているのですが、分からない事があったので教えてください。 hModule = LoadLibrary(strDLLFullPath) として、strDLLFullPathに指定されているDLLを呼び出しているのですが、VBでデバッグしていると、【返り値(hModule)=0】となっています。 ロードに成功すると、アドレス空間に割り振ったDLLのインスタンスハンドルが返って来る筈だから、【0】が帰って来たという事は、ロード出来てないという事ですよね? しかしこのソースをコンパイルして単体のアプリとして動かすと、きちんとハンドルを取得できるのです。 動作環境は同じなのに、なぜこのような違いが生じるのでしょうか? 何か御存知でしたら教えてください。 宜しくお願いします。

  • bou7
  • お礼率69% (51/73)

質問者が選んだベストアンサー

  • ベストアンサー
  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.2

エラー番号(Err.LastDLLError)は確認しましたか? > hModule = LoadLibrary(strDLLFullPath) 「strDLLFullPath」の具体的な内容は? そのDLLって、別のDLLを使っていたりしませんか? だとすると、EXE/DLL/別のDLL/プロジェクトファイルの位置関係(各々どこのフォルダ)は?

bou7
質問者

お礼

ご回答、ありがとうございます。 >そのDLLって、別のDLLを使っていたりしませんか? 御指摘の通り、別のDLLを呼んでいました。 別のDLLも指定したパスに置いたら、解決しました。 ありがとうございました。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

その読み込もうとしている DLLなどの DllMainで呼び出しもとのモジュールを判定しているのかもしれません DLLの利用を限定しているなど制限があるのではないでしょうか # 憶測ですけどDLLを開発に使うためには許可が要るなど... # 開発元または 提供元に確認なさってみてはいかがでしょう

bou7
質問者

お礼

ご回答、ありがとうございます。 使いたいDLLは、開発元からの許可は取っています。 実行アプリにすると使えるので、実行アプリとソースでは、LoadLibraryの動作が異なるのかと思いましたが、単に自分のミスで、動作環境の違いでした。 申し訳ありませんでした。

関連するQ&A

  • LoadLibraryの戻り値(HMODULE)について

    ファイル名の異なる2つのDLLを下記のソースの様 にLoadLibraryしたところA,Bとも同じアドレスが 戻って来てしまいます。これではFreeLibraryにて 開放しようとした時に、おかしな事になってしまう と思うのですが、なぜ同じアドレスが戻ってくるのか 分りません。 あと、A,Bをグローバル変数として宣言 したときに、既に宣言済みですと怒られます。これも よく分りません。何方か理由が分る方ご教授願います。 void CXXX_Dlg::ButtonClick() { // dllファイルロード HMODULE A = ::LoadLibrary("A.DLL"); HMODULE B = ::LoadLibrary("B.DLL"); } 環境:Win2K, VC++.Net 2003 MFC です。 DLLファイルはプロジェクトと同ディレクトリに 入っています。

  • DLL関数を使ったプログラム

     DLL関数を使ったプログラムを動かしたんですが、ERRORが解決できず 困っています。DLLを作成したのはいいのですが、それをLoadLibraryで読み込もうとしても指定したプロシージャが見つからないというエラーになるようです。使用している環境はVisual Studio.NET2003です。  以下はDLLのソースです。 // plug.c // #include <windows.h> #include <stdio.h> __declspec(dllexport) void CALLBACK TestFunc() {    printf("DLLのTestFunc()関数が実行されました。\n"); } これをビルドするとplug.dllとplug.expとplug.libが作成されました。  そしてこれを使用したプログラムが // stab.c // #include <windows.h> #include <stdio.h> typedef void (*TestFunc)(void); void main() {     HMODULE hModule;     DWORD error;     TestFunc funcPointer;     hModule = LoadLibrary(TEXT("plug"));     error = GetLastError();//error値が127     funcPointer = (TestFunc)GetProcAddress(hModule,TEXT("TestFunc"));     funcPointer();     FreeLibrary(hModule);     getchar(); } LoadLibrary関数を使用してアプリのメモリ空間にDLLを読み込もうとしているんですが、ここでハンドルが正確に渡されていないみたいなんです。どうしてこうなるのか分かりません。わかる方いらっしゃったらよろしくお願いします。

  • LoadLibraryでAccess Violation 発生。

    LoadLibraryでAccess Violation 発生。 開発言語はC++ 開発環境はVisual Studio 6.0 です。 exeファイルを作成し、別のマシンでそのexeファイルを動作させたところアプリが落ちてしまいました。 Dependency Walkerでプロファイルしたところ LoadLibraryで"UNLHA32.DLL"を呼び出した所でAccess Violationのエラーが発生しています。 何か原因に心当たりはありますでしょうか? 現象の詳細は以下の通りです。 (1)同じアプリで動くマシンと動かないマシンがある。 (2)OS依存では無い。(同じOSでも動くマシンと動かないマシンがある) (3)UNLHA32.DLLのバージョンは複数で試しており、またDLLが破損している事も無さそう。 (4)ソースコードを少し変更するとアプリが落ちていたマシンでも正常に動くようになる。 例: ○起動しない ---------------------- // UNLHA32.dllを読んでみる m_hUnlha = LoadLibrary( "UNLHA32.dll" ); ---------------------- ○起動する ---------------------- strcmpi("a", "c"); // UNLHA32.dllを読んでみる m_hUnlha = LoadLibrary( "UNLHA32.dll" ); ---------------------- 例の他にLoadLibraryの後のソースに同じ様な変更を加えても正常に動きました。 具体的な原因や対処法など知恵を貸して頂ければ幸いです。

  • libファイル無しでかつLoadLibraryを使わずにロードする方法

    お世話になります。 現在eMbedded VC でソフト開発を行っています。 今Libファイルが無く、ヘッダファイルとdll本体 だけが有るライブラリがあります。 このライブラリのソースはありません。 このライブラリを使用したい場合、LoadLibraryで動的ロードを行えばよいのですが、 どうしても静的に(Libファイルを用いるときのように)ロードを行いたい場合はどのようにすればよいでしょうか? 例えば ・ヘッダとdllからlibファイルを逆生成して使用する方法 やツールについて 等等・・ (原理的に無理な場合はそのようなご回答もお待ちしております。) お忙しい中ですが、皆様宜しくお願いいたします。

  • レジストリのエクスポートについて教えてください

    開発環境 :eMbedded Visual C ++ 4.0 (SP4) 動作環境OS :WindowsCE 5.0 以上の環境でレジストリのエクスポートを行いたいのですが、うまく動作しません。 「RegSaveKey()」を使用しているのですが、「RegSaveKey()」を行った時点でエラー(50)が発生しエクスポートできません。 [例] HKEY hRegKey; // レジストリキー DWORD dwDisposition; // -------------------------------- coredll.dll ロード HMODULE hModule = LoadLibrary( _T("coredll.dll") ); // -------------------------------- RegSaveKeyアドレス取得 PFN_REGSAVEKEY pfnRegSaveKey = (PFN_REGSAVEKEY)GetProcAddress( hModule, _T("RegSaveKey") ); if ( NULL == pfnRegSaveKey ) { // -------------------------------- coredll.dll アンマップ FreeLibrary( hModule ); return ; } // -------------------------------- レジストリキー オープン dwRet = RegCreateKeyEx( HKEY_LOCAL_MACHINE, L"SOFTWARE", 0, NULL, REG_OPTION_BACKUP_RESTORE, KEY_ALL_ACCESS, NULL, &hRegKey, &dwDisposition); if( dwRet == ERROR_SUCCESS ) { dwRet = pfnRegSaveKey( hRegKey, L"\\registry.reg", NULL ); } // -------------------------------- coredll.dll アンマップ FreeLibrary( hModule ); // -------------------------------- レジストリキー クローズ RegCloseKey(hRegKey); Windows CEでのレジストリ関係をいろいろ調べたのですが解決できませんでした。詳しい方、アドバイスをよろしくお願いします。

  • dllのロードアドレスについて

    いつもお世話になっております。 現在、アプリケーションのデバッグを行っていて、dllのロードについて不明な点があります。 C++で作成したアプリケーションを起動すると、main関数が呼ばれる前に「アプリケーションが正しく初期化されませんでした(0xc0000005)。」というダイアログボックスが表示され、エラー終了してしまうという現象が発生しています。 但し、このアプリケーションは共通のソースを使用して、条件コンパイルによってGUIの描画部分等が違うといった、複数のアプリを作成することができます。そして、このうちの1つのアプリのみ上記のようなエラーが発生してしまいます。 デバッガによって正常に動くアプリとエラーになるアプリとで、アプリ実行時にロードされるdllの基底アドレスに違いがあるということが分かりました。 ※エラーになる方は、明らかに不正なアドレスにロードされているdllがあります。大抵のdllは0x60000000以降のアドレスですが、0x00300000代にロードされるdllがあります。 そこで、アプリケーションが実行時にロードするdllの基底アドレスが不正になってしまう理由がわかればと思い質問いたしました。 (コンパイル時のリンクオプション等が間違ってしまっているのかと思っています。。。) そもそも、dllがロードされる基底アドレスがどのように決まるものなのかも分からないのですが、どなたか御教授して頂けないでしょうか? 以上、よろしくお願いします。

  • Cabの解凍プログラム

    現在Cabの解凍をするプログラムを作っています。 Cabファイル内のファイル数を取得するために、 int WINAPI CabGetFileCount(LPCSTR szArcFile); というAPIを使おうとしているのですが、 実行中に、デバッグエラーが出ます。 エラーメッセージ The value ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention pointer declared with a different calling convention. ソースは以下のものです。 typedef bool (*TFUNC)(LPCSTR); void 関数名(HWND hWnd) { HINSTANCE hCab=NULL; //cab32.dllのインスタンスハンドル TFUNC DllFunction; int FileCount; //cab32.dllのロード hCab = LoadLibrary("cab32.dll"); if(hCab == NULL) { MessageBox(hWnd,"cab32.dllがありません。","エラー",MB_OK); return; } DllFunction=(TFUNC)GetProcAddress(hCab,"CabGetFileCount"); FileCount = (*DllFunction)("test.cab"); FreeLibrary(hCab); } (DLL使用テストのソース) コンパイラーは"VC++6.0" OSはWin2Kになります。 わかるかたよろしくお願いします。

  • bcc32 GetProcAddress( )

    mydll.cpp と mymain.cpp でDLL内の関数を使うテストを しようとしたところです。 GetProcAddress( ) が失敗します。 どこを直せばいいか教えてください。 ///////// mydll.cpp #include <windows.h> extern "C" __declspec(dllexport) int MyFunc(int, int); int MyFunc(int a, int b){return( a + b );} ///////// mymain.cpp #include <windows.h> typedef int (*FUNCTYPE)(int, int); LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){  HMODULE hModule;  FUNCTYPE ft;  int i;  switch(msg){  case WM_RBUTTONDOWN:   hModule = LoadLibrary("mydll.dll");   ft = (FUNCTYPE)GetProcAddress(hModule, "MyFunc");   if(ft == NULL){    //GetLastError();   }   i = (*ft)(7, 8);  break;  case WM_DESTROY:   PostQuitMessage(0);  break;  default:   return DefWindowProc(hWnd, msg, wParam, lParam);  }  return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int){  ・・・ } ///////// コンパイル C:\bcc32 -WD mydll C:\bcc32 -W mymain mydll.obj ///////// 実行 LoadLibrary( ) は NULL 以外を返しました。 DLL_PROCESS_ATTACH は確認できました。 GetProcAddress( ) は NULL を返しました。

  • C#からCで作成したDLLにステップインできません

    C#からCで作成したDLLにステップインできません。 対策としては以下を行いましたが、ステップインできませんでした。他の対策を知っていたら教えてください! 環境:C#, CともにVS2008, Windows XP professional ・プロジェクトのプロパティのデバッグタブで、「アンマネージのデバッグを~」にチェックを入れる。 ・完全なソースを必要とするのチェックをはずす。 ・C#のexeと同一DIRにdllと、pdbファイルを配置する。 ・全てデバッグでコンパイルする。

  • 初回例外

    VB2010EE 7 pro SP1 フォームを作成して、「デバッグ開始」をすると、最初に 'System.InvalidCastException' の初回例外が Microsoft.VisualBasic.dll で発生しました。 'System.ArgumentException' の初回例外が System.Windows.Forms.dll で発生しました。 とメッセージが出ます。 その後実行していっても特に問題はなさそうなのですが、 この初回例外は何でしょうか? 無視していいものでしょうか?

専門家に質問してみよう