フルスクリーンの後処理効果を追加するプログラムがあります。私はプログラムのソースを持っていません(開発者がデバッグシンボルのコピー、.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にリンクできます) 。傍受する必要のある通話に入るには、迂回路を使用しています。全体として、それははるかにうまく機能します。ただし、この質問は依然として興味深い問題です(そして、将来、クレイジーなことをしようとしている他の人にとって役立つことを願っています)。どちらの答えも良いので、どちらを選ぶべきかまだわかりません...