一.C++函数
1.使用VC6新建DLL工程。
2.在头文件中声明函数如:
extern "C" bool ResrveUniStringEX(const wchar_t* soucrStr, wchar_t* destStr, int nSize);
extern "C"是一定要加的,而且不要加_stdcall或者_cdecal。
在源文件中实现这个函数。
3.在Def中声明这个函数:
LIBRARY TestDll_2
EXPORTS
ResrveUniStringEX
Build这个工程,生成TestDll_2.dll和TestDll_2.lib
二.C++ CLR工程
1.使用VC2012新建一个VC++ CLR DLL(类)的工程,在工程中添加lib的引用和头文件:
#include "E:\\WorkSpace_VC_DLL\\TestDll_2\\TestDll_2.h"
#pragma comment(lib, "E:\\WorkSpace_VC_DLL\\TestDll_2\\Debug\\TestDll_2.lib")
可能还需要设置如下:
项目、属性、C/C++、附加包含目录:填写附加头文件(*.h)所在目录 分号间隔多项
项目、属性、链接器、附加库目录:填写附加依赖库(*.lib)所在目录 分号间隔多项
项目、属性、链接器(点前面的+展开)、输入、附加依赖项:填写附加依赖库的名字.lib 空格间隔多项
Build这个工程,生成ManageCPP.dll
三.新建一个C#的工程,在工程中添加引用(项目->右键->添加引用),浏览到CLR工程中生成的DLL,然后在代码中就能直接使用CLR中定义的类了。在程序运行时,还要要将VC6生成的DLL拷贝到exe的目录下,否则会出错
C#传递Delegate给托管C++,然后在托管C++再转换为函数指针:
1.首先在托管C++中进行委托的声明,这是为了让C#代码调用,如:
[UnmanagedFunctionPointer(CallingConvention::Cdecl)]
delegate void ProgressInOCRRecognizeDelegate(UInt16, UInt16, Byte);
2.再在托管C++中进行函数指针的声明,这是为了让C++代码调用:如:
typedef void (__cdecl *pOCRRecognizeCallBackFunc)(UInt16, UInt16, Byte);
3.在托管C++中进行函数声明,如: