最简单DLL导出加载示例

为了方便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文件。
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。
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);
}


你可能感兴趣的:(最简单DLL导出加载示例)