C#如何调用C++写的DLL?
//CCD.dll1、intWINAPIOpenDevice(HANDLE*hDevice,WCHAR*name);//打开以name命名的EZ-USB设备;//name...
//CCD.dll
1、int WINAPI OpenDevice(HANDLE *hDevice, WCHAR *name);
//打开以name命名的EZ-USB设备;
//name应满足如下形式:_T("\\\\.\\EZUSB-**"),其中,**为从0到31的数字。
//返回一个整形:0-表示打开失败;
// 1-表示打开成功。
//在VC2005中,可采用如下的形式:
/*
HANDLE hDevice=NULL;
int result=0;
result=OpenDevice(&hDevice,_T("\\\\.\\EZUSB-0"));
if (result==0)
{
...
}
else
{
...
}
*/
以上是工程师给的DLL函数说明,我如何在C#中调用?我的导出方法失败,如下:
//新建一个类的部分代码
class DLLWrapper
{
[DllImport("CCD1.DLL")]
public static extern int OpenDevice(IntPtr hDevice, string DeviceName);
…………
//一个按钮代码
IntPtr hDevice = Marshal.AllocHGlobal(65536);
int result = 0;
private void button1_Click(object sender, EventArgs e)
{
result = DLLWrapper.OpenDevice( hDevice,"\\\\.\\EZUSB-0");
if (result == 0)
{
MessageBox.Show("打开光谱仪失败!");
}
else
{
MessageBox.Show("打开光谱仪成功!");
}
}
} 展开
1、int WINAPI OpenDevice(HANDLE *hDevice, WCHAR *name);
//打开以name命名的EZ-USB设备;
//name应满足如下形式:_T("\\\\.\\EZUSB-**"),其中,**为从0到31的数字。
//返回一个整形:0-表示打开失败;
// 1-表示打开成功。
//在VC2005中,可采用如下的形式:
/*
HANDLE hDevice=NULL;
int result=0;
result=OpenDevice(&hDevice,_T("\\\\.\\EZUSB-0"));
if (result==0)
{
...
}
else
{
...
}
*/
以上是工程师给的DLL函数说明,我如何在C#中调用?我的导出方法失败,如下:
//新建一个类的部分代码
class DLLWrapper
{
[DllImport("CCD1.DLL")]
public static extern int OpenDevice(IntPtr hDevice, string DeviceName);
…………
//一个按钮代码
IntPtr hDevice = Marshal.AllocHGlobal(65536);
int result = 0;
private void button1_Click(object sender, EventArgs e)
{
result = DLLWrapper.OpenDevice( hDevice,"\\\\.\\EZUSB-0");
if (result == 0)
{
MessageBox.Show("打开光谱仪失败!");
}
else
{
MessageBox.Show("打开光谱仪成功!");
}
}
} 展开
展开全部
通过DllImport来调用DLL。
你说的第一种我没有试过
[DllImport("user32.dll")]
1.导入System.Runtime.InteropServices这个名称空间。
该名称空间包含了在C#中调用API的一些必要集合
2.声明在程序中所要用到的API函数
比如下面我用的这个是调用注销计算机的
[DllImport("user32.dll")]
private static extern int ExitWindowsEx(int uFlags, int dwReserved);
"DllImport"属性用来从不可控代码中调用一个方法,它指定了DLL的位置,该DLL中包含调用的外部方法
使用DllImport导入的方法必须使用"extern"修饰符
在代码中的实现是直接使用~
ExitWindowsEx(0, 0);//调用
PS:
DLL应该不是你项目自带的,不需要放在你的项目目录下
DLL为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。DLL文件一般被存放在C:WindowsSystem目录下
一般是指调用系统中已经写好的,当然也可以自己写
你说的第一种我没有试过
[DllImport("user32.dll")]
1.导入System.Runtime.InteropServices这个名称空间。
该名称空间包含了在C#中调用API的一些必要集合
2.声明在程序中所要用到的API函数
比如下面我用的这个是调用注销计算机的
[DllImport("user32.dll")]
private static extern int ExitWindowsEx(int uFlags, int dwReserved);
"DllImport"属性用来从不可控代码中调用一个方法,它指定了DLL的位置,该DLL中包含调用的外部方法
使用DllImport导入的方法必须使用"extern"修饰符
在代码中的实现是直接使用~
ExitWindowsEx(0, 0);//调用
PS:
DLL应该不是你项目自带的,不需要放在你的项目目录下
DLL为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。DLL文件一般被存放在C:WindowsSystem目录下
一般是指调用系统中已经写好的,当然也可以自己写
展开全部
[DllImport("CCD1.DLL")]
public static extern int OpenDevice(IntPtr hDevice, string DeviceName);
*******************************************************************************************************
[DllImport("CCD.DLL")] 名字没搞错吧
public static extern int OpenDevice(IntPtr hDevice, StringBuilder DeviceName); ...换一下试试
或者
public static extern int OpenDevice(IntPtr hDevice, [MarshalAs(UnmanagedType.LPWStr )] string DeviceName);
public static extern int OpenDevice(IntPtr hDevice, string DeviceName);
*******************************************************************************************************
[DllImport("CCD.DLL")] 名字没搞错吧
public static extern int OpenDevice(IntPtr hDevice, StringBuilder DeviceName); ...换一下试试
或者
public static extern int OpenDevice(IntPtr hDevice, [MarshalAs(UnmanagedType.LPWStr )] string DeviceName);
更多追问追答
追问
[MarshalAs(UnmanagedType.LPWStr )]这个是什么一起?请详细解答一下
追答
转化成非托管的指针 C++的代码不受.net托管的
LPWStr ===> wchar_t*===>WCHAR * 其实我对C++也不熟,说的不对的请指正
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询