
教えてください!
C++のアンマネージドDLLから、複数のファイル名(文字列)をC#に渡したいです。
ステップとしては、
C#から、C++のDLLの関数を最初に呼んで、コールバック関数を渡しています。
次に、DLLからコールバック関数を呼ぶ時に、複数のファイル名を渡したいです。
以下のコードを動かすと、、
C++からは2つ渡しているつもりなのに、
C#ではfilesがサイズ1のString配列として引数に入ってきます。
なぜでしょう?
またどうすればC#から複数受け取れるでしょうか?
教えてください!
C#
public delegate int StringArrayCallback(String[] files);
// C# -> C++
public static int start() {
StringArrayCallback cb = new StringArrayCallback(onReceivedFiles);
int ret = start(cb);
return ret;
}
// C++ -> C# callback
public static int onReceivedFiles(String[] files)
{
return 1;
}
C++コード
typedef int (__stdcall *OnReceivedFilesProc )(char**);
int start( OnReceivedFilesProc callback ) {
std::string message1_ = "from C++1";
std::string message2_ = "from C++2";
char* messages_[2] = { (char*)message1_.c_str(), (char*)message2_.c_str() };
int ret_ = callback(messages_);
std::cout << "[from c#]" << ret_;
}
No.2ベストアンサー
- 回答日時:
もうひとつの手段としてはやはりデリゲートの定義などを変更せざるを得ないのですがマーシャリング手段を指示しましょう
public delegate int StringArrayCallback2([MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr, SizeParamIndex = 1)] string[] files, int n);
とします nには配列の個数が返されます
と定義します
ArraySubType = UnmanagedType.LPStrはDLL側の文字セットにあわせましょう
Unicodeならば ArraySubType = UnmanagedType.LPWStr とします
コールバック関数の定義を
public static int onReceivedFiles2(string[] files, int n)
{
return 1;
}
といった具合にしてやれば 引数files配列は要素n個として認識されます
下記参考URLなども熟読してましょう
参考URL:http://msdn.microsoft.com/ja-jp/library/z6cfh6e6 …
No.1
- 回答日時:
この方法だと無理がありそうです
C++側からは messages_ ポインタと strngをいくつ返したかの int型をを渡す方が良いでしょう
アンマネージのC++側ではマネージコード側の配列をいくつに設定したのかを制御していません
typedef int (__stdcall *OnReceivedFilesProc )(char**, int);
で宣言
int ret_ = callback(messages_, sizeof(message_)/sizeof(message_[0]));
としてコールバックを呼び出す
デリゲートは
public delegate int StringArrayCallback(IntPtr ptr, int nVal);
と宣言
コールバック関数を
public static int onReceivedFiles(IntPtr ptr, int nVal)
{
IntPtr pptr;
string[] files = new string[nVal];
for( int n = 0; n < nval; n++ ) {
// スタックに積まれて来るのはポインタのみなので
pptr = Marshal.ReadIntPtr( ptr, n * 4 );
files[n] = Marshal.PtrToStringAuto( pptr );
}
return 1;
}
といった具合にすればよさそうです
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# char string[100]; int c, i=0; while( (c=getchar()) 2 2022/05/30 21:41
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
C言語 ファイルの指定された行...
-
C言語において、 配列要素をひ...
-
C言語から質問です。
-
char型配列をint型に代入するには
-
背景差分法における正規化距離
-
C言語の課題が出たのですが自力...
-
MFC - ダイアログボックスのPic...
-
C#で構造体の配列を持った構造...
-
コンボボックスでデフォルト値...
-
define で 配列
-
ファイルのデータを構造体に代...
-
10人分の生徒の英語の点数{32,3...
-
関数への構造体の配列の渡し方<...
-
2番目の最大値を求める
-
MFCのCArrayを使った二次元配列
-
c言語
-
eの計算
-
この変数名はわかりにくいですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
C言語 ファイルの指定された行...
-
C言語において、 配列要素をひ...
-
C言語の課題が出たのですが自力...
-
C#で配列が空かを判定するには?
-
構造体のextern方法
-
C言語の配列のコピーについて
-
c言語 構造体
-
C言語 数値の連続入力について
-
MFC - ダイアログボックスのPic...
-
C++DLLからC#へのコールバック...
-
配列のアドレス部
-
要素数・要素の値が未定の配列...
-
C言語についてです 5人のテスト...
-
.NET C++で、構造体の配列をnew...
-
2番目の最大値を求める
おすすめ情報