C/C++——动态链接库

来源:互联网 发布:和风天气api json解析 编辑:程序博客网 时间:2024/06/14 02:53

创建动态链接库

创建Win32,动态链接库dll的项目Win32Dynamic,在文件中添加如下的函数定义:
[Win32Dynamic.h]

#ifndef __HEAD_DYNAMIC#define __HEAD_DYNAMICint __declspec(dllexport) DynamicAdd( int param1, int param2 );#endif

[Win32Dynamic.cpp]

#include "stdafx.h"#include "Win32Dynamic.h"int DynamicAdd( int param1, int param2 ){    return param1 + param2;}

编译成功以后,可以看到输出目录输出了相应的dll:Win32Dll.dll
可以使用VC6.0自带的Depends查看Win32动态导出库的输出内容。


使用动态链接库

创建Win32控制台,动态链接库测试程序Win32DyanmicTest

#include "stdafx.h"// HINSTANCE 声明需要包含该头文件#include "afx.h"typedef int (* Dynamic_AddFunc)( int, int );int _tmain(int argc, _TCHAR* argv[]){    // 使用动态加载的方式调用    HINSTANCE hDll = ::LoadLibrary( "..\\Win32Dynamic\\Debug\\Win32Dynamic.dll" );    if( hDll )    {        // 从动态库中寻找该函数        Dynamic_AddFunc pFunc = (Dynamic_AddFunc)::GetProcAddress( hDll, "DynamicAdd" );        if( pFunc )        {            printf( "Call DynamicAdd function Dynamic\n" );            printf( "Sum = %d", pFunc( 3, 4 ) );        }        else        {            printf( "Have not found the DynamicAdd function in the dynamic lib\n" );        }    }    return 0;}

测试结果:
这里写图片描述
(奇怪我们并没有在动态链接库中找到该函数)

我们再用Depends来看dll导出的函数
这里写图片描述

函数名Function一栏中我们看到函数名字并不是DynamicAdd,我们修改下我们的GetProcAddress中的参数

\\ ...Dynamic_AddFunc pFunc = (Dynamic_AddFunc)::GetProcAddress( hDll, "?DynamicAdd@@YAHHH@Z" );\\ ...

测试结果:
这里写图片描述
动态库中的函数正确的被调用了


extern “C”修饰

在之前的项目中我们使用extern “C” 对导出函数进行修饰
( C必须大写 )

[Win32Dynamic.h]

#ifndef __HEAD_DYNAMIC#define __HEAD_DYNAMICextern "C" int __declspec(dllexport) DynamicAdd( int param1, int param2 );#endif

[Win32Dynamic.cpp]

#include "stdafx.h"#include "Win32Dynamic.h"extern "C" int DynamicAdd( int param1, int param2 ){    return param1 + param2;}

再用Depends去看dll中的导出函数的时候,发现函数导出名字正常了
这里写图片描述

这个时候执行最早的代码的时候程序就能够找到DynamicAdd函数了。



【返回】

C/C++——编程方式

0 0
原创粉丝点击