/********************************************************************************* * author: hjjdebug * date: 2011 * description: 演示vc动态链接库的创建和使用 *********************************************************************************/ //其中mydll.h 头文件如下 // 供调用者使用 #pragma once int add(int i, int j); // mydll 的动态链接库文件 // mydll.cpp : Defines the entry point for the DLL application. #include "stdafx.h" #ifdef _MANAGED #pragma managed(push, off) #endif _declspec(dllexport) int add(int i, int j); BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } int add(int i, int j) { return i+j; } #ifdef _MANAGED #pragma managed(pop) #endif // mydll.dll 的静态使用 // 主程序如下:使用dll 与使用系统头文件没有不同 // 要想让主程序编译通过,必须要链接mydll.lib, 你需要把mydll.lib copy 到当前工作目录 // 或系统lib 目录, 或自己添加搜索路径, 才能编译通过。 // 运行时,要把mydll.dll copy 到执行文件目录,或系统执行dll 加载路径 #include <iostream> #include "mydll.h" using namespace std; #pragma warning(disable:4996) int main(int argc, char *argv[]) { int ret=add(3,5); cout << "return is " << ret << endl; system("pause"); return 0; } // mydll.dll 的动态使用 // 可以不使用mydll.lib, 采用loadlibrary 加载mydll.dll, getprocaddr 获取导出函数地址 // 测试演示程序如下: #include <windows.h> #include <iostream> using namespace std; // mydll.dll 的动态使用 // 可以不使用mydll.lib, 采用loadlibrary 加载mydll.dll, GetProcAddress 获取导出函数地址 // 测试演示程序如下 // 注意: 当你用动态加载方式时,dll 源文件需加extern "C" { } 导出 c 格式函数名称。 // 否则GetProcAddress 会取不到地址 // 关于怎样将多个导出地址封装成一个单例类,请参见我的另一篇帖子 typedef int (*f_add)(int i, int j); int main(int argc, char *argv[]) { HMODULE hModule = LoadLibrary("mydll.dll"); if(!hModule) { cout << "can't load mydll.dll library!" << endl; return -1; } f_add add=(f_add)GetProcAddress(hModule,"add"); if(!add) { cout << "can't get proc address!" << endl; return -1; } int ret = add(3,5); cout << "ret is "<<ret <<endl; return 0; }