実現したいこと
C/C++の自作ライブラリを用いて計算シミュレーションを行っているのですが特定条件下(自分の展望では追加でdllを読み込んだ時)でライブラリ内の関数の中身が置き換わるようなものを作成したいです。
ざっくりとした質問で申し訳ないのですが、実現するためにはどのような手法を用いるのが良いのかご教授お願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
C++
1#include <iostream> 2 3using func_ptr = int(*)(int,int); 4int func_def(int a, int b){return a + b;} 5int func_dll(int a, int b){return a * b;} 6static func_ptr ptr = func_def; 7 8int func(int a, int b){ 9 return ptr(a, b); 10} 11 12void load(){ 13 ptr = func_dll; 14} 15int main(){ 16 std::cout << func(2, 3) << std::endl; 17 load(); 18 std::cout << func(2, 3) << std::endl; 19}
方法論としては、こんな感じ
もし、DLLをライブラリの機能を使わずに読み込んだ場合もライブラリの機能を書き換えたい
ならば、ライブラリをDLLにし追加DLL読み込み時にライブラリがエクスポートする関数を呼び出して、みたいな感じ
投稿2018/11/08 09:39
総合スコア15149
0
Windowsの場合、DLLを読み込む場合には、明示的リンクと暗黙リンクという方法があります。
https://msdn.microsoft.com/ja-jp/library/253b8k2c.aspx
明示的リンクを利用して、DLLを読むようにすることで、それが正常に読み込めたか否かで置き換え判断が可能です。
ライブラリ内でそれを行う場合は判断できればOKでしょう。
外部でそれを利用する場合には、関数ポインタなどを返却するようにすることで処理の切り替え部分を隠蔽することが可能となります。
投稿2018/11/08 08:42
総合スコア5488
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こんにちは。
普通に考えれば「追加でdllを読み込んだ時」にフラグを立てて、その特定の関数の頭でフラグが立っていたら、そのdllの関数を呼び出すことではないかと思います。
しかし、恐らくそれでは何か問題があるから質問されているのだろうと予想します。
その問題はなんでしょうか? その辺りを具体的に記載すればより的確な回答が返ってきやすくなりますよ。
投稿2018/11/07 13:50
総合スコア23274
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
共通の窓口を別途用意して分岐する、というのが一番簡単です。既存のものをまるごと上書きすることもできなくはないでしょうが、これやるとウイルス対策ソフトが騒ぐような気がします。
投稿2018/11/07 13:12
総合スコア4853
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。