我试图在C#中导入用C ++编码的dll。真正困扰和困扰我的是:C#中的参数计数或类型不同,我得到的结果不同。让我详细解释一下。
C ++中的测试代码:
FUN_API BOOL WriteUPS()
{
//The maximum size of an output report.
const unsigned short int MAXREPORTSIZE = 65;
BOOL bWriteSuccess = FALSE;
DWORD BytesWritten = 0;
CHAR OutputReport[MAXREPORTSIZE];
ULONG Result;
CString strBytesWritten = "";
memset(OutputReport,'\0',MAXREPORTSIZE);
//The first byte is the report number.
OutputReport[0]=0;
//memcpy(OutputReport+1,Command,MAXREPORTSIZE-1);
OutputReport[1]=0x41;
OutputReport[2]=0x51;
Result = WriteFile
(ReadHandle,
OutputReport,
Capabilities.OutputReportByteLength,
&BytesWritten,
(LPOVERLAPPED) &HIDOverlapped);
Result = WaitForSingleObject
(hEventObject,
500);
switch (Result)
{
case WAIT_OBJECT_0:
{
bWriteSuccess = TRUE;
break;
}
case WAIT_TIMEOUT:
{
//Cancel the Write operation.
Result = CancelIo(ReadHandle);
bWriteSuccess = FALSE;
break;
}
default:
{
bWriteSuccess = FALSE;
break;
}
}
ResetEvent(hEventObject);
if(!bWriteSuccess)
return FALSE;
else
return TRUE;
}
在C#中调用函数:
private const string DLLPath = @"C:/Test/USBTest/USBComm.dll";
[DllImport(DLLPath,CharSet=CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern bool WriteUPS();
效果很好,我可以看到从PC到USB设备的良好数据传输(" AQ")。
但是,如果我修改如下,而另一部分仍然存在:
//Modification in C++
FUN_API BOOL WriteUPS(char Command[])
//Modification in C#
public static extern bool WriteUPS(char[] command);
然后我得到了错误数据(不是" AQ")。
同样,如果我修改如下,而另一部分仍然存在:
//Modification in C++
FUN_API BOOL WriteUPS(char* Command)
//Modification in C#
public static extern bool WriteUPS(string command);
然后我得到了一些不同的错误数据(不是" AQ")。
有人可以帮忙解释一下吗?
答案 0 :(得分:0)
使用此:
//Modification in C++
FUN_API BOOL WriteUPS(char* Command)
//Modification in C#
public static extern bool WriteUPS(string command);
以这种方式,字符串\0
自动终止。如果你使用
FUN_API BOOL WriteUPS(char Command[])
然后你必须确保字符串的最后一个字符是\0
然后
memcpy(OutputReport+1,Command,strlen(Command));
你正在复制太多字节。要复制的正确字节数为strlen(Command)
答案 1 :(得分:0)
我建议您可以将两个参数传递给此方法。一个是数据,第二个是长度。这样,您就可以确切地知道要从参数中复制多少个字符。
除此之外,你确定你的命令长度不会超过65?您可能无法修复它以便可以发送任何数据大小
放一个' \ 0'在结束时通过。它适用于char数组和指针版本。