在C#中导入C++dll时,differenet参数会导致不同的结果
本文关键字:结果 参数 differenet 导入 C++dll | 更新日期: 2023-09-27 17:49:30
我正试图在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"(。
有人能帮忙解释一下吗?
使用此:
//Modification in C++
FUN_API BOOL WriteUPS(char* Command)
//Modification in C#
public static extern bool WriteUPS(string command);
以这种方式,字符串被CCD_ 1自动终止。如果您使用
FUN_API BOOL WriteUPS(char Command[])
那么您必须确保字符串的最后一个字符是'0
然后
memcpy(OutputReport+1,Command,strlen(Command));
您复制的字节太多。要复制的正确字节数是strlen(Command)
我建议您可以向该方法传递两个参数。一是数据,二是长度。通过这种方式,您将确切地知道要从参数中复制多少个字符。
除此之外,你确定你的命令长度不会超过65吗?你可能不应该修复它,这样任何数据大小都可以发送
在传递的长度末尾放一个"''0"。它适用于char数组和指针版本。