3

重複の可能性:
charポインターをC#からc++関数に渡す

私はこのタイプの問題を抱えています:

私はこの署名を持つc++関数を持っています:

int myfunction ( char* Buffer, int * rotation)

バッファパラメータはスペース文字(0x20 hex)で埋める必要があります

C ++では、これを行うだけで問題を解決できます。

char* buffer = (char *)malloc(256);
memset(buffer,0x20,256);
res = myfunction (buffer, rotation);

この関数をC#から呼び出そうとしています。

これは私のp/invoke宣言です:

[DllImport("mydll.dll", CharSet = CharSet.Ansi, SetLastError = true)]
private static extern unsafe int myfunction (StringBuilder Buffer, int* RotDegree);

私のC#クラスでは、これを実行しようとしました。

StringBuilder buffer = new StringBuilder(256);
buffer.Append(' ', 256);
...
myfunction(buffer, rotation);

しかし、それは機能しません...。

誰でも私を助けることができますか?

ありがとう。

4

2 に答える 2

6

あなたの p/invoke は正しく見えません。(おそらく)Cdecl呼び出し規約を使用する必要があります。を使用しないでくださいSetLastError。安全でないコードは必要ありません。

私は次のように書きます:

[DllImport("mydll.dll", CallingConvention=CallingConvention.Cdecl)]
private static extern int myfunction(StringBuilder Buffer, ref int RotDegree);

次に、次のように呼び出します。

StringBuilder buffer = new StringBuilder(new String(' ', 256));
int rotation = ...;
int retVal = myfunction(buffer, ref rotation);

デフォルトなCharSetので指定しませんでした。Ansi

于 2012-12-21T16:20:58.897 に答える
0

参照で渡すようrotationにしてください。の署名を編集する必要がある場合もありますmyfunction。方法がうまくいくかどうか教えてください。

myfunction (buffer.ToString(), ref rotation);
于 2012-12-21T16:11:54.100 に答える