`
jiagou
  • 浏览: 2525555 次
文章分类
社区版块
存档分类
最新评论

VS2010创建,调用DLL

 
阅读更多

创建DLL工程

新建项目: Visual C++ -> Win32项目,名称:myDLL

下一步,选择DLL,确定。

修改文件名myDLL.cpp改为myDLL.c;不然调用DLL时会出现错误代码127(找不指定程序,就是找不到导出函数ExportMsg)

//#include "stdafx.h"
#include <Windows.h>
#include <tchar.h>

// 使用__declspec(dllexport)声明导出函数
_declspec(dllexport) DWORD ExportMsg(LPTSTR szMsg); 
DWORD ExportMsg(LPTSTR szMsg)
{ 
	MessageBox(NULL,szMsg,_T("由导出函数弹出的消息!"),MB_OK); 
	return 0;
}

编译将生产myDLL.lib和myDLL.dll

调用DLL

三段式:LoadLibrary——GetProcAddress——FreeLibrary;加载库,获取函数地址,释放库。

新建工程:UseDLL

#include "stdafx.h"
#include <iostream>
using namespace std;

#include <Windows.h>
// 指向函数的指针类型
typedef DWORD (*MY_EXPORT_PROC)(LPTSTR);
void Test()
{  
	// 获得Dll模块句柄
	HINSTANCE hinstLib = LoadLibrary(TEXT("myDLLTwo.dll"));  
	// 是否加载成功
	if (hinstLib != NULL) 
	{  
		// 获得指定导出函数的地址
		MY_EXPORT_PROC lpProcAdd = (MY_EXPORT_PROC) GetProcAddress(hinstLib, "ExportMsg");   
		// 判断是否成功
		if ( lpProcAdd !=NULL) 
		{  
			(lpProcAdd) (_T("hello world!!!!")); 
		} 
		// 释放DLL 
		FreeLibrary(hinstLib); 
	} 
}
int main()
{
	Test();  
	return 0;
}

注意:UseDLL.exe文件要与myDLL.dll文件在同一个目录

介绍DLL

DLL(动态链接库):是作为共享函数库的可执行文件。

1.作用:动态链接库是将程序模块化的重要方法,应用程序开发中,需要在多个进程和模块间共用代码的情况下,动态链接库是很好的解决方法。在运行时,只有当exe程序确实要调用这些DLL模块的情况下,系统才会将他们装载到内存空间中。这样可以减少了exe文件的大小和对内存空间的需求,而且这些DLL模块可以同时被多个应用程序使用。

2.内部构成:动态链接库文件中包含若干公用的代码、数据等,供其他模块使用。

3.为什么叫动态链接? 由于程序是在进程创建或程序运行时进行链接的,因此称为“动态链接”,与“静态链接”相对。静态链接是在程序构建时由链接器进行链接,将代码和数据组织在同一个可执行文件中的链接方式。

4.优点:DLL是程序模块化的重要方法,也为程序的复用提供了可能,同一个动态链接库可以被不同的进程加载。DLL中通常包括一些高复用性的代码,WindowsAPI就存在于动态链接库中。采用动态链接库后,同样的代码只需要有一份就可以,每个需要使用到这些功能的程序都使用同一份代码。将不同程序都可能使用到的一系列函数和数据放置在DLL中,可以大大减小应用程序的体积(多个程序共用一个模块),使程序更宜于升级与维护(如果程序需要更新,则只需要修改一个模块,不需要修改所有的程序)。

5.模块:每个可执行程序都可以称作一个模块,DLL文件是模块。exe文件也是模块,称为主模块。

6.特点:

DLL的编写与具体语言和编译器无关。只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如windows提供的系统DLL,在任何开发环境中都能被调用,不在乎C++Delphi

程序员在建立一个DLL文件时,连接器会自动为其生产一个对应的.lib文件,该文件包含了DLL导出函数的符号及序号(并不含有实际的代码)。在应用程序中,.lib文件将作为DLL的替代文件参与编译。

7.扩展:动态链接库技术室windows最重要的实现技术之一,windows的许多新功能,新特性都是通过DLL来实现的。其实windows本身就是由许多DLL组成的,它最基本的三大组成模块式Kernel32.dll(包含了用于内存管理,进程线程调度,系统文件的各个函数),GDI32.dll(主要处理图像方面的操作,如画图,显示文本),User32.dll(主要处理用户界面的操作,如窗口的创建和消息的发送)它们在system32文件夹下。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics