Visual Studio 创建和使用dll的方法
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 @
最终视图如下:
生成解决方案也能得到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(, )<<endl;
- return ;
- }
运行即可获得正确的结果。
方法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());
- if (add != NULL)
- {
- cout<<add(, )<<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
Visual Studio 创建和使用dll的方法的更多相关文章
- Visual Studio 创建代码注释默认模版方法
在日常的开发中我们经常需要为页面添加注释和版权等信息,这样我们就需要每次去拷贝粘贴同样的文字,为了减少这种重复性的工作,我们可以把这些信息保存在Visual Studio 2012类库模版文件里 1. ...
- Visual studio 创建项目失败vstemplate
Visual studio 创建项目失败 提示 the vstemplate file references the wizard class 'Microsoft.VisualStudio.WinR ...
- Visual studio 创建通用项目失败vstemplate
Visual studio 创建项目失败 提示 the vstemplate file references the wizard class 'Microsoft.VisualStudio.WinR ...
- Visual Studio 2008打开vs2010解决方案的方法
一个朋友遇到了个问题:用visual studio 2008软件,无法打开一个asp.net网站的sln解决方案.如下图,原因是此解决方案由vs2010生成的,必须由vs2010运行程序打开. 这样一 ...
- 使用Visual Studio创建简单的自己定义Web Part 部件属性
使用Visual Studio创建简单的自己定义Web Part 部件属性 自己定义属性使用额外的选项和设置拓展你的Web part部件.本文主要解说怎样使用Visual Studio创建简单的自己定 ...
- 用Visual Studio创建集成了gtest的命令行工程
gtest代码库中的sample代码 在gtest的代码库中,包含了10个sample的代码,覆盖了gtest的常见用法,sample的代码位于以下文件夹: gtest\samples 由于gtest ...
- 使用Visual Studio 创建新的Web Part项目
使用Visual Studio 创建新的Web Part项目 Web Part是你将为SharePoint创建的最常见的对象之中的一个.它是平台构建的核心基块. 1. 管理员身份打开Visual St ...
- 使用Visual Studio 创建可视Web Part部件
使用Visual Studio 创建可视Web Part部件 可视Web Part部件是很强大的Web 部件.它提供内置设计器创建你的用户界面. 本文主要解说怎样使用Visual Studio 创建可 ...
- 【翻译】使用Visual Studio创建Asp.Net Core MVC (一)
This tutorial will teach you the basics of building an ASP.NET Core MVC web app using Visual Studio ...
随机推荐
- Spring Annotation vs XML - 示例
来源: http://hanqunfeng.iteye.com/blog/2113820 作者hanqunfeng的示例文件: (可下载) web-mvc.zip
- linux下挂载第二块硬盘
1.第一步:添加硬盘/新建分区(fdisk) a.查看当前系统所有硬盘及分区情况:fdisk -lb.在指定的硬盘(例:/dev/sda)上创建分区:fdisk /dev/sda , 根据提示进行下一 ...
- Browserify: 使nodejs模块可以在浏览器下使用
Browserify:浏览器加载Node.js模块--------------------------------------------------随着JavaScript程序逐渐模块化,在ECMA ...
- Mac OS X Mavericks or Yosemite 安装Nginx、PHP、Mysql、phpMyAdmin
翻译:http://blog.frd.mn/install-nginx-php-fpm-mysql-and-phpmyadmin-on-os-x-mavericks-using-homebrew/ 最 ...
- haproxy 超时机制
<pre name="code" class="python">option redispatch option redispatch 是否允许重新 ...
- Java ThreadLocal 学习
同步机制是为了同步多个线程对相同资源的并发访问,是为了多个线程之间进行通信的有效方式. 而ThreadLocal是隔离多个线程的数据共享,从根本上就不在多个线程之间共享资源(变量),这样当然不需要对多 ...
- poj 1050 To the Max(线性dp)
题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...
- Qt webKit可以做什么(四)--实现本地QObject和JavaScript交互
Qt webKit可以做什么(四)--实现本地QObject和JavaScript交互 Qt webKit可以做什么(四)--实现本地QObject和JavaScript交互
- javascript - C++, Qt, QtWebKit: How to create an html rendering window so that your application would get callbacks from JS calls? - Stack Overflow
javascript - C++, Qt, QtWebKit: How to create an html rendering window so that your application woul ...
- nyoj-709-异形卵(水题)
异 形 卵 时间限制:1000 ms | 内存限制:65535 KB 难度: 描写叙述 我们探索宇宙,是想了解浩瀚星空的奥妙.但我们却非常少意识到宇宙深处藏匿的危急,它们无时无刻不紧盯着我们的地球 ...