【发布时间】:2011-05-08 15:49:12
【问题描述】:
在我的 C# 代码中,我想导入一个 C++ DLL。我使用 dllimport,它可以很好地处理一些功能。但在一个函数中,我得到了一个 HANDLE,稍后我需要调用另一个函数。
[DllImport("SiUSBXp.dll")]
public static extern int SI_Open(UInt32 deviceNum,ref IntPtr devHandle ); // this function gets the HANDLE
[DllImport("SiUSBXp.dll")]
public static extern int SI_Write([In]IntPtr devHandle, [In, Out] byte[] inputByte, UInt32 size,ref UInt32 bytesWritten); // this function needs the HANDLE
在我的代码中,这些函数是这样调用的:
IntPtr devHandle = new IntPtr();
UInt32 bytesWritten = new UInt32();
byte[] byteArr = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
SI_Open(0, ref devHandle);
SI_Write(devHandle, byteArr, 10, ref bytesWritten);
如果我这样做,我会收到“System.AccessViolationException”。我在这里和互联网上搜索过,但没有找到具体的答案。如何正确使用 IntPtr,使其正常工作? 最好的问候
托比
【问题讨论】:
-
SI_Open 和 SI_Write 的 C++ 函数原型是什么样的?
-
您将字节数组初始化为 10 个元素,但这对于 SI_Write 函数是否足够?
-
SI_STATUS WINAPI SI_Open(DWORD dwDevice, HANDLE* cyHandle);
-
SI_STATUS WINAPI SI_Write(HANDLE cyHandle, LPVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpdwBytesWritten);
-
到字节数组 => 它实际上与 C++ 代码中的“相同”数组一起工作。我也尝试了一些东西 - >我像这样初始化了一个 IntPtr “IntPtr Test = new IntPtr()” - 当我用这个 IntPtr 调用 Write 函数时,它不会抛出异常......所以我实际上认为错误与 IntPtr 有关
标签: c# c++ dllimport handle intptr