C#调用VC写的DLL问题,急,在线等,问题解决,马上结贴 本帖最后由 hjm1980_2007 于 2011-04-15 09:33:09 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自己去查数据类型对照,unsigned char *这个可以用string代替,如果是结构体指针,可以用ref 结构体实例 来表示 其实C#调用C++ 的DLL文件很简单,首先自己建立一个专门用于调用dll文件接口函数的一个类,然后把System.Runtime.InteropServices;命名空间添加到类中,然后按照[DllImport("DSCAMSDK.dll", EntryPoint = "CameraInit", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern tagDS_CAMERA_STATUS CameraInit(dllfun_DS_SNAP_pROC pCallbackFunction, tagDS_RESOLUTION uiResolution, IntPtr hWndDisplay, UInt32 lpThreadparam);的方式进行调用,当然C++和C#的数据类型是不一样的,你得根据dLL文件中函数的源码将C++的数据类型转换为C#的数据类型,网上有很多这方面的资料,如http://hi.baidu.com/%B3%C9%B6%BC%B9%FD%BF%CD/blog/item/c3b9ed897866d6d8fd1f10ae.html 写完这个类类后,在你的项目中就能像调用C#本身的库函数一样调用就行,当然如果dll中有回调函数(传说中的函数指针),你得在C#中用委托来处理。 APi基本函数调用是没有问题,主有些函数类型不知道怎么替换还有指针方面,我为什么贴出这么详细的代码,就是因为有些不知道怎么用C#去实现和替换,所以很想有那位兄弟能我,真的真的非常感谢 参数中没有C++的类对象还行,要是有类对象的话建议还是先用c++包装一层;要是结构体指针的话,首先得拿到c++定义的结构体,然后对应定义C#的结构体,否则也没法调用。 已第一个为例:PLAYSDK_API int WINAPI PlaySDK_SendOneFrame(HANDLE hPlayHandle, unsigned char *frameBuf, int frameLen);——————————————————————[DllImport("DynamicDLL.dll", EntryPoint = "PlaySDK_SendOneFrame")]public int extern PlaySDK_SendOneFrame(IntPtr hwnd,string str,int i)也可以把他写成静态函数 IntPtr hwnd的化传入窗体Handle就是了 谁做过自动生成CAD图纸的程序 远程数据库访问不了sql server2005 des加密的密钥是32位的怎么解密 关于c#中 Dll封装的问题 C#中如何去除一个数字的最高位最低位? <base target ="_self" />是什么意思 C#中如何把结构用SqlDataReader存入再读出来呀? C#如何取得数据编辑框中的图插入word 判断图片里有无深色怎样处理? 用Task代替Thread时,Abort和IsBackground两个属性的处理。。 偶然发现了这个string(char* value)谁知道? 怎样获取gridControl里面的按钮列里面的所有按钮对象
[DllImport("DSCAMSDK.dll", EntryPoint = "CameraInit", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern tagDS_CAMERA_STATUS CameraInit(dllfun_DS_SNAP_pROC pCallbackFunction, tagDS_RESOLUTION uiResolution, IntPtr hWndDisplay, UInt32 lpThreadparam);
的方式进行调用,当然C++和C#的数据类型是不一样的,你得根据dLL文件中函数的源码将C++的数据类型转换为C#的数据类型,网上有很多这方面的资料,如http://hi.baidu.com/%B3%C9%B6%BC%B9%FD%BF%CD/blog/item/c3b9ed897866d6d8fd1f10ae.html 写完这个类类后,在你的项目中就能像调用C#本身的库函数一样调用就行,当然如果dll中有回调函数(传说中的函数指针),你得在C#中用委托来处理。
APi基本函数调用是没有问题,主有些函数类型不知道怎么替换还有指针方面,我为什么贴出这么详细的代码,就是因为有些不知道怎么用C#去实现和替换,所以很想有那位兄弟能我,真的真的非常感谢
PLAYSDK_API int WINAPI PlaySDK_SendOneFrame(HANDLE hPlayHandle, unsigned char *frameBuf, int frameLen);
——————————————————————
[DllImport("DynamicDLL.dll", EntryPoint = "PlaySDK_SendOneFrame")]
public int extern PlaySDK_SendOneFrame(IntPtr hwnd,string str,int i)
也可以把他写成静态函数