一、Dll优点
简单的说,dll有以下几个优点:
1) 节省内存。同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中。如果使用dll,则只在内存中加载一次,所有使用该dll的进程会共享此块内存(当然,像dll中的全局变量这种东西是会被每个进程复制一份的)。
2) 不需编译的软件系统升级,若一个软件系统使用了dll,则该dll被改变(函数名不变)时,系统升级只需要更换此dll即可,不需要重新编译整个系统。事实上,很多软件都是以这种方式升级的。例如我们经常玩的星际、魔兽等游戏也是这样进行版本升级的。
3) Dll库可以供多种编程语言使用,例如用c编写的dll可以在vb中调用。这一点上DLL还做得很不够,因此在dll的基础上发明了COM技术,更好的解决了一系列问题。
二、使用dumpbin命令查看DLL中的函数
Dumpbin命令可以查看一个dll中的输出函数符号名,键入如下命令:
Dumpbin –exports mylib.dll
三、VS2005创建Dll
win32控制台 -> Application type 选择 DLL, 然后点击Finish
1.Mylib.h
#pragma once
extern "C" __declspec(dllexport) void FuncInDll (void);
2.Mylib.CPP
#include "stdafx.h"
#include "MyLib.h"
#include <stdio.h>
extern "C" __declspec(dllexport) void FuncInDll (void)
{
printf("FuncInDll is called!");
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved )
{
return TRUE;
}
3.编译后可生成Mylib.DLL,但是没有MyLib.lib,可以在当前目录新建空文件Mylib.def,然后在工程设置Link->Module Definition File 里输入Mylib.def
四、调用Dll,Dll调用分为2中,一种显示调用,一种隐式调用
新建win32控制台工程TestLib,将Mylib.DLL 和 Mylib.lib 复制到工程目录下
1.显示调用
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
//定义一个函数指针
typedef void (* DLLWITHLIB )();
//定义一个函数指针变量
DLLWITHLIB pfFuncInDll = NULL;
//加载我们的dll
HMODULE hinst= ::LoadLibrary(TEXT("MyLib.dll"));
if (NULL != hinst)
{
printf("dll loaded!\r\n");
}
//找到dll的FuncInDll函数
pfFuncInDll = (DLLWITHLIB)GetProcAddress(hinst, "FuncInDll");
//调用dll里的函数
if (NULL != pfFuncInDll)
{
(*pfFuncInDll)();
}
return 0;
}
2.隐式调用
包含头文件MyLib.h, TestLib.cpp键入如下code
#include "stdafx.h"
#include "Mylib.h"
#pragma comment(lib,"MyLib.lib")
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
FuncInDll();
return 0;
}
|