为了方便DLL API导出及加载方法理解,本例提供最简单的C++ DLL示例。
导出方式两种:
- 用def文件方式导出MyAPI1。
- 用__declspec (dllexport)方式导出MyAPI2。__declspec参见http://technet.microsoft.com/zh-cn/subscriptions/dabb5z75。
加载方式两种,采用隐式+显式链接方式。
开发工具VS2005。
1、创建DLL模块
创建DLL模块PureDLL。
Win32->Win32 Console Application。
Application Settings选项,Application type:DLL,Additional options:Empty project。
新建PureDLL.def、PureDLL.cpp文件。
Win32->Win32 Console Application。
Application Settings选项,Application type:DLL,Additional options:Empty project。
新建PureDLL.def、PureDLL.cpp文件。
PureDLL.cpp
#include <iostream>
using namespace std;
void MyAPI1()
{
cout<<"PureDLL::MyAPI1"<<endl;
}
//采用dllexport方式导出API
extern "C" __declspec(dllexport) void MyAPI2();
void MyAPI2()
{
cout<<"PureDLL::MyAPI2"<<endl;
}
PureDLL.def
LIBRARY "PureDLL"
EXPORTS
MyAPI1 @1
2、创建测试程序
PureDLL_Test测试程序
Win32->Win32 Console Application。
Application Settings选项,Application type:Console application。
PureDLL lib库路径要正确设置,对应项Linker->General-> Additional Library Directories。
Win32->Win32 Console Application。
Application Settings选项,Application type:Console application。
PureDLL lib库路径要正确设置,对应项Linker->General-> Additional Library Directories。
PureDLL_Test.cpp
// PureDLL_Test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
//隐式链接
#pragma comment(lib,"PureDLL.lib")
//隐式链接函数声明
void MyAPI1();
extern "C" __declspec(dllimport) void MyAPI2();
//隐式调用
void ImplicitCall();
//显式调用
void ExplicitCall();
int _tmain(int argc, _TCHAR* argv[])
{
ImplicitCall();
ExplicitCall();
return 0;
}
void ImplicitCall()
{
MyAPI1();
MyAPI2();
}
void ExplicitCall()
{
HINSTANCE hDllInstance = LoadLibrary(_T("PureDLL.dll"));
if (!hDllInstance)
{
return;
}
typedef void (*LPFunc)(void);
LPFunc pFuncPtr1 = (LPFunc)GetProcAddress(hDllInstance, "MyAPI1");
pFuncPtr1();
LPFunc pFuncPtr2 = (LPFunc)GetProcAddress(hDllInstance, "MyAPI2");
pFuncPtr2();
FreeLibrary(hDllInstance);
}