2011-10-06 20 views
6

C++で書かれた実行中のアプリケーションを別のC#アプリケーションで監視しようとしています。私のC++コードでC#からC++ exe関数を呼び出す

私はAPIを定義している:

_declspec(dllexport) //is this even possible when compiling an .exe? 
int getSomething(); 

は、C#コードからこの関数をコールする方法はありますか?

は、古典的なアプローチの作品はウィル:

[DllImport("myexe.exe", CharSet = CharSet.Auto)] 
public static extern int getSomething(); 
+1

試しましたか? :D –

+1

最初のサブ疑問に答える:はい、実行可能ファイルはエクスポートされた関数を持つことができます。 – GolezTrol

+3

あなたが監視しようとしている "実行中のアプリケーション"にフックしないように、あなた自身のプロセスにモジュールをロードしますが、明確にするためです。これを行うには、何らかの種類のIPCが必要です。 – Yaur

答えて

4

はい、任意のPE実行可能ファイルは、このような機能をエクスポートすることができます。ただ、コンパイラは時々このようなもので、その結果、輸出名をマングルされますことを心に留めておいてください。

[email protected] 

を名前になPEInfoなどのツールの中に、実行可能ファイルをロードすることでOKであることを確認することができます。

DLLの関数とまったく同じ方法で呼び出すことができます。

更新 OK、P/InvokeコールではなくIPCが必要なようです。 C#で名前付きパイプを使用する方法については、this pageを参照してください。 hereは、C++で名前付きパイプを使用する方法の情報を探すのに最適な場所です。

+0

呼び出された関数はどのスレッドで実行されますか? –

+0

呼び出し元のスレッド。 – Polynomial

+0

たとえば、set関数を呼び出すと、C++プロセスのそれぞれの変数が変更されますか? –

0

はい、.exeの機能を.dllから正確にエクスポートすることができます。表示方法は正しい方法です。

いいえ、.dllの関数を読み込んでも、.dllを使って他のプロセスとやり取りできないように、既存のプロセスとやりとりすることはできません。

関連する問題