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

时间:2015-05-17 07:15:26

标签: c# c++ dllimport

我试图在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")。

有人可以帮忙解释一下吗?

2 个答案:

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