teratail header banner
teratail header banner
質問するログイン新規登録
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

4回答

1167閲覧

関数の中身を条件下で入れ替える

kitune915

総合スコア10

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/11/07 12:34

0

0

実現したいこと

C/C++の自作ライブラリを用いて計算シミュレーションを行っているのですが特定条件下(自分の展望では追加でdllを読み込んだ時)でライブラリ内の関数の中身が置き換わるようなものを作成したいです。

ざっくりとした質問で申し訳ないのですが、実現するためにはどのような手法を用いるのが良いのかご教授お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Windowsの場合、DLLを読み込む場合には、明示的リンクと暗黙リンクという方法があります。
https://msdn.microsoft.com/ja-jp/library/253b8k2c.aspx

明示的リンクを利用して、DLLを読むようにすることで、それが正常に読み込めたか否かで置き換え判断が可能です。

ライブラリ内でそれを行う場合は判断できればOKでしょう。
外部でそれを利用する場合には、関数ポインタなどを返却するようにすることで処理の切り替え部分を隠蔽することが可能となります。

投稿2018/11/08 08:42

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

普通に考えれば「追加でdllを読み込んだ時」にフラグを立てて、その特定の関数の頭でフラグが立っていたら、そのdllの関数を呼び出すことではないかと思います。

しかし、恐らくそれでは何か問題があるから質問されているのだろうと予想します。
その問題はなんでしょうか? その辺りを具体的に記載すればより的確な回答が返ってきやすくなりますよ。

投稿2018/11/07 13:50

Chironian

総合スコア23274

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kitune915

2018/11/08 05:59

このようなサイトを使用するのがはじめてなため言葉足らずで申し訳ございませんでした。 具体的な内容としてはある関数をdllの有無で同じ名前の中身だけが異なる関数に置き換えたいということでした。
Chironian

2018/11/08 08:48

う~ん、それだけなら、回答に記載した通りでできますよ。 「追加でdllを読み込む」方法とか? YESならば遅延ロードや動的リンクを調べてみて下さい。 https://msdn.microsoft.com/ja-jp/library/151kt790.aspx http://yamatyuu.net/computer/program/sdk/base/dynamic_dll/index.html ご自身の困っている問題を具体的に言葉で表現するのは意外に難しいのですが、これができないと的確な質問ができないので、頑張ってください。
guest

0

共通の窓口を別途用意して分岐する、というのが一番簡単です。既存のものをまるごと上書きすることもできなくはないでしょうが、これやるとウイルス対策ソフトが騒ぐような気がします。

投稿2018/11/07 13:12

HogeAnimalLover

総合スコア4853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問