6

フルスクリーンの後処理効果を追加するプログラムがあります。私はプログラムのソースを持っていません(開発者がデバッグシンボルのコピー、.map形式を送ってくれましたが、それは独自のものです)。エフェクトのコードが記述されて機能していますが、問題はありません。

私の問題は今、2つをリンクすることです。

これまでに2つの方法を試しました。

迂回を使用して、元のプログラムのインポートテーブルを変更します。これはうまく機能し、安定していることが保証されていますが、私が話したユーザーはそれに慣れておらず、(アーカイブを抽出する以外に)インストールする必要があり、Detoursでプログラムにパッチを適用することが条件の下で有効かどうか疑問がありますEULAの。したがって、そのオプションはありません。

もう1つのオプションは、従来のDLL置換です。OpenGL(opengl32.dll)をラップしましたが、システムコピーの代わりにDLLをロードするプログラムが必要です(プログラムフォルダーに正しい名前でドロップするだけです。簡単です)。

次に、Cgフレームワークとランタイム(OpenGLに依存)およびその他のいくつかのものをロードするためにDLLが必要です。Cgがロードされると、Cg関数を呼び出すいくつかの関数が呼び出され、スタックオーバーフローや無限ループが発生する傾向があります。Cg DLLをサブディレクトリに含めてもその機能を使用できるようにする必要があります(DLLインポートテーブルがサブディレクトリ内のDLLを指すようにすることが可能かどうかはわかりません)、または動的にリンクする必要があります(これは私がdビルドプロセスを単純化するためだけに、そうしないでください)、システムのファイルを参照するように強制するものです(私のカスタム置換ではありません)。

チェーン全体は次のとおりです。プログラムはDLLA(opengl32.dllという名前)をロードします。DLL AはCg.dllをロードし、動的にsysdir / opengl32.dllにリンクします(GetProcAddress)。DLL Aではなく、sysdir/opengl32.dllも参照するためにCg.dllが必要になりました。

これはどのように行われますか? 編集: GetProcAddressを使用せずにこれを簡単に行うにはどうすればよいですか?他に何も機能しない場合、私はそれにフォールバックするつもりですが、可能であれば、むしろしたくありません。

Edit2: MSDNドキュメントで関数SetDllDirectoryに出くわしました(まったく関係のない検索で)。一見、それは私が必要としているもののように見えます。そうですか、それとも私は誤解していますか?(今すぐテストするためにオフ)

Edit3:少し違うやり方でこの問題を解決しました。OpenGL32.dllを削除する代わりに、DLLの名前をDInput.dllに変更しました。120をはるかに超える関数(プログラム、Cg、およびGLEWの場合)ではなく1つの関数をエクスポートする必要があるという利点があるだけでなく、関数が再び実行されることを心配する必要はありません(通常どおりOpenGLにリンクできます) 。傍受する必要のある通話に入るには、迂回路を使用しています。全体として、それははるかにうまく機能します。ただし、この質問は依然として興味深い問題です(そして、将来、クレイジーなことをしようとしている他の人にとって役立つことを願っています)。どちらの答えも良いので、どちらを選ぶべきかまだわかりません...

4

2 に答える 2

1

SetDllDirectoryはおそらく機能しません。Cg.dllはおそらくOpenGL.dllにリンクしているだけです。OSがCg.dllをロードすると、その名前(yours)でロードされたモジュールがすでに存在することがわかるため、他のコピーを探す代わりに、Cgをその名前にリンクします。つまり、OSが検索を行わないため、SetDllDirectoryが変更する検索順序が機能することはありません。

私はあなたの最善の策は確かにあなたの図書館への再入可能な呼び出しを検出することだろうと思う。1つを検出したら、カスタム処理を行う代わりに、呼び出しを実際のOpenGLライブラリに直接転送します。これは、ライブラリの各関数に対してLoadLibraryを呼び出してからGetProcAddressを呼び出すために参照されます。

于 2010-05-03T20:09:15.133 に答える
1

