問題タブ [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.
dll - LoadLibrary() - 「無効なアクセス メモリ ロケーション (998)」
まず、1 つの DLL が正常にロードされたと言ってみましょう。しかし、2 番目の DLL をロードしようとすると、常に「Invalid Access Memory Location (998)」エラーが発生します。
私のプロジェクトでは、DLL には基本的に AI の実行に必要なコードが含まれています。私が作成した別のアプリケーションでは、単純なコードを記述し、舞台裏でソースをコンパイルして「ゲーム」で使用できるようにします。
基本的に、1 つの AI (DLL) をロードして、それが動作するのを見ることができます。次回、新しい AI をロードするコマンドを (個別に別のエンティティに対して) 送信すると、失敗します。プロセス全体で新しい変数を使用しているため、他のモジュールを踏んではいけません。
各 DLL は、基本的に同じ方法で組み込まれているため、ほとんど同じように見えます。(DLL は、一連の構造体と 1 つの関数だけで構成されています)。何らかの形で同じメモリの一部を共有するDLLに共通点があるのではないかと考えていましたが、わかりません。
DLL のソースをお見せしたいのですが、このマシンにはありません。
アイデアがあれば、事前に感謝します!
-マイケル
編集: 998 エラーの適切な名前は「ERROR_NOACCESS」です。申し訳ありません。
c++ - LoadLibrary API 呼び出しのフック
アプリケーションの作業ディレクトリに存在するものとは異なるバージョンの DLL をロードしたいと考えています。そのためには、LoadLibrary 呼び出しをフックして、アプリケーションが DLL をロードする呼び出しを行ったときに、その DLL の新しいバージョンに透過的に置き換えることができるようにする必要があります。NCodeHook を使用してみましたが、DLL に次のコードがあり、NInjectLib を使用してアプリケーションに挿入しましたが、kernel32.dll のロード中にクラッシュします。これが呼び出しを挿入する正しい方法であるか、または他の代替手段があるかどうか、誰か教えてください。
winapi - OCXファイルのLoadLibraryがWindows7x64で失敗する
古いバージョンのC++Builderで記述されたレガシーWindowsアプリケーション内からhtmlヘルプファイルを開く必要があります。HtmlHelpは、LoadLibraryを介してロードしているHtmlHelp.ocxを介してロードされます。
これは何年も問題なく機能していましたが、Windows7x64では機能しなくなりました。Windows7 x86でも失敗する可能性がありますが、このOSを搭載したコンピューターがないため、現時点では試してみることができません。
次のようにhhctrl.ocxを動的にロードしています。
%SystemRoot%\ System32\hhctrl.ocxがWindows7システムに存在するかどうかを確認しました。
LoadLibraryを介したロードが失敗するのはなぜですか?この問題を回避するにはどうすればよいですか?
編集: GetLastErrorは(ドイツ語で、私はただ翻訳しているだけです)と言います:「ファイルが見つかりませんでした。」しかし、関数をデバッグしたところ、パスは「%SystemRoot%\ System32 \ hhctrl.ocx」であり、ファイルは存在します。
また、2つの答えが64ビットと32ビットの問題の方向を示しているため、私のアプリケーションはC ++ Builder 5でコンパイルされた32ビットの実行可能ファイルであるため、間違えなければ32ビットのプロセスになるはずです。それとも私はそれを仮定するのは間違っていますか?
windows - LoadLibrary静的/グローバルおよびスレッド
次の静的/グローバルを持つDLLがあるとします。
ClassAの実装に加えて、「通常の」ClassBも含まれています。これは、ClassAがまだ構築されていない場合は正しく機能しません(これが、ClassAを静的/グローバルにした理由です)。
Windowsでは、DLLローダーがClassBのコンストラクターの呼び出しでこのDLLをロードすると思いますよね?この時点で、ClassAが構築され、次にClassBの構築が続きます。2番目のスレッドがやって来てClassBを構築する場合、ClassAはすでに構築されているため、構築されません。
さて、私の質問は、ClassBが2つのスレッドによって同時に構築された場合はどうなるかということです。したがって、スレッド1はClassAの構築を開始します。スレッド2は、ClassBのコンストラクターを実行する前に、ClassAが完全に構築されるまで待機しますか?
言い換えると、LoadLibrary()はCriticalSectionを使用して、DLLの静的/グローバルのスレッドセーフな初期化を保証しますか?私の勘は「はい」ですが、いずれかの方法で述べているドキュメントが見つからないようです。
dll - 可変引数に基づいて任意の dll 関数を呼び出す
構造体には次の項目があります:
- DLL 名 (絶対/相対パス)
- DLL 内の関数名
- パラメーターの数
- パラメーターの型と値の配列
この情報を使用して、dll をロードし、関数を呼び出す必要があります。
dll をロードするには、LoadLibrary を使用します。
関数のアドレスを取得するには、GetProcAddress を使用します。
関数を呼び出します。
dll をアンロードするには、FreeLibrary
関数の引数の数は動的であるため、引数を関数に渡す方法がわかりません。
パラメータをdll関数に渡す方法について、誰か詳細を教えてもらえますか?
ありがとう、V Karthick
asp.net - アンマネージdllのLoadLibraryは、ASP.NETアプリケーションでIntPtr.Zeroを返します
LoadLibraryを呼び出して、ASP.NETアプリケーションでDelphidllを読み込もうとしています。私の本番マシンでは(VS統合サーバーを使用して)すべてが正常に機能しますが、宛先サーバーに配置すると、LoadLibraryはIntPtr.Zeroを返します。File.Exists(libraryName)
trueを返します。何が問題になる可能性がありますか?
c++ - C++でLoadLibraryでCOMDLLを使用するにはどうすればよいですか
まず、COMは私にとって黒魔術のようなものです。しかし、私が取り組んでいる1つのプロジェクトでCOMdllを使用する必要があります。
そのため、開発中のDLLがあり、別のCOMDLLで使用できるいくつかの機能が必要です。Depends.exeを使用してCOMDLLを見ると、DllGetClassObject()やその他の関数などのメソッドが表示されますが、関心のある関数はありません。
私はCOMDLL(レガシー)ソースコードにアクセスできますが、それは混乱しているので、内部で何が起こっているのかわからない大きなブラックボックスのようにバイナリでCOMDLLを使用したいと思います。
では、LoadLibraryを使用してコードからCOM DLL関数を呼び出すにはどうすればよいですか?出来ますか?はい、その方法の例を教えていただけますか?
このプロジェクトではVisualStudio6を使用しています。
どうもありがとう!
c++ - 他の DLL に依存するプラグイン DLL
別の (サードパーティ) アプリケーションにプラグインする DLL を作成しています。DLL は別の DLL セットに依存する必要があります (ライセンス上の理由から、静的にリンクすることはできません)。
DLL を任意のディレクトリに「xcopy でデプロイ可能」にしたいと考えています。また、このディレクトリをパスに追加する必要はありません。
通常の方法で DLL をビルドすると、現在のプロセスの隣にある DLL が見つからないため、Windows は DLL のロードを拒否します。
Windows が DLL を見つけやすくするための適切なオプションはありますか?
いくつかの質問に答えるには:
- DLL は C++ で記述されています。
- 追加の DLL は QT-dll です。
- 追加の DLL をプラグイン DLL と同じフォルダに配置したいと考えています。からそのフォルダの名前を取得できます
GetModuleFileName
。 - アプリケーションは Firefox で、DLL は PKCS#11 セキュリティ モジュールです。
- アプリケーションは、DLL へのフル パスを使用して DLL をロードします (プラグインのインストール時にユーザーが指定します)。
- DLL を System32 またはアプリケーションの隣に配置することを要求することは機能しますが、少し面倒であり、アンインストーラーで問題が発生する可能性があります。
LoadLibrary
GetProcAddress
もちろん機能しますが、私の場合は実際には実現可能ではありません。私は、他の DLL で数千とは言わないまでも、数百のメソッドを使用しています。本当に import-libraries を使う必要があります。
SetDllDirectory
DllMainと組み合わせて、遅延ロードされた dll を使用することを考えていました。誰もこのようなことを試しましたか?
dll - 64 ビット アプリケーションに 32 ビット DLL ライブラリをロードする
32 ビット DLL ライブラリ (LoadLibrary と同じ使用法) をロードする方法はありますか? GetProcAddress と共にその関数を使用したいと思います。
WOW を見ましたが、機能を提供していないようです。DependencyWalker などのツールは 64 ビットであっても 32 ビット dll のシンボルを読み取ることができるため、この機能は存在するはずです。
ありがとう