您的位置:首页 > 其它

Visual Studio 创建和使用dll的方法

2015-01-20 18:06 267 查看
DLL是一个包含可由多个程序同时使用的代码和数据的库。

DLL文件就是把一些函数导出来,然后在新程序中进行复用的过程。

第一部分:使用Visual Studio 2010进行DLL的制作

生成方法一:

第一步:选择创建win32应用程序

第二步:在弹出的应用程序向导中做出如下选择:



第三步:在头文件添加Demoone.h

代码如下:

#ifndef _Demo_H_
#define _Demo_H_
#ifdef LIBDLL
#define LIBDLL extern "C" _declspec(dllimport)
#else
#define LIBDLL extern "C" _declspec(dllexport)
#endif
LIBDLL int Add(int plus1, int plus2);
#endif


添加Demoone.cpp

代码如下:

#include "Demoone.h"
int Add ( int a , int b )
{
return ( a + b );
}


结构视图如下:



然后点击“生成”下的“生成解决方案”即可



在项目目录下/debug/目录下存在DllDemoone.lib和DllDemoone.dll

生成方法二:

该方法不需要使用_declspec(dllimport)的方式,一二步与上同。

第三步:

Demotwo.h代码如下:

#ifndef _Demo_H_
#define _Demo_H_
extern "C" int Add (int a , int b);
#endif


Demotwo.cpp和上一步骤相同

第四步:

添加def文件:在“添加新建项”中左侧选择“代码”,新建一个模块定义文件,名字随意。它用来创建LIB文件内容如下:

LIBRARY "Dllmaketwo"
EXPORTS
Add @ 1


最终视图如下:



生成解决方案也能得到dll文件。

第二部分:使用dll文件

当我们的程序需要使用DLL时,就需要去加载DLL,在程序中加载DLL有两种方法,分别为加载时动态链接运行时动态链接
在加载时动态链接中,应用程序像调用本地函数一样对导出的DLL函数进行显示调用。要使用加载时动态链接,需要在编译和链接应用程序时提供头文件和导入库文件(.lib)。当这样做的时候,链接器将向系统提供加载DLL所需的信息,并在加载时解析导出的DLL函数的位置;
在运行时动态链接中,应用程序调用LoadLibrary函数或LoadLibraryEx函数以在运行时加载DLL。成功加载DLL后,可以使用GetProcAddress函数获得要调用的导出的DLL函数的地址。在使用运行时动态链接时,不需要使用导入库文件(lib)。
在实际编程时有两种使用DLL的方法,那么到底应该使用那一种呢?在实际开发时,是基于以下几点进行考虑的:
1、启动性能 如果应用程序的初始启动性能很重要,则应使用运行时动态链接;
2、易用性 在加载时动态链接中,导出的DLL函数类似于本地函数,我们可以方便地进行这些函数的调用;
3、应用程序逻辑在运行时动态链接中,应用程序可以分支,以便按照需要加载不同的模块。

方法一:加载时动态链接

新建一个普通控制台项目,将DLLDemoone.lib,DLLDemoone.dll以及Demoone.h复制到和项目代码相同的路径下:

代码按如下方式书写:

#include <iostream>
#include"Demoone.h"//方法a
using namespace std;
#pragma comment(lib, "DLLDemoone.lib")
//extern "C" _declspec(dllimport) int Add(int a, int b);//方法b
int main(int argc, char *argv[])
{
cout<<Add(2, 3)<<endl;
return 0;
}


运行即可获得正确的结果。

方法a和方法b是两种不同方式,若使用方法b则不需要拷贝Demo.h这个头文件。

方法二:运行时动态链接

新建一个普通控制台项目,将DLLDemoone.lib,DLLDemoone.dll以及Demoone.h复制到和项目代码相同的路径下:

#include <windows.h>
#include <iostream>
using namespace std;
typedef int (*AddFunc)(int a, int b);
int main(int argc, char *argv[])
{
HMODULE hDll = LoadLibrary("DLLmaketwo.dll");
if (hDll != NULL)
{
AddFunc add = (AddFunc)GetProcAddress(hDll, MAKEINTRESOURCE(1));
if (add != NULL)
{
cout<<add(2, 3)<<endl;
}
FreeLibrary(hDll);
}
}


在这里会碰到error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR”的问题,解决方式是将工程的字符方式进行修改即可,具体见另一篇:
http://www.cnblogs.com/holyprince/p/4236586.html
创建和使用方法大致分为以上四种,参考了两篇文章,多谢他们:
http://www.jellythink.com/archives/111 http://www.aichengxu.com/view/14438
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: