c#中怎么访问调用 c++写的dll,含结构体、指针、地址
c#中如何访问调用 c++写的dll,含结构体、指针、地址
最近新遇到一个问题,是关于访问USB芯片的,需要向USB芯片读、写数据。
访问USB驱动的函数是用C++写的,已经生成.DLL文件,该DLL文件在VC中调用正常,但是本人不熟悉C#,在C#中调用总是失败。
C++ DLL中的函数代码如下:
extern "C" int _stdcall DataOut(HANDLE hDevice,BYTE pipenum1, BYTE *data, DWORD &lenBytes)
{
BULK_TRANSFER_CONTROL bulkControl;
bulkControl.pipeNum=pipenum1;
if(!DeviceIoControl (hDevice,
IOCTL_EZUSB_BULK_WRITE,
&bulkControl,
sizeof (BULK_TRANSFER_CONTROL),
data,
1024,
&lenBytes,
NULL))
return 0;
else return 1;
}
在c#中
[DllImport("UsbDll.dll")]
public static extern int EzusbShortdataOut(IntPtr hDevice, uint pipenum1, out byte[] data, Int32 lenBytes);
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 256; i++)
{
data[i] = (byte)i;
}
EzusbShortdataOut(this.Handle, (uint)0x00, out data, (Int32)256);
}
但是多次试验仍然不成功,请指教,小弟不胜感激!
------解决方案--------------------
... out byte[] data, Int32 lenBytes)肯定不对。
C#中的out byte[]是传入一个指针的引用,而不是C++中的byte指针。
C++中的DWORD &lenBytes是引用。
先这样改:
int DataOut(IntPtr hDevice, byte pipenum1, byte[] data, ref int lenBytes);
------解决方案--------------------
IntPtr hDevice我理解为设备的句柄,一般是通过OpenDevice之类获取的,而不是你传入的this.Handle。
this.Handle是窗口的句柄。
------解决方案--------------------
友情up!
------解决方案--------------------
最近新遇到一个问题,是关于访问USB芯片的,需要向USB芯片读、写数据。
访问USB驱动的函数是用C++写的,已经生成.DLL文件,该DLL文件在VC中调用正常,但是本人不熟悉C#,在C#中调用总是失败。
C++ DLL中的函数代码如下:
extern "C" int _stdcall DataOut(HANDLE hDevice,BYTE pipenum1, BYTE *data, DWORD &lenBytes)
{
BULK_TRANSFER_CONTROL bulkControl;
bulkControl.pipeNum=pipenum1;
if(!DeviceIoControl (hDevice,
IOCTL_EZUSB_BULK_WRITE,
&bulkControl,
sizeof (BULK_TRANSFER_CONTROL),
data,
1024,
&lenBytes,
NULL))
return 0;
else return 1;
}
在c#中
[DllImport("UsbDll.dll")]
public static extern int EzusbShortdataOut(IntPtr hDevice, uint pipenum1, out byte[] data, Int32 lenBytes);
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 256; i++)
{
data[i] = (byte)i;
}
EzusbShortdataOut(this.Handle, (uint)0x00, out data, (Int32)256);
}
但是多次试验仍然不成功,请指教,小弟不胜感激!
------解决方案--------------------
... out byte[] data, Int32 lenBytes)肯定不对。
C#中的out byte[]是传入一个指针的引用,而不是C++中的byte指针。
C++中的DWORD &lenBytes是引用。
先这样改:
int DataOut(IntPtr hDevice, byte pipenum1, byte[] data, ref int lenBytes);
------解决方案--------------------
IntPtr hDevice我理解为设备的句柄,一般是通过OpenDevice之类获取的,而不是你传入的this.Handle。
this.Handle是窗口的句柄。
------解决方案--------------------
友情up!
------解决方案--------------------
- C# code
(1)不单要导入dll,还要加入节点。 [DllImport("UsbDll.dll", EntryPoint = "DataOut"))] public static extern int DataOut(IntPtr hDevice, byte pipenum1, byte[] data, ref int lenBytes); (2)IntPtr hDevice理解为设备的句柄,一般是通过OpenDevice之类获取的,而不是你传入的this.Handle。 可能是你要显示Panel控件或其他控件的handle,或者是通过另一个方法初始化设备如OpenDevice之类返回的Handel. (3) 具体的错误提示是什么,请写出来,这样别人才好帮你
------解决方案--------------------
up,mark
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
个人提一点吧,这个前段时间做过一点点
我没有使用byte[],而是使用了StringBuilder以及IntPtr Marshal.AllocCoTaskMem/Marshal.PtrToStringAnsi
因为程序要求尽量不用unsafe的方法^^
参考而已,我那时候做是不知道函数代码的,材料只说是有这个api T.T
至于你是写usb芯片,这个没怎么接触过,只是有点arm的理解。
hDevice应该可以用枚举或者字符串的吧
如果是代表特定设备的话,一般是GUID+名称