bool SendString(const char* pSendStr, long strSize);
这个函数是最简单的函数。文本从呼叫者发送到被呼叫者。 p/invoke 声明如下:
[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
static extern bool SendString(string SendStr, int Len);
请注意,我假设使用 cdecl 调用约定,因为这是 C++ 代码的默认调用约定。还要注意的是long
Windows 上的 C++ 中的宽度为 32 位。所以它匹配int
in C#.
当您调用该函数时,您需要传递字符串及其长度。但是,通常的约定是使用以 null 结尾的字符串,因此不需要长度参数。我会像这样声明非托管函数:
bool SendString(const char* pSendStr);
p/invoke 像这样:
[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
static extern bool SendString(string SendStr);
另一个函数稍微复杂一些。你已经这样声明了:
bool ReadString(char* pReadStr, long& readStrSize);
这里,调用者分配由被调用者填充的缓冲区。您可以使用StringBuilder
文本并让编组器为您完成工作。 p/调用是:
[DllImport(dllname, CallingConvention = CallingConvention.Cdecl)]
static extern bool ReadString(StringBuilder ReadStr, ref int Len);
约定是您提供所提供缓冲区的长度。反过来,该函数会让您知道它写了多少个字符。您可以这样调用该函数:
int len = 256;
StringBuilder ReadStr = new StringBuilder(len);
bool succeeded = ReadString(ReadStr, ref len);
if (succeeded)
{
string str = ReadStr.ToString();
}