- ベストアンサー
Cで作成したDLLからC++内で関数を利用する。
jansuzumeの回答
#define DllImport __declspec( dllimport ) #pragma comment(lib, "DLL名") #ifdef __cplusplus extern "C" { #endif DllImport 関数(); ... #ifdef __cplusplus } #endif のようにすれば、C++/C両方で使用可でしょう
関連するQ&A
- Cの関数からC++の関数(DLL)を呼ぶ方法について
C++関数からCの関数を呼ぶには extern "C" を使うのはわかるのですが C関数からC++の関数を呼ぶ方法がわかりません。 『外部参照 1 が未解決』になってリンクが出来ません。 ちなみにC++の関数はDLLで、他のC++関数からは呼ぶことも実行出来ることも 確認済みです。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- CファイルとCPPファイルのDLL作成
CファイルとCPPファイルを同一DLLに取り込むことは可能でしょうか?もし可能であれば実現方法も教えて頂きたいのですが。 現状は別DLLを作成しているのですが、両ファイルを取り込んでビルドすると外部関数宣言をしている箇所がエラーになってしまいます。(extern "C"の箇所が・・・)
- ベストアンサー
- C・C++・C#
- C#からC++のDLLを使いたい時
C#からC++(unmanaged)のDLLを使いたい時、 DLLをどのように参照すればよいのでしょうか。 [DllImport("名前.dll")] extern static double 関数名(); という指定は分かるのですが、 それだけじゃもちろん、 「DLL (名前.dll) を読み込めません。」 ってなりますよね・・・。
- ベストアンサー
- C・C++・C#
- C#から、C++作成dll内の関数を呼び出す方法
C#から、C++で作成したdll内の関数を呼び出す方法は、以下の方法で実現できました。(メッセージボックスで "10" が表示されました) [C++側のヘッダファイル] #ifdef CPPDLL_EXPORTS #define CPPDLL_API __declspec(dllexport) #else #define CPPDLL_API __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ CPPDLL_API int fnCppDll(); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ [C++側のソースファイル] CPPDLL_API int fnCppDll() { return 10; } [C#側] using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsFormsApp1 { public partial class Form1 : Form { [DllImport("CppDll.dll")] public static extern int fnCppDll(); public Form1() { InitializeComponent(); } private void buttonGo_Click(object sender, EventArgs e) { int n = fnCppDll(); MessageBox.Show(n.ToString()); } } } 今回お聞きしたいのは、int型ではなく、C++側で型を定義されたクラスのオブジェクト(の参照)を返す関数を、C#側から呼び出し、それをどうやってC#で受け取るかを教えていただきたいのです。 具体的には以下のように実装してみました。 [C++側のヘッダファイル] #ifdef CPPDLL_EXPORTS #define CPPDLL_API __declspec(dllexport) #else #define CPPDLL_API __declspec(dllimport) #endif class CPPDLL_API CCppDll { public: int data; CCppDll(void); }; #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ CPPDLL_API CCppDll& fnCppDll(); // C#が参照渡しということで、参照を返すようにした。 #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ [C++側のソースファイル] CPPDLL_API CCppDll& fnCppDll() { CCppDll* a = new CCppDll(); return *a; } CCppDll::CCppDll() : data(11) // メンバーは 11 で初期化 { } [C#側] using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsFormsApp1 { // ビルドエラーが起きるないように、とりあえず、C++と同じ(ような)クラスを定義 public class CCppDll { public int data; } public partial class Form1 : Form { [DllImport("CppDll.dll")] public static extern CCppDll fnCppDll(); public Form1() { InitializeComponent(); } private void buttonGo_Click(object sender, EventArgs e) { int n; CCppDll cls = fnCppDll(); // ※ n = cls.data; MessageBox.Show(n.ToString()); } private void buttonCancel_Click(object sender, EventArgs e) { Close(); } } } 実装しながらも、「これじゃあ、ダメだろうな。いかにもダメだな」と思った通り、上の※の部分で以下の例外が発生しました。 ------- 例外(ここから) ------- マネージド デバッグ アシスタント 'FatalExecutionEngineError' : 'ランタイムの重大なエラーが発生しました。エラーのアドレスは 0xcc9ff5a2、スレッド 0x36c8 です。エラー コードは 0xc0000005 です。これは CLR のバグであるか、またはユーザー コードのアンセーフまたは確認不可能な部分にバグがある可能性があります。このバグの一般的な原因には、スタックが壊れる可能性のある COM-interop または PInvoke のユーザー マーシャリング エラーが含まれています。' ------- 例外(ここまで) ------- 明らかに基本的なことが分かっていないことから起因するエラーと思われますが、具体的にどう実装すれば、正常に動きますか。(メッセージボックスで "11" を表示) よろしくお願いします。
- ベストアンサー
- C・C++・C#
- DLL作成について
DLL作成の機会がいろいろ調べているのですが、教えていただきたいことがあります。 1.インポートライブラリについて Windowsで暗黙的リンクでDLLをリンクする場合、 インポートライブラリを利用するようですが、 これは、DLL内のポインタと関数名を紐付けるような 役割だと想定しています。 仮に関数等ヘッダーで公開されている部分以外で DLLを更新した場合、インポートライブラリも 再リンクするような場面があるのでしょうか。 特に再リンクしなくてもDLLの更新が反映されたので・・ 2.DLLのクラスの継承について DLL内に作成したクラスを継承することは不可能ですかね。 DLLが更新された場合、インスタンスのイメージが違うため newやdeleteの処理で当初リンクしたインスタンスのイメージで 行いますよね。
- ベストアンサー
- C・C++・C#
- Cの関数をC++とCのどちらからでも呼べるようにするには?
お世話になります。 環境はVC6.0となります。 C++で作成したプログラムから、Cで作成したDLLを呼び出す場合、DLL側のプロトタイプ宣言に「extern "C"」を付加する必要があると認識していますが、 呼び出し側がC++かC言語が分からない場合、Cで作成するDLLにはどのように記述するのが一般的(標準的)でしょうか? ちなみに調べてみたところ、 以下のように、「__cplusplus」でくくる方法もあるようですが、C++の標準仕様ではないとの記載がありました。 #ifdef __cplusplus extern "C" { #endif int function(int num); int function2(int num); int function3(int num); #ifdef __cplusplus } #endif よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C++の関数をCで呼ぶには??
C++の関数をCで呼ぶには、「extern C」を使用することが有名だと思いますが、これだとC++で記述したソースコードにextern Cを追加することにあると思います。 では、C++のほうはまったく手をつけず、C++の関数をCで呼ぶことは可能なのでしょうか? 知っている方がいましたらよろしくお願い致します。
- ベストアンサー
- C・C++・C#
- C#で実行可能なdllの作成方法
現在、C#でアプリケーションを作成していますが、exe形式ではなくdll形式で実行可能な モジュールを作成したいです。 しかし、単に[STAThread]のMain関数を作ったり、staticコンストラクタを作成しただけでは 起動できません。 どうしたら実行可能なdllを作成できるのでしょうか。 最終的にやりたいことは、C++のCreateRemoteThread()からこのdllを起動することです。 どうぞよろしくお願いします。
- ベストアンサー
- C・C++・C#
- C++で作ったDLLをC#で使うには?
C#でC++で書いたDLLを使いたいと思っていますが、可能でしょうか? 本で調べてみると出来ると思って挑戦しています。 public class Form1 : System.Windows.Forms.Form { [DllImport("test.dll")] public static extern long abc(); ..... と宣言し、使う時には long a = abc(); としています。 しかし、いざデバッグして実行してみると、エントリポイントが見つかりません。と表示されてしまいます。 (そもそもDLLが使えるのならばですが)できればC#でC++のDLLが使いたいため、詳しい方ご教授願います。
- 締切済み
- C・C++・C#
- VS2010でC#のDLLを作成する手順
Visual Studio 2010でVisual C#のコードのDLLを作成したいのですが 簡単なコード例で具体的な操作手順を教えていただけないでしょうか。 (Microsoft Visual Studio 2010、OS WindowXP) Visual C++でDLLを作成する手順については 「チュートリアル: ダイナミック リンク ライブラリの作成と使用 (C++)Visual Studio 2010 」 <http://msdn.microsoft.com/ja-jp/library/ms235636(v=vs.100).aspx> に詳しく手順が記載されていましたが、このVisual C#版が見たいのですが見当たりませんでした。 よろしくお願いします。
- 締切済み
- C・C++・C#