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);

我没有指定CharSetsinceAnsi是默认值。

于 2012-12-21T16:20:58.897 回答
0

尝试rotation通过引用传递。您可能还需要编辑myfunction. 请让我知道该方法是否有效。

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