//===================================
//MyAlg.h
//===================================
/*
隐示装载的dll
从dll中导出一个类, 使用这个dll中类的可执行代码工程必须和这个dll工程用的是同一编译器
否则这个dll将不可用
*/
class CMyAlg
{
public:
__declspec(dllimport) int Add(int a, int b);
};
//===================================
//MyAlg.cpp
//===================================
#include "MyAlg.h"
int CMyAlg::Add(int a, int b)
{
return (a + b);
}
//===================================
//alg.h
//===================================
/*
显示装载的dll
从dll中导出一人函数和一个变量, 这个不会出现像导出类所碰到的问题, 要以C
风格的型式导出
*/
extern "C" __declspec(dllimport) int Add(int a, int b);
extern "C" __declspec(dllimport) int g_nValue;
//===================================
//test.cpp 测试前面写好的dll
//===================================
#include <stdio.h>
#define EXPLICIT_LOAD
#ifdef EXPLICIT_LOAD //定义了显示方法加载DLL
#include <windows.h>
#endif
#ifdef IMPLICIT_LOAD //定义了隐示方法加载DLL
#include "MyAlg.h"
#include "alg.h"
#pragma comment(lib, "Class.lib") //dll中导出一个类
#pragma comment(lib, "Win32Dll.lib")//dll中导出一个函数和变量
#endif
void main(void)
{
#ifdef IMPLICIT_LOAD
//使用隐示方法加载DLL,可以调用dll中导出的函数、变量和类
CMyAlg alg;
printf("使用隐示方法加载DLL\n");
printf("CMyAlg::Add(%d, %d) = %d, \n", 1, 2, alg.Add(1, + 2));
printf("Add(%d, %d) = %d, g_nValue = %d\n\n", 1, 2, Add(1, 2), g_nValue);
#endif
#ifdef EXPLICIT_LOAD
//使用显示的方法加载DLL,只能调用dll中以C风格导出的函数
printf("使用显示的方法加载DLL\n");
HINSTANCE hIns = LoadLibrary("Win32Dll.dll");
if(hIns = NULL)
{
printf("Load dll failure!\n");
return;
}
typedef int(* pAdd)(int, int);
pAdd pfun = (pAdd)GetProcAddress(hIns, "Add");
printf("pfun(1, 2) = %d, pfun(1,2)\n");
FreeLibrary(hIns);
#endif
getchar();
}