アクティベーションコンテキストの魔法を使用して、問題の解決を試みることができます。

多くは、システム内のサードパーティコンポーネントにすでにマニフェストがある天候に依存します。これらのマニフェストを改ざんすると、ライセンス違反になる可能性があります。

dllのバージョン管理の問題を解決するために、WindowsXPにはアクティベーションコンテキストと呼ばれるテクノロジがあります。サイドバイサイドアセンブリ、またはアプリケーション分離のような恐ろしいものとしても知られています

小さなスペースに多くの読み取りを要約すると、マニフェストは、アセンブリを記述したり、アセンブリへの依存関係を記述したりできるXMLデータのチャンクです。アセンブリはマニフェストとそのdllです。

これが存在する理由は、アセンブリが単純なdllを取得できるようにするためです。「comctl32.dll」とそのバージョン番号(v6)を使用して、より大きな一意の名前でThingを作成し、単純なdllの複数のバージョンを同じ場所に安全にインストールできるようにします。アセンブリはにインストールすることを目的としていますC:\Windows\WinSxS

マニフェストファイルがアセンブリ内のdllを記述している場合、それはアセンブリマニフェストと呼ばれます。そして、通常、dllとは異なる名前を持っています。

マニフェストファイルがdllまたはexeが使用するアセンブリを記述している場合、それはアプリケーションマニフェストと呼ばれ、通常はRT_MANIFESTリソースとして埋め込まれます-res idが1のEXE、res idが2のDLL、またはディスク上に「appname.exe.manifest」/「dllname.dll.2.manifest」という名前のファイル。アプリケーションマニフェストは、アクティベーションコンテキストと呼ばれるものを定義します。これは基本的に、Windowsが物事を検索する名前空間です。各マニフェストはアクティベーションコンテキストを作成します。各アクティベーションコンテキストには、単純なdll名のアセンブリへのマッピングがあります。

したがって、opengl32.dllファイルを使用してアセンブリを作成、app.exe参照(ローカルopengl32.dll)ファイルのアクティベーションコンテキストを作成すると、残りのすべてのdllが引き続き使用できる(および使用する)可能性があります。名前がcoffに非常に似ているという事実にもかかわらず、システムのopengl32.dllファイル

問題は、アプリケーションマニフェストのres-id(1)は、プロセスのデフォルトのアクティブ化コンテキストを作成するために使用されることを意味します。したがって、独自の明示的なマニフェスト(Cg?)を持たないすべてのdllは、プロセスのデフォルトスペースを検索します。そしてそのopengl32.dllを見つけます

したがって、まだ埋め込まれていないすべてのdllのマニフェストを作成する必要があります。opengl32.dllアセンブリを参照しないようにしてください。これにより、デフォルトの検索順序に戻り、通常のsystem32の場所で見つけることができます。

これは、opengl32.dllがexeのフォルダーに存在できないことを意味します。これは、そのフォルダーがsystem32より前のdllを検索するためです(フックに依存しているという事実)。

アセンブリを検索するときにシステムが取るかなり単純な検索順序によって節約されます。まず、WinSxSで検索します。あなたのOpengl32.dllはそこにありません、そこにインストールすることは難しい問題です。次に、exeのフォルダーでアセンブリの名前のサブフォルダーを検索し、次にexeのフォルダーでアセンブリマニフェストを直接検索します。

これは、「OpenGLHook」のようなアセンブリを作成できることを意味します。フォルダ構造は次のようになります。

\appfolder\
  app.exe
  app.exe.manifest                  - contains a dependentAssembly node to OpenGLHook
  OpenGLHook\OpenGLHook.manifest    - contains a file name=opengl32.dll
  OpenGLHook\opengl32.dll           - your hook dll
  yourimpl.dll                      - your implementation dll that linkgs to cg.dll
  cg.dll                            - cg libraries
  cg.dll.2.manifest                 - a stub manifest you put together to ensure cg
                                      doesnt use the app default activation ctx.

ええと、頑張って?

于 2010-05-03T22:09:46.060 に答える