C/C++函数原型为:
LMUSB_HANDLE __stdcall InitializeDevice(unsigned short usVID,
unsigned short usPID,
LPGUID lpGUID,
BOOL *pbDriverInstalled);
LMUSB_HANDLE 定义为 typedef void *LMUSB_HANDLE;
LPGUID 定义为 typedef GUID *LPGUID;
GUID 定义为 typedef struct _GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[ 8 ];
} GUID;
C#中重新声明函数为
[DllImport("LMUSBDLL_TEST.dll")]
public static extern Byte[] InitializeDevice(UInt16 usVID, UInt16 usPID, ref GUID lpGUID,
ref bool pbDriverInstalled);
public struct GUID
{
private UInt32 Data1;
private UInt16 Data2;
private UInt16 Data3;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
private Byte[] Data4; public GUID(UInt32 DT1, UInt16 DT2, UInt16 DT3, Byte []DA4)
{
this.Data1 = DT1;
this.Data2 = DT2;
this.Data3 = DT3;
this.Data4 = DA4;
}
}调用如下:
static Byte[] DA4_INITIAL = { 0xB7, 0x72, 0xb3, 0xAF, 0x2B, 0x6F, 0xDE, 0x1C };
static GUID GUID_DEVINTERFACE_STELLARIS_BULK = new GUID(0x6E45736A, 0x2B1B, 0x4078, DA4_INITIAL);Byte []hUSB;
bool bDriverInstalled = false;
hUSB = InitializeDevice(IT300_BULK_VID, IT300_BULK_PID, ref GUID_DEVINTERFACE_STELLARIS_BULK, ref bDriverInstalled);
编译成功,运行出错如下:未经处理的异常: System.Runtime.InteropServices.MarshalDirectiveException: 无法
封送处理“return value”: 无效的托管/非托管类型组合。
在 ConsoleApplication_CsharpReUseCppDll_Test.Program.InitializeDevice(UInt16
usVID, UInt16 usPID, GUID& lpGUID, Boolean& pbDriverInstalled)
在 ConsoleApplication_CsharpReUseCppDll_Test.Program.Main(String[] args) 位置
E:\IT-300-DXWindowsApplicationRegisted-N1\ConsoleApplication_CsharpReUseCppDll_
Test\Program.cs:行号 165
请按任意键继续. . .
InitializeDevice定义如下:extern "C" __declspec(dllexport) LMUSB_HANDLE PASCAL EXPORT
InitializeDevice(unsigned short usVID,
unsigned short usPID,
LPGUID lpGUID,
BOOL *pbDriverInstalled)
{ return(InitializeDeviceByIndex(usVID, usPID, lpGUID, 0, true,
pbDriverInstalled));
}extern "C" __declspec(dllexport) LMUSB_HANDLE PASCAL EXPORT
InitializeDeviceByIndex(unsigned short usVID,
unsigned short usPID,
LPGUID lpGUID,
DWORD dwIndex,
BOOL bOpenDataEndpoints,
BOOL *pbDriverInstalled){
BOOL bResult;
WINUSB_INTERFACE_HANDLE usbHandle;
USB_INTERFACE_DESCRIPTOR ifaceDescriptor;
WINUSB_PIPE_INFORMATION pipeInfo;
UCHAR speed;
ULONG length;
DWORD dwError;
int i;
tDeviceInfoWinUSB *psDevInfo; if(!lpGUID || !pbDriverInstalled)
{
return(NULL);
}
psDevInfo = (tDeviceInfoWinUSB *)LocalAlloc(LPTR, sizeof(tDeviceInfoWinUSB));
if(!psDevInfo)
{
return(NULL);
}
psDevInfo->deviceHandle = OpenDeviceByIndex(dwIndex, lpGUID);
if(psDevInfo->deviceHandle == INVALID_HANDLE_VALUE)
{
dwError = GetLastError();
*pbDriverInstalled = (dwError == ERROR_DEV_NOT_EXIST) ? FALSE : TRUE;
LocalFree((HLOCAL)psDevInfo);
return(NULL);
} bResult = WinUsb_Initialize(psDevInfo->deviceHandle, &usbHandle);
if(bResult)
{
psDevInfo->winUSBHandle = usbHandle;
length = sizeof(UCHAR);
bResult = WinUsb_QueryDeviceInformation(psDevInfo->winUSBHandle,
DEVICE_SPEED,
&length,
&speed);
} if(bOpenDataEndpoints)
{ if(bResult)
{
psDevInfo->deviceSpeed = speed;
bResult = WinUsb_QueryInterfaceSettings(psDevInfo->winUSBHandle,
0,
&ifaceDescriptor);
} if(bResult)
{
for(i=0;i<ifaceDescriptor.bNumEndpoints;i++)
{
bResult = WinUsb_QueryPipe(psDevInfo->winUSBHandle, 0, (UCHAR) i,
&pipeInfo); if((pipeInfo.PipeType == UsbdPipeTypeBulk) &&
USB_ENDPOINT_DIRECTION_IN(pipeInfo.PipeId))
{
psDevInfo->bulkInPipe = pipeInfo.PipeId;
}
else if((pipeInfo.PipeType == UsbdPipeTypeBulk) &&
USB_ENDPOINT_DIRECTION_OUT(pipeInfo.PipeId))
{
psDevInfo->bulkOutPipe = pipeInfo.PipeId;
}
else
{
SetLastError(ERROR_NOT_SAME_DEVICE);
bResult = FALSE;
break;
}
}
} if(bResult)
{
psDevInfo->hReadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if(psDevInfo->hReadEvent)
{
bResult = true;
}
}
}
else
{
psDevInfo->bulkOutPipe = 0;
psDevInfo->bulkInPipe = 0;
psDevInfo->hReadEvent = NULL;
} if(bResult)
{
return((LMUSB_HANDLE)psDevInfo);
}
else
{
LocalFree((HLOCAL)psDevInfo);
return(NULL);
}
}求教各路大虾,如何解决“无法封送处理“return value”: 无效的托管/非托管类型组合。”的问题?
LMUSB_HANDLE __stdcall InitializeDevice(unsigned short usVID,
unsigned short usPID,
LPGUID lpGUID,
BOOL *pbDriverInstalled);
LMUSB_HANDLE 定义为 typedef void *LMUSB_HANDLE;
LPGUID 定义为 typedef GUID *LPGUID;
GUID 定义为 typedef struct _GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[ 8 ];
} GUID;
C#中重新声明函数为
[DllImport("LMUSBDLL_TEST.dll")]
public static extern Byte[] InitializeDevice(UInt16 usVID, UInt16 usPID, ref GUID lpGUID,
ref bool pbDriverInstalled);
public struct GUID
{
private UInt32 Data1;
private UInt16 Data2;
private UInt16 Data3;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
private Byte[] Data4; public GUID(UInt32 DT1, UInt16 DT2, UInt16 DT3, Byte []DA4)
{
this.Data1 = DT1;
this.Data2 = DT2;
this.Data3 = DT3;
this.Data4 = DA4;
}
}调用如下:
static Byte[] DA4_INITIAL = { 0xB7, 0x72, 0xb3, 0xAF, 0x2B, 0x6F, 0xDE, 0x1C };
static GUID GUID_DEVINTERFACE_STELLARIS_BULK = new GUID(0x6E45736A, 0x2B1B, 0x4078, DA4_INITIAL);Byte []hUSB;
bool bDriverInstalled = false;
hUSB = InitializeDevice(IT300_BULK_VID, IT300_BULK_PID, ref GUID_DEVINTERFACE_STELLARIS_BULK, ref bDriverInstalled);
编译成功,运行出错如下:未经处理的异常: System.Runtime.InteropServices.MarshalDirectiveException: 无法
封送处理“return value”: 无效的托管/非托管类型组合。
在 ConsoleApplication_CsharpReUseCppDll_Test.Program.InitializeDevice(UInt16
usVID, UInt16 usPID, GUID& lpGUID, Boolean& pbDriverInstalled)
在 ConsoleApplication_CsharpReUseCppDll_Test.Program.Main(String[] args) 位置
E:\IT-300-DXWindowsApplicationRegisted-N1\ConsoleApplication_CsharpReUseCppDll_
Test\Program.cs:行号 165
请按任意键继续. . .
InitializeDevice定义如下:extern "C" __declspec(dllexport) LMUSB_HANDLE PASCAL EXPORT
InitializeDevice(unsigned short usVID,
unsigned short usPID,
LPGUID lpGUID,
BOOL *pbDriverInstalled)
{ return(InitializeDeviceByIndex(usVID, usPID, lpGUID, 0, true,
pbDriverInstalled));
}extern "C" __declspec(dllexport) LMUSB_HANDLE PASCAL EXPORT
InitializeDeviceByIndex(unsigned short usVID,
unsigned short usPID,
LPGUID lpGUID,
DWORD dwIndex,
BOOL bOpenDataEndpoints,
BOOL *pbDriverInstalled){
BOOL bResult;
WINUSB_INTERFACE_HANDLE usbHandle;
USB_INTERFACE_DESCRIPTOR ifaceDescriptor;
WINUSB_PIPE_INFORMATION pipeInfo;
UCHAR speed;
ULONG length;
DWORD dwError;
int i;
tDeviceInfoWinUSB *psDevInfo; if(!lpGUID || !pbDriverInstalled)
{
return(NULL);
}
psDevInfo = (tDeviceInfoWinUSB *)LocalAlloc(LPTR, sizeof(tDeviceInfoWinUSB));
if(!psDevInfo)
{
return(NULL);
}
psDevInfo->deviceHandle = OpenDeviceByIndex(dwIndex, lpGUID);
if(psDevInfo->deviceHandle == INVALID_HANDLE_VALUE)
{
dwError = GetLastError();
*pbDriverInstalled = (dwError == ERROR_DEV_NOT_EXIST) ? FALSE : TRUE;
LocalFree((HLOCAL)psDevInfo);
return(NULL);
} bResult = WinUsb_Initialize(psDevInfo->deviceHandle, &usbHandle);
if(bResult)
{
psDevInfo->winUSBHandle = usbHandle;
length = sizeof(UCHAR);
bResult = WinUsb_QueryDeviceInformation(psDevInfo->winUSBHandle,
DEVICE_SPEED,
&length,
&speed);
} if(bOpenDataEndpoints)
{ if(bResult)
{
psDevInfo->deviceSpeed = speed;
bResult = WinUsb_QueryInterfaceSettings(psDevInfo->winUSBHandle,
0,
&ifaceDescriptor);
} if(bResult)
{
for(i=0;i<ifaceDescriptor.bNumEndpoints;i++)
{
bResult = WinUsb_QueryPipe(psDevInfo->winUSBHandle, 0, (UCHAR) i,
&pipeInfo); if((pipeInfo.PipeType == UsbdPipeTypeBulk) &&
USB_ENDPOINT_DIRECTION_IN(pipeInfo.PipeId))
{
psDevInfo->bulkInPipe = pipeInfo.PipeId;
}
else if((pipeInfo.PipeType == UsbdPipeTypeBulk) &&
USB_ENDPOINT_DIRECTION_OUT(pipeInfo.PipeId))
{
psDevInfo->bulkOutPipe = pipeInfo.PipeId;
}
else
{
SetLastError(ERROR_NOT_SAME_DEVICE);
bResult = FALSE;
break;
}
}
} if(bResult)
{
psDevInfo->hReadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if(psDevInfo->hReadEvent)
{
bResult = true;
}
}
}
else
{
psDevInfo->bulkOutPipe = 0;
psDevInfo->bulkInPipe = 0;
psDevInfo->hReadEvent = NULL;
} if(bResult)
{
return((LMUSB_HANDLE)psDevInfo);
}
else
{
LocalFree((HLOCAL)psDevInfo);
return(NULL);
}
}求教各路大虾,如何解决“无法封送处理“return value”: 无效的托管/非托管类型组合。”的问题?
解决方案 »
- C#邮件研究
- C#捡到编程
- C# 套接编程,如何判断客户端已断开连接。
- VS2005的winform程序如何在菜单上面,标题栏下面插入LOGO图片
- 请问如何使用C#实现图像的区域标记及周长和面积的测量?
- 生成数据库中表记录的 insert 语句 遇到的问题 求教
- 如何确保在调用File.Delete("XXX")之前对XXX的写入操作已经结束
- 急!急!急!急!100分求助IP地址问题,怎么让本机“自动获得IP”,获得的ip地址是DHCP指派的???
- 用update更新整个数据表的问题,不提示出错,也没有保存上
- VS.net里面怎么知道所编译的project的总代码行数
- UDP服务端判断客户端相同的问题
- 把C#窗体封装到动态链接库中?
http://topic.csdn.net/u/20110422/14/dadce311-e63f-4b83-93a4-4d0cb6a9f014.html
封送处理“return value”: 无效的托管/非托管类型组合。
在 ConsoleApplication_CsharpReUseCppDll_Test.Program.InitializeDevice(UInt16
usVID, UInt16 usPID, GUID& lpGUID, Boolean& pbDriverInstalled)
在 ConsoleApplication_CsharpReUseCppDll_Test.Program.Main(String[] args) 位置
E:\IT-300-DXWindowsApplicationRegisted-N1\ConsoleApplication_CsharpReUseCppDll_
Test\Program.cs:行号 165
请按任意键继续. .
为什么??
public static extern Byte[] InitializeDevice(UInt16 usVID, UInt16 usPID, ref GUID lpGUID,
ref bool pbDriverInstalled);
应该是
public static extern IntPtr InitializeDevice(UInt16 usVID, UInt16 usPID, ref GUID lpGUID,
ref bool pbDriverInstalled);再次感谢大虾们的帮助!