动态链接库(一)

来源:互联网 发布:黑马程序员 百度云 编辑:程序博客网 时间:2024/06/07 00:26

一.typedef函数指针用法 

1.简单的函数指针的应用

形式1:返回类型(*函数名)(参数表) 
char (*pFun)(int);   
char glFun(int a){ return;}   
void main()   
{   
    pFun = glFun;   
    (*pFun)(2);   
}  

2.使用typedef更直观更方便

形式1:typedef  返回类型(*新类型)(参数表)
typedef char (*PTRFUN)(int);   
PTRFUN pFun;   
char glFun(int a){ return;}   
void main()   
{   
    pFun = glFun;   
    (*pFun)(2);   
}



二.查看动态链接库信息

Dependency Walker (depends.exe) 

三.创建动态链接库

showDlg.h

#include "stdafx.h"#define EXPORT __declspec(dllexport)//导出函数extern "C"  EXPORT  void __stdcall  ShowDialog(char* pText);//extern "C" 防止C++编译器对函数名进行改编

ShowDlg.cpp

// ShowDlg.cpp : Defines the entry point for the DLL application.//#include "stdafx.h"#include "ShowDlg.h"BOOL APIENTRY DllMain( HANDLE hModule,                        DWORD  ul_reason_for_call,                        LPVOID lpReserved ){    return TRUE;}void __stdcall ShowDialog(char* pText){MessageBox(NULL,pText,"提示",0);}


由于_stdcall是一种比较流行的函数调用约定,为了防止发生函数命名改变的情况,可以定义一个.def文件
ShowDlg.def

LIBRARY ShowDlg.dll//动态链接库名称EXPORTSShowDialog = ShowDialog//导出的函数名=动态链接库内部函数名

四.调用动态链接库



1.动态调用



#include "stdafx.h"#include "windows.h"int main(){typedef void(__stdcall * funShowInfo)(char* pchData);//形式1:typedef  返回类型(*新类型)(参数表)HMODULE hMod = LoadLibrary("ShowDlg.dll");//加载if (hMod != NULL)//判断加载是否成功{funShowInfo ShowInfo;//定义函数指针ShowInfo = (funShowInfo)GetProcAddress(hMod, "ShowDialog");//获取动态链接库中的函数if (ShowInfo)//判断函数指针是否为空ShowInfo("皮皮虾的春天");//调用动态链接库中的函数}FreeLibrary(hMod);//卸载动态链接库printf("DLL\n");} 






2.静态调用



需要三个文件,动态链接库文件ShowDlg.dll,动态链接库头文件ShowDlg.h,动态链接库lib文件ShowDlg.lib
#include "stdafx.h"#include "windows.h"#include "ShowDlg.h"#pragma  comment(lib,"ShowDlg.lib")int main(){ShowDialog("静态调用");printf("DLL\n");}



源码


http://download.csdn.net/detail/greless/9853300