LoadLibrary() エラーコード 127 質問する

LoadLibrary() エラーコード 127 質問する

LoadLibrary() で問題が発生しており、意味不明なエラーが発生します。

   ::SetLastError(0);

   m_hDll = ::LoadLibrary(szName);

   if (m_hDll == NULL) // Failure to load the DLL.
   {
      DWORD err = GetLastError();
   }

エラーは 127 (「指定されたプロシージャが見つかりませんでした。」) です。LoadLibrary() の呼び出しでは、これは意味をなさないと思います。GetProcaddress() をまだ呼び出していません。

DLL (およびアプリケーション) は両方とも VS++ 2005 SP1 でコンパイルされています。

何が間違っているのでしょうか?

ベストアンサー1

では、ステップごとに説明しましょう:

  1. エラー メッセージは、dll は見つかったが、必要な関数が見つからないことを意味します (Jitter は正しいです)。これは、必要な dll はあるが、正しいバージョンではないことを意味します (Davefiddes は正しいですが、問題は Microsoft ランタイム ライブラリだけでなく、任意の dll である可能性があります。また、少なくともメジャー アップデートでは、Microsoft はランタイム ライブラリに異なる名前を付けているため、その場合は問題にはなりません)。

  2. これは意味をなさない。なぜなら、ロードされる dll から関数が要求されていないからだ。(Adam は正しい。)

  3. したがって、不足している関数は、LoadLibrary コマンドによって明示的にロードされている dll ではなく、最初の dll に必要なため同時に暗黙的にロードされている依存 dll にあると予想されました。(Zebrabox は近かったです。)

  4. 依存 dll は、明示的にロードされる dll のリンカー ステップに含まれるインポート ライブラリまたは .lib ファイルを介して、明示的にロードされるライブラリに「静的に」リンクされる dll です。(「ダイナミック リンク ライブラリ」が「静的にリンク」できることを知らなかったと思います。今はわかります。)

  5. 同じdllの複数のバージョンが異なるフォルダにある場合、これも検索パスの問題である可能性があります(zebraboxが示唆しているように)。dllパスの検索順序はそれ自体複雑な問題です。http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspxオペレーティング システムなどによって異なります。現実的に最も安全なのは、問題が発生する可能性のある dll をすべて exe と同じフォルダーに配置することです。

  6. 依存 DLL には独自の依存 DLL が存在する場合もあり、このためこの問題の解決が非常に困難になることがあります。Depends が役立つ場合もありますが、役に立たない場合は、filemon を試してください。エラー メッセージが表示される前に正常に読み取られた最後の DLL が、間違ったバージョンの DLL です。

おすすめ記事