問題タブ [setdlldirectory]

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.

0 投票する
3 に答える
15006 参照

dll - アプリケーションの起動時にカスタム DLL 検索パスを追加

私は、DLL のロードの問題に対する洗練された解決策を考え出そうと頭を悩ませています。DLL をロードする他の lib ファイルに静的にリンクするアプリケーションがあります。私はDLLを直接ロードしていません。%working_folder%\dlls のようなもの - %working_folder% に数十個 (はい...数十個) の DLL を入れたくない.

検索パス@スタートアップを調整するメインアプリの一部である何かを開発しようとしています。私が直面している問題は、この新しいカスタム DLL パスがシステム検索パスにないことです。アプリを起動すると、必要な DLL が適切な場所にないため、アプリがクラッシュします (STATUS_DLL_NOT_FOUND)。私がやりたいことは、この新しいカスタム DLL フォルダーがプロセス環境変数の検索パスにあるかどうかを @ startup で確認し、そうでない場合は追加することです。問題は、アプリケーションが 1 行のコードを実行する前に、これらすべての DLL を読み込もうとすることです。

これを修正するにはどうすればよいですか? 最初に起動し、環境変数を適切に調整し、CreateProcess を介してメイン アプリを起動するヘルプ アプリを作成することを検討しました。これはうまくいくと確信していますが、開発者にとっては困難です。彼らがメイン アプリをデバッグするとき、最初にヘルパー アプリを起動するつもりはありません。

レジストリ アプリ パス機能を試しましたが、成功しませんでした。以前と同じ鶏と卵の問題。

ここで何ができますか?

0 投票する
1 に答える
266 参照

winapi - GetDllDirectoryによって生成されたあいまいな値にどのように対処できますか?

GetDllDirectoryあいまいな値を生成します。この呼び出しで生成される文字列が空の場合、次のいずれかを意味します。

  • 誰も呼んでいないSetDllDirectory
  • 誰かが渡さNULLれたSetDllDirectory
  • 誰かが空の文字列をに渡しましたSetDllDirectory

最初の2つのケースは私の目的では同等ですが、3番目のケースは問題です。保存/復元コードを記述したい場合(GetDllDirectory「古い」値を保存するために呼び出しSetDllDirectory、一時的に「新しい」値を設定し、後でSetDllDirectory「古い」値を復元するために呼び出す)、他のプログラマーの意図を逆転させるリスクがあります。

他のプログラマーが現在の作業ディレクトリをDLL検索順序にすることを意図していて(つまり、最初の2つの箇条書きの1つが真である場合)、空の文字列をに渡すとSetDllDirectory、現在の作業ディレクトリがDLLの検索順序、他のプログラマーの意図を逆にします。

誰かがこの曖昧さを排除または回避するためのアプローチを提案できますか?

PS DLLの検索順序に現在の作業ディレクトリがあると、セキュリティホールとして解釈される可能性があることを私は知っています。それにもかかわらず、これはデフォルトの動作であり、私のコードはそれを元に戻すことができません。私のコードは、すべての潜在的な呼び出し元の期待と互換性がある必要があります。その多くは大きくて古く、私の制御が及ばないものです。

0 投票する
3 に答える
4811 参照

security - DelphiでWinAPI関数SetDllDirectory()を呼び出す方法は?

http://msdn.microsoft.com/en-us/library/ff919712(VS.85).aspxで説明されているように、現在の作業ディレクトリへのアクセスによって可能になる可能性のある悪意のある DLL の読み込みを防止したいと考えています。

C++ アプリに実装された解決策は、SetDllDirectory("") への WinAPI 呼び出しを行うことでした。これにより、現在の作業ディレクトリが Windows DLL 読み込み検索パスから効果的に削除されます。ただし、SetDllDirectory() 関数が存在しないため、このソリューションは Delphi アプリでは利用できないようです。

