演示vc动态链接库的创建和使用

    技术2022-05-19  35

    /*********************************************************************************  * 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; }


    最新回复(0)