
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が使いたいため、詳しい方ご教授願います。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
>他に手続きは必要なのでしょうか?
一応こんな感じです。
extern "C" {
__declspec(dllexport) int Test(int x, int y) { return 0; }
}
関数を上のように定義すると "Test" の名前でエクスポートされます。
__cdecl で問題なければ、このエクスポートの方法がいいでしょう。
extern "C" {
__declspec(dllexport) int __stdcall Test(int x, int y) { return 0; }
}
上のように __stdcall を追加すると、今度は "_Test@8" の名前でエクスポートされます。
@以降は、引数に使用するスタックのサイズだったはずです。
このような名前が嫌いで、__stdcall でないと困る場合はDEFファイルを作ります。
---- project.def ----
LIBRARY project
EXPORTS
Test
---------------------
※↑のTestの前にタブかスペースを入れてください
extern "C" {
int __stdcall Test(int x, int y) { return 0; }
}
プロジェクトのプロパティから、リンカ→入力→モジュール定義ファイル と移動し、project.def と入力して OK します。
project.def の名前は自由です。その中のLIBRARY以降の名前は、作成されるDLLと同じ名前にします。
ビルドすると、"Test" の名前でエクスポートされます。
※説明の為に __stdcall と書きましたが、WINAPI と書いた方がいいと思います。
No.2
- 回答日時:
C#のlongは64ビットで、VC++のlongは32ビットなので、C#からはintと扱って問題ないでしょう。
stringはデフォルトでマルチバイトで渡されるので、それで問題なければそのまま渡せます。
C#のlong,float,doubleは渡した事がなかったりもしますが、C#のlongをVC++の__int64と受け取る以外はそのままいけそうな気がします(役にたたずすいません)。
この回答への補足
その後色々と試した結果、過去に作ったDLLは読めるようになってきたのですが、新しく作っているものが読めません。
もしかしたらDLLの作成方法に問題があるのかもしれません。
現在、win32プロジェクトからDLLを作成しています。
例えば、足し算をする関数を作る場合、test.hには
TEST_API int __stdcall Tasizan(int a,int b);
とし、test.cppには
TEST_API int __stdcall Tasizan(int a,int b)
{
int ans;
ans = a + b;
return ans;
}
としてDLLを作っています。
しかし、これだと前述のようにエントリポイントが見つかりませんとなってしまいます。
他に手続きは必要なのでしょうか?
初心者の質問で本当にすみません。
色々と勉強になりました。
変数のビット数を考慮する必要があるのですね。
これから、色々と試してみたいと思います。
どうもありがとうございました!
No.1
- 回答日時:
DLLが使えるのは間違いないです。
[DllImport("USER32.DLL", EntryPoint="MessageBoxW")]
private static extern bool MBox(
int h,
[MarshalAs(UnmanagedType.LPWStr)] string m,
[MarshalAs(UnmanagedType.LPWStr)] string c,
int type);
MBox(0, "文字列", "タイトル", 0);
あとは、DLLのエントリーポイント名が本当にabcなのかってところでしょう。
私はコマンドラインから、dumpbin /EXPORTS test.dll と確認しています。
ありがとうございます。
試行錯誤した結果、動作するようになりました。
確認方法は初めて知りました。もう少し調べてみたいと思います。
ところで戻値をlongにしていたのですが、これだと正確な値が帰ってこなく、intにした結果うまく動作しました。
stringの場合は手順を踏む必要があると記憶しているのですが、int以外のlong,doubleなども何か手続きが必要なのでしょうか?
(それとも、単にプログラムミスだったのかも。。)
私の愚問に答えていただき、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- フリーソフト cygewf-2.dllがない、と表示され、ダウンロードしたファイルが動作しない 2 2023/03/27 11:05
- ノートパソコン .dllファイルがありませんと表示される 5 2023/04/30 03:03
- Visual Basic(VBA) マクロで最終行を取得したい 4 2023/05/28 12:14
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- Excel(エクセル) excelvbaのwithについて 4 2022/12/19 16:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
int16_t の _t は何?
-
read関数をノンブロッキングで...
-
アスタリスクで正方形
-
【C++】関数ポインタの使い方
-
(int *)の意味
-
未解決の外部シンボル _printf...
-
C++でRPGを作成する際のステー...
-
acceptをalarmでタイムアウトさ...
-
C言語でDxlibを使って3x3の奇数...
-
C言語初心者です、、、お助けく...
-
c言語の問題です
-
C言語で秒単位の数値をコンソー...
-
VBからのDLL呼び出しでエラー発生
-
エラー 添字が付けられた値が、...
-
式は定数値が必要です」という...
-
C言語 エラーの原因がわからな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
C言語 エラーの原因がわからな...
-
(int *)の意味
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
構造体の勉強中です 合計点の高...
-
windows-findstrの正規表現を使...
-
C言語で分からないところがあり...
-
int型の変数値をバイト列として...
-
PowerShellがうまくいかない
-
C言語での奇数の和
-
「{ } で囲むだけ」は正しい?
-
std::set<int> で、ある値が何...
-
実数の整数部,小数部の取得
-
エラー 添字が付けられた値が、...
-
int16_t の _t は何?
おすすめ情報