問題タブ [loadlibrary]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Vista x64 で LoadLibrary が失敗する
XP から Vista に移行した直後に、C# プログラムが機能しないことに気付きました。
これが状況です。C# アプリケーションで使用する C++ dll を作成しました。DLL は XP では正常に動作しましたが、Vista に移行すると、C# では動作しなくなりました。
Delphiでテストしましたが、正常に動作しますが、C# - いいえ。
C# でのチェックを容易にするために、追加のコードを作成しました。
ライブラリでコンパイルされ、Vista の Delphi では動作しますが、C# では動作しないため、C++ ランタイムは必要ありません。
問題はどこにあるのでしょうか?
前もって感謝します。
c++ - LoadLibrary() エラーを適切にキャッチする
私は、Windows XP と Windows Vista の間のすべての Windows バージョンで動作する C++ ソフトウェアに取り組んでいます。私のコードでは、標準ライブラリ ( Qt ライブラリ) にリンクする DLL を開発しました。私のソフトウェアが展開されると、ユーザーが自分のシステムにまったく同じ Qt ビルドを持っていなくても、わずかに異なる構成を持っていることは珍しくありません。機能が無効になっている可能性があります (そのため、Qt ビルドは同じシンボル セットをエクスポートしません)、またはライブラリ バイナリが元のライブラリと互換性がなくなるような方法でライブラリが変更されている可能性もあります。
ある時点で、LoadLibrary() 呼び出しを介して DLL をロードしています。これにより、ユーザーのシステムにある Qt ライブラリが取り込まれます。運が良ければ、彼らの Qt ビルドは私が DLL の開発中に使用したものと互換性があるため、LoadLibrary() は成功します。ただし、Qt ビルドに加えた変更によっては、LoadLibrary() 呼び出しが失敗することがあります。
- "指定されたモジュールが見つかりませんでした。"; これは通常、Qt ビルドが私の Qt ビルドよりも少ない DLL で構成されている場合に発生します。私の DLL は QtFoo.dll などを読み込もうとしますが、この dll は Qt ビルドの一部ではないため、DLL の読み込みは失敗します。
- "指定されたプロシージャが見つかりませんでした。"; これは通常、特定の機能が無効になるように Qt ビルドを変更した場合に発生し、その結果、エクスポートされるシンボルが少なくなります。
私の質問は、これらのエラーを適切にキャッチするにはどうすればよいですか? 右、単純に GetLastError() を使用してから、上記の 2 つのメッセージのいずれかを出力します。ただし、どのモジュールが見つからないか、またはどのプロシージャが欠落しているかがわかれば、はるかに便利です。見つからない DLL にリンクするアプリケーションをエクスプローラーで実行すると、エクスプローラーは「必要なライブラリ blah.dll が見つからないため、アプリケーション foo をロードできませんでした」というメッセージを表示することに気付きました。LoadLibrary() 呼び出しが正確に失敗した理由に関する詳細情報を取得するために利用できる API はありますか?
c++ - 複数のスレッドにまたがる COM で LoadLibrary を使用するにはどうすればよいですか?
マルチスレッド COM アプリケーションの 1 つのスレッドで実行される次のコードがあるとします。
これはすべてうまく機能し、電話をかけることができます
これも機能します!ここで、別のスレッドがやって来て、その foo をロードします。
そして、これもうまく機能します。スレッド 2 で DoSomething を呼び出すことができます。
さて、スレッド 1 が最終的になくなると、問題が発生します。DoSomething のアドレスが評価できなくなっていることを Visual Studio でデバッグしていることに気付きました。最初のスレッドが終了した後、私が呼び出すと:
アクセス違反になります。myFooInThread2 ポインターは引き続き有効ですが、関数ポインターは有効ではありませんでした。この関数ポインタは、LoadLibrary によってロードされた dll にある loadUpFoo への呼び出しによって設定されました。
私の質問は次のとおりです。これが失敗する理由をどこから探し始めますか? 外部 DLL (LoadLibrary でロードする) が foo 構造体に関数ポインタを設定する方法に問題がありますか? それとも、同じライブラリを使用する異なるスレッドと関係がありますか? それとも、このアプリケーションでの COM の使用に関係している可能性があります (最初のスレッドで CoUninitialize を呼び出すと、このメモリまたはライブラリが何らかの形で解放されます)。
それが原因であると思われる場合は、COM セットアップの詳細を提供できます。ありがとう!
編集:これまでの提案に感謝します。foo 構造体は不透明です - 私はその実装についてあまり知りません。foo 構造体は、インポートするヘッダーで宣言されています。明示的に呼び出す参照カウント メソッドはなく、LoadLibrary で読み込まれたライブラリとの相互作用は他にありません。foo 構造体が一部の COM クラスにマップされたメモリではないことは確かですが、前述のように不透明であり、確かなことは言えません。
foo ポインターの有効期間は適切に管理されます (削除されません)。
foo 構造は暗号化ライブラリであるため、これ以上公開することはできません。この時点で、異なるスレッド間および COM アプリケーション内での LoadLibrary の使用に本質的に問題はないと確信しています (また、関数ポインター メモリのクリーンアップは、ライブラリ自体の制御外の何かによって引き起こされていると思います)。 )。
c++ - LoadLibrary と GetProcAddress を使用して WinSock 関数を呼び出す
基本的に、次のようなヘッダー ファイルがあります。
そして、私はこのようなことをします:
ただし、この関数 ((*start)(test, &wsdata) の行) を呼び出すと、次のエラー メッセージが表示されます。
sockets.exe の 0x7868146a で未処理の例外: 0xC0000005: アクセス違反。
呼び出し規約 (__cdecl、WINAPI、WSAAPI) を変更しようとしましたが、常に同じエラー メッセージで終了します。
c++ - C++ での DLL の自動ロードを無効にする
私のシナリオは次のとおりです。私のアプリケーションは特定の DLL に依存しています (リンク中にその lib を使用します)。ただし、アプリケーションの実行時に、LoadLibrary を使用してその DLL を明示的にロードしたいと考えています。ただし、既定では、その DLL が必要なスコープにコードが到達すると、環境は自動的にそれを検索して読み込みます。私はこの動作を無効にしたいと考えており、アプリケーションがその DLL に属するコードを実行する必要があるポイントに達した場合は、自動的にロードするのではなくクラッシュすることを好みます (したがって、DLL はロードされるだけです)。明示的に LoadLibrary を呼び出したためです)。
その間、私は遅延ロード機能を使用しています (したがって、ロード トリガーは、DLL を実際にロードする必要がある場合にのみ発生します)。ただし、DLL がまだロードされていない場合は、アプリケーションがクラッシュすることを望みます。
おそらく、これを達成する方法に精通している人はいますか?
c++ - DLLをエラーなしでロードできるかどうかをテストする方法
私はネイティブのC++アプリケーションを持っています(C ++だけの派手な.Netのものはありません)。ただし、混合モードラッパーdllファイルを介していくつかのオプションの.Netアセンブリを使用します。これらのdllは、遅延ロードを使用してロードされます。混合モードラッパーを使用する場合、ロードするには完全に信頼できる必要があります。したがって、アプリケーションがdllを使用しようとすると、dllが存在しない場合、または信頼されていない場合、すべてがクラッシュして厄介なエラーメッセージが表示されます。
しかし、私の場合、私のメインアプリケーションが関係している限り、これらのdllファイルがなくても動作します。したがって、これらのdllをロードできるかどうかを確認する方法が必要です(ファイルはそこにあり、信頼されています)。これを行うために、try catchブロック内のdll関数の1つにダミー呼び出しを入れて、例外をキャッチしようとしましたが、それでも「modulenotfound」例外でクラッシュします。
また、処理されていない例外フィルターをカスタムフィルターに置き換えようとしましたが、それでもうまくいきませんでした。
また、LoadLibraryメソッドを使用して、最初にdllをロードし、戻り値を確認しようとしました。ただし、その関数は、信頼されていない場合でもDllをロードしますが、メソッド呼び出しを実行しようとするとクラッシュします。
これは未解決の問題だとは思いません。実際にロードしようとせずにdllを使用できるかどうかを確認して、クラッシュするのはどれほど難しいでしょうか。何か案は?
mfc - VC++-MFC : LoadLibrary が無効なハンドル 0x10000000 を返す
LoadLibrary()
APIを使用して test.dll (VC++ - MFC) をロードできません。126 (Module not found)
を使用してエラーコードを取得しますGetLastError()
。依存関係ウォーカーによって、test.dll が "xerces-c_2_7.dll" と "Xalan-C_1_10.dll" に依存していることがわかりました。これらの dll は、exe と同じパスに既に存在していました。それでもエラーが発生します。LoadLibrary()
そこで、返されたハンドルを として使用して、上記の両方のサードパーティの dll をロードしようとしまし0x10000000
た。GetLastError()
私が得ていることによって
無効なハンドル エラーが発生する理由を教えてください。
以下はコード スニペットです。