Dll入门范例
来源:互联网 发布:鼎捷软件怎么样 编辑:程序博客网 时间:2024/05/29 12:29
#ifndef _DLL1_H_#define _DLL1_H_#ifndef DLL1_API#define DLL1_API __declspec(dllimport)#endif// 导出函数DLL1_API int add(int a, int b);// 导出类class DLL1_API A{public: int add(int a, int b);};// 导出部分类成员函数 class B{public: DLL1_API int add(int a, int b); void Hello();};#endif
Dll1.cpp
#define DLL1_API __declspec(dllexport)#include "Dll1.h"int add(int a, int b){ return a+b;}int A::add(int a, int b){ return a+b;}int B::add(int a, int b){ return a+b;}void B::Hello(){ return;}
使用范例
#include "..\\Dll1\\Dll1.h"void CTestDlg::OnBnClickedButton1(){ // TODO: Add your control notification handler code here // 测试导出函数 CString cstr; cstr.Format(TEXT("1+3=%d"), add(1, 3)); AfxMessageBox(cstr); // 测试导出类 A a; cstr.Format(TEXT("1+4=%d"), a.add(1, 4)); AfxMessageBox(cstr); // 测试到处部分类成员函数 B b; cstr.Format(TEXT("4+5=%d"), b.add(4, 5)); AfxMessageBox(cstr);}
说明一
***************************************************************
1.在Dll中抛出异常,在调用Dll的程式中是可以catch的.
2.C++编写的动态链接库给C调用,为了不发生名字改编,需加上extern "C"
如:#define DLL_API extern "C" __declspec(dllexport)
但注意,加了extern "C"之后,不发生名字改编的前提是函数采用的是默认的C调用约定,
即__cdecl.若采用__stdcall调用约定,仍然会发生名字改编.
eg. int __stdcall add(int a, int b);
3.int add(int a, int b);
等价于 int __cdecl add(int a, int b);
4.利用dumpbin查看.exe或DLL的导入导出状况
dumpbin -imports xxx.exe或xxx.dll
dumobin -exports xxx.exe或xxx.dll
dumpbin.exe所在的目录: Visual Studio安装目录的VC\bin目录下.
当然更好的方式是使用可视化的工具Depends.exe查看
***************************************************************
说明二
***************************************************************
利用模块文件xxx.def定义DLL导出函数的名字
1.建立xxx.def文件加入工程
2.xxx.def
LIBRARY xxx
EXPORTS
Add=add @ 1
3.cpp File
int add(int a, int b)
{
return a+b;
}
***************************************************************
如何动态加载Dll
// 1.LoadLibraryHINSTANCE hinstLib = LoadLibrary(TEXT("xxx.dll"));if (hinstLib == NULL) // LoadLibrary failed{ // To get extended error information, call GetLastError(). ......}// 2.GetProcAddresstypedef int (*MyProc)(int a, int b);MyProc ProcFunTest = (MyProc)GetProcAddress(hinstLib, "xxx");if (ProcFunTest == NULL) // GetProcAddress failed{ // To get extended error information, call GetLastError(). ......}// 3.Call functionProcFunTest(1, 2);// 4.FreeLibraryFreeLibrary(hinstLib);
- Dll入门范例
- Kernel Dll的范例
- dll的调用、使用范例
- ExcelVBA编程入门范例
- (ExcelVBA编程入门范例)
- Ajax入门范例.
- Ajax入门范例
- SDL入门及范例
- DLL入门
- DLL入门
- DLL入门
- win mobile RDA 入门范例
- Backbone.js简单入门范例
- 编译测试dll的范例出错
- RMI入门之HelloWorld范例学习
- 第一章:执行计划基本知识--范例入门
- Google Guice范例解说之使用入门
- [原创]Win64微软汇编语言入门范例
- IronPython学习一
- Android中layout过程详解
- C#控件一览表
- static的作用
- CWnd与HWND的区别与转换
- Dll入门范例
- 排序(3) -- (直接)插入排序
- Deep Learning(深度学习)学习笔记整理系列之(三)
- cf46d
- 黑马程序员-HTML补充和CSS
- Office 办公软件Word 另类妙用:网页偷偷存
- 不错的日志输入开源项目Log4j
- HDOJ2049(错排)
- Deep Learning(深度学习)学习笔记整理系列之(四)