在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"(。

有人能帮忙解释一下吗?

在C#中导入C++dll时,differenet参数会导致不同的结果

使用此:

//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数组和指针版本。