导入C+时,不同的参数会导致不同的结果+;C语言中的动态链接库# 我尝试在C++中导入C++中的DLL编码。真正让我感到奇怪和困扰的是:不同的参数计数或C#的类型,我得到的结果也不同。让我详细解释一下
C++中的测试代码:导入C+时,不同的参数会导致不同的结果+;C语言中的动态链接库# 我尝试在C++中导入C++中的DLL编码。真正让我感到奇怪和困扰的是:不同的参数计数或C#的类型,我得到的结果也不同。让我详细解释一下,c#,c++,dllimport,C#,C++,Dllimport,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]; ULO
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#中调用函数:
它运行良好,我可以看到从PC到USB设备的良好数据传输(“AQ”)
但是,如果我在保留另一部分的情况下进行如下修改:
//Modification in C++
FUN_API BOOL WriteUPS(char Command[])
//Modification in C#
public static extern bool WriteUPS(char[] command);
//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(char[] command);
//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);
这样,字符串将自动终止。如果你使用
FUN_API BOOL WriteUPS(char Command[])
然后必须确保字符串的最后一个字符是\0
然后
您复制的字节太多。要复制的正确字节数是strlen(Command)我建议您可以向该方法传递两个参数。一是数据,二是长度。这样,您就可以确切地知道要从参数中复制多少个字符 除此之外,您确定您的命令长度不会超过65吗?您可能不应该修复它,以便发送任何大小的数据
在传递的长度末尾放置“\0”。它适用于字符数组和指针版本。感谢您的帮助。但我不认为这是根本原因。实际上,为了确保这个问题不是来自“memcpy”函数,我在测试代码中没有使用这个函数(您可以再次检查我的代码)。关于这个问题,您还有其他想法吗?您没有显示所有代码。显示一个缩减的最小MCVE,然后我们有一个问题,问题是,实际上,在我的测试中,我没有从参数中复制任何东西。问题是C++中的代码相同,唯一的区别是1。有趣的API BOOL WriteUPS()2。有趣的API BOOL WriteUPS(char-Comamnd[])。请注意,代码中未使用该参数。然后,当我试图用C#调用它们时,使用表达式1。公共静态外部bool WriteUPS();2.公共静态外部bool WriteUPS(char[]命令);对应C++代码。然而,最终的结果是不同的。请帮助您是否尝试将null传递给该方法?尝试此操作,因为这将减少传递可能导致此问题的某些已分配或未分配缓冲区的机会。如果有帮助,请告诉我。是的,我尝试过不向该方法传递任何参数(正如您在FUN_API BOOL WriteUPS()的代码中所看到的)。如果没有参数,它工作得很好。对于char[]或char*,即使我对参数不做任何处理,函数也会出错。我的意思是从C#传递一个空值,看看它是否不同。除此之外,我建议:在代码中放置一个日志条目,以便知道哪里出错。我确信aka缓冲区分配失败了。这个日志应该能让你了解它在哪里断了。