分享

dll创建和使用

 酒一壶 2010-03-17

一、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;
}


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多