SetDllDirectory("") と同じことを行う Delphi の同等の呼び出しはありますか? ありがとう!

0 投票する
1 に答える
346 参照

iis - ISAPI 拡張機能が間違った DLL をロードする

IIS は従来の ISAPI 拡張機能と IIS モジュールをロードします。どちらも同じ名前の DLL を使用しますが、これらの DLL は異なります (異なるバージョンのサードパーティにリンクされています)。これまでのところ問題はないはずです。各コンポーネント (拡張機能とモジュール) は独自のフォルダーにあり、それぞれに独自のバージョンの DLL がありますが、IIS がワーカー プロセスを開始し、拡張機能とモジュールが何らかの形で読み込まれると、拡張機能はモジュールのフォルダーから DLL。モジュールのコードを調べたところ、プロセス全体に影響する SetDllDirectory の使用が見つかりました。出来上がり、これが問題です、と私は言いました。この呼び出しを取り除いた後(私のニーズに合ったDLL検索フラグを使用してLoadLibraryExに置き換えました)、問題は解決しませんでした。最後に、これらの DLL の両方に一意の名前を付けることで、明らかに問題が解決する (または解決しない) ことに気付きました。ただし、それはクリーンでエレガントなソリューションではありません。IIS がこのような奇妙な動作を示す理由を知っている人はいますか?

Win2008、IIS7.5、ISAPI 拡張機能 - ネイティブ、C++、VC2010、IIS モジュール - ネイティブ、C++、VS2010、上記の問題のある DLL - C++/CLI、.NET3.5 サード パーティ アセンブリとリンク。すべてがx64です

0 投票する
1 に答える
618 参照

c++ - SetDllDirectory このスコープでは宣言されていません - Netbeans 7.1

私が書いたコードの1つで SetDllDirectory() を使用していますが、プロジェクトをコンパイルすると次のようなエラーが発生します:

これがコードスニペットです

0 投票する
3 に答える
8096 参照

c++ - DLL 内の SetDllDirectory LoadLibrary

SetDllDirectoryC++ DLL 内で C++とコマンドを使用LoadLibraryして別の DLL をロードできますか? 私は次のようにそれらを使用してみました:

実行可能ファイルが最初の DLL を呼び出し、次に 1 番目の DLL が 2 番目の DLL をロードし、次に 2 番目の DLL が計算を行います...

しかし、実行可能ファイルを実行すると、次のエラー メッセージが表示されます。

このアプリケーションは、異常な方法で終了するようランタイムに要求しました。詳細については、アプリケーション サポート チームにお問い合わせください。

2 番目の DLL は、実行可能ファイルに直接リンクすると正常に動作します。

これは私の実行可能ファイル内のコードです:

これは、最初の DLL 内のコードです。

0 投票する
1 に答える
2359 参照

c++ - Octave をインストールせずに C++ で Octave ライブラリ (DLL など) を使用する (インストール フォルダをコピーするだけ)

私の C++ ソリューションには DLL があります。私の DLL は Octave C++ クラスを使用し、Octave を「組み込み」エンジンとしても使用しています。次の手順 (最初の方法) を使用することで、C++ ソリューションをビルドし、ビルドされた実行可能ファイルを実行して、出力結果をいくつかのテキスト ファイルに問題なく取得できます。

しかし、次の手順 (2 番目の方法) を使用しようとすると、問題が発生します (問題について説明します)。

問題は、2番目の方法を使用すると、インストールフォルダーをそのままにしておく限り、完全に機能することC:\Software\Octave-3.6.1です。つまり、インストール フォルダの名前を変更したり、削除したり、Octave をアンインストールしたりすると、ソリューションは実行可能ファイルをコンパイルしてビルドしますが、実行可能ファイルを実行しても結果は生成されません (結果は一連のテキスト ファイルと出力ファイルは空になります)。どなたか原因と解決策をご存じの方がいらっしゃれば幸いです。ありがとう。