您的位置:首页 > 其它

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

2011-03-04 11:19 429 查看
/*********************************************************************************

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: