对于dll的操作,我们可以使用dumpbin查看dll 和lib。
********注意写好dll后 用depends查看导出函数时会发现导出的函数名不是你写的那样出现所谓的乱码入?等*************这就注定dll不能通过显示连接的方式导入。
如果想通过显示连接的方式导入可以为类添加一个友元函数去实现显示连接创建类得对象**************************************
这里对于导出类,我们使用隐式链接;直接看代码;
/** 隐式链接,导入lib是必须的*/ #pragma comment(lib,"tool.lib") //要么自己使用头文件 //extern int add(int a,int b); //_declspec(dllimport) int mul(int a,int b); void CAndroidDialog::OnBnClickedButtonDll() { // TODO: 在此添加控件通知处理程序代码 //隐式调用C++类 Ctool tmp; CString str; str.Format(_T("5-3=%d"),tmp.sub(5,3)); MessageBox(str); str.Format(_T("15/3=%d"),tmp.div(15,3)); MessageBox(str); // int c=add(12,65); CString result; result.Format(_T("%d\n"),c); AfxMessageBox(result); c=mul(2,5); result.Format(_T("%d\n"),c); AfxMessageBox(result); //动态加载 HINSTANCE hInst; hInst=LoadLibrary(_T("tool.dll")); typedef int (*ADDPROC)(int a,int b); ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"?add@@YAHHH@Z"); if(!Add) { MessageBox(_T("获取函数地址失败!")); return ; } str.Format(_T("5+3=%d"),Add(5,3)); MessageBox(str); //通过序号访问 typedef int (*MULPROC)(int a,int b); MULPROC Mul=(MULPROC)GetProcAddress(hInst,reinterpret_cast<LPCSTR>(MAKEINTRESOURCE(6))); if(!Mul) { MessageBox(_T("获取函数地址失败!")); return ; } str.Format(_T("5*3=%d"),Mul(5,3)); MessageBox(str); //访问c++类中成员,dll到处类不能显示链接,要使用隐式调用 //http://blog.csdn.net/l460602540/article/details/7394593 typedef Ctool * (*GetCTool)();//定义函数指针,获取类TestDLL对象 GetCTool getCtool=(GetCTool)GetProcAddress(hInst,"GetCTool"); if(!getCtool) { MessageBox(_T("获取C++类中函数地址失败!")); return ; } Ctool *tool=getCtool(); str.Format(_T("5-3=%d"),tool->sub(5,3)); MessageBox(str); str.Format(_T("15/3=%d"),tool->div(15,3)); MessageBox(str); if(hInst) { FreeLibrary(hInst); } }另外附上dll工程文件;
tool.h
// 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 TOOL_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // TOOL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifdef TOOL_EXPORTS #define TOOL_API /**extern "C"*/ __declspec(dllexport) #else #define TOOL_API /**extern "C"*/ __declspec(dllimport) #endif //删除tool.def文件,项目=》属性=》连接器=》输入=》模块定义文件 // 此类是从 tool.dll 导出的 class TOOL_API Ctool { public: Ctool(void); //可以单独导出类中的函数,导出函数必须是public权限,才可以给其他程序访问 /**TOOL_API*/ int sub(int a,int b); int div(int a,int b); }; extern TOOL_API int ntool; TOOL_API int /**_stdcall */ fntool(void);//这里可以修改调用约定,包括_stdcall(WINAPI),pascal,__cdecl __fastcall TOOL_API int add(int a,int b); TOOL_API int mul(int a,int b); extern "C" TOOL_API Ctool* GetCTool(); //获取类TestDll的对象
// tool.cpp : 定义 DLL 应用程序的导出函数。 // #include "stdafx.h" #include "tool.h" // 这是导出变量的一个示例 TOOL_API int ntool=0; // 这是导出函数的一个示例。 TOOL_API int fntool(void) { return 42; } // 这是已导出类的构造函数。 // 有关类定义的信息,请参阅 tool.h Ctool::Ctool() { return; } int Ctool::sub(int a,int b) { return a-b; } int Ctool::div(int a,int b) { return a/b; } TOOL_API int add(int a,int b) { return a+b; } TOOL_API int mul(int a,int b) { return a*b; } //常规的dll是不支持类的导出的.只支持c风格的函数的导出.要弄MFC DLL工程才行 extern "C" TOOL_API Ctool *GetCTool() { return new Ctool(); }