DLL-创建DLL
动态链接库的创建
fangyukuan
2010.6.20
编写DLL时的函数与一般的函数方法基本一样。但要对库中的函数进行必要的声明,以说明哪些函数是可以导出的,哪些函数是不可以导出的。
把DLL中的函数声明为导出函数的方法有两种:
一是使用关键字_declspec(dllexport)来声明。
二是在.def文件中声明。
一、使用关键字_declspec(dllexport)来声明导出函数
声明函数SayHello为导出函数语句为:int _declspec(dllexport) SayHello ();
为了使一个用C++语言编写的DLL函数可以在C语言编写的应用程序中使用,在关键字_declspec(dllexport) 之前要附加另一个关键字:extern “C”,以通知编译器采用C链接方式。
例子:(用vs2008写的例子)
新建一个工程。
选择Win32 Project,工程名字为1_DLLDemo。确定。
选择DLL其它默认。
在文件1_DLLDemo.cpp编写代码如下:
extern "C" __declspec(dllexport) void SayHello()
{
::MessageBoxW(NULL, L"Hello", L"fangyukuan", MB_OK);
}
按F7编译即可。
再新建一个测试工程。这里简单一点,新建一个控制台工程就可以了。
选择Win32 console Application,其它全部默认。
编写如下代码:
#include "stdafx.h"
#include "stdlib.h" // for system("pause");
#include "windows.h"
#include <iostream>
using namespace std;
typedef void (SAYHELLO)(); // 定义一个这种类型的函数指针
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDllInst;
// 这里为dll的路径,因为现在exe和dll在同一个目录下,所以只写名字即可
hDllInst=LoadLibrary(L"1_DLLDemo.dll");
if(NULL == hDllInst)
{
cout << "加载dll失败" << endl;
}
else
{
SAYHELLO * lpproc =(SAYHELLO *)GetProcAddress(hDllInst,"SayHello");
if(NULL != lpproc)
(*lpproc)();
FreeLibrary(hDllInst);
}
system("pause");
return 0;
}
按F7编译。再按F5运行。结果如下。
二、使用def文件声明导出函数
def文件又叫做模块定义文件,这是一个用于描述DLL属性的文本文件,每个def文件一般要包括以下模块定义语句:
A) LIBRARY语句,指出DLL的名字,链接器将把这个名字放到DLL库中。
B) EXPORTS语句,列出库中导出函数的名称及导出函数的序号(可选)。
C) DISCRIPION语句,该语句用来描述DLL的用途等说明。
可以在def文件分号“;”后面书写注释语句。
在创建DLL时,编译链接器将要使用def文件创建两个文件:一个导出文件(.EXP)和一个导入库文件(.LIB),然后使用导出文件再创建DLL文件。
外部应用程序使用的文件是导入库文件和DLL文件。由于在导入库文件中存放了外部应用程序可导入的DLL导出函数名称列表,因此外部应用程序需要把它连接在应用程序中,才能以它为索引到DLL中去找到要调用的导出函数。也就是说,导入库文件相当于是DLL可提供的服务项目表。
例子:(用vs2008写的例子)
方法同上面一样新建一个DLL工程。
在文件2_DLLDemo.cpp编写代码如下:
void SayHello()
{
::MessageBoxW(NULL, L"2_DLLDemo::Hello", L"fangyukuan", MB_OK);
}
然后再新建一个def文件。
在工程右键->add->New Item…
在def文件编写如下代码:
LIBRARY "2_DLLDemo"
EXPORTS
SayHello
按F7编译完成。
测试方法同上面例子一样。
本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/06/20/1761464.html
DLL-创建DLL的更多相关文章
- C#创建dll类库
类库让我们的代码可复用,我们只需要在类库中声明变量一次,就能在接下来的过程中无数次地使用,而无需在每次使用前都要声明它.这样一来,就节省了我们的内存空间.而想要在类库添加什么类,还需取决于类库要实现哪 ...
- 创建dll教程
先看我的总结: 总结: 1.头文件中如果想以C形式提供,要判断,如果定义了 _cplusplus, extern "c"{ 这里写接口声明 } 2.接口声明中,要表明接口接入点的 ...
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
from:http://m.blog.csdn.net/article/details?id=51075023 在VS2015中先创建C#项目,然后再创建要编写的动态库DLL项目,这样做的好处是整个解 ...
- C#加载dll 创建类对象
//加载dll 创建类对象string sqlightAssembly = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "syst ...
- VC++2008 用空工程创建 DLL
VC++2008 用空工程创建 DLL 一.创建 DLL 工程项目: 1)点击菜单[File] -> [New] -> [Project...] 弹出 “New Project” 对话框: ...
- windows编程:创建DLL
创建DLL Dll是动态链接库的缩写,可以作为附加代码动态映射到进程的地址空间中. 动态库的一般创建方法如下 方法1.使用 __declspec(dllexport) 方式导出 一般的框架如下 // ...
- VS2010环境下用ANSI C创建DLL和使用方法(转)
源:VS2010环境下用ANSI C创建DLL和使用方法 . 创建DLL工程 1.2 创建一个dll工程. 操作:a.文件->新建->项目->Win32控制台应用程序. b.输入工程 ...
- C# 创建Dll文件供程序调用方法
C# 创建Dll文件供程序调用方法 使用C#创建动态Dll文件方法: 1. 在VS2017环境下,新建-项目-选择类库类型: 2. 新创建一个.cs文件(如test.cs),编写代码如下: usin ...
- 利用C++创建DLL并C#调用
日期:2018年11月26日 环境:window 10,VS2015 community 一.利用C++创建DLL 1.新建项目: 2.打开CreateDLL.cpp文件,并输入测试代码 #inclu ...
- MinGW 使用和创建 DLL 应注意的问题
MinGW 是 GCC 的 Windows 版本,稳定版已经到了 4.5.2,功能和性能上很好,感觉不比 Microsoft 自家的 VC 差啊.但是 MinGW 下使用和创建 DLL 倒是要特别注意 ...
随机推荐
- mybatis复杂映射
1. 类型名对应 当实体类与表中字段完全一致时,mapper文件里返回类型用resultType,否则要用resultMap,并且建立resultMap映射 package com.rf.domain ...
- 一行代码打印python之禅
就这一句: import this 输出: The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is be ...
- 团队开发day04
通过myurl.openConnection()连接一直连接失败,问题解决: 在一般的Java Web程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务, 但是如果 ...
- Installation failed with message INSTALL_FAILED_TEST_ONLY问题
Android Studio连接手机进行app调试,遇到如下问题: Installation failed with message INSTALL_FAILED_TEST_ONLY. It is p ...
- [刘阳Java]_精选20道Java多线程面试题
1. 多线程使用的优缺点? 优点: (1)多线程技术使程序的响应速度更快 (2)当前没有进行处理的任务可以将处理器时间让给其它任务 (3)占用大量处理时间的任务可以定期将处理器时间让给其它任务 (4) ...
- 写了这么多年 CSS,initial 和 inherit 以及 unset 和 revert 还傻傻分不清楚?
经常会碰到,问一个 CSS 属性,例如 position 有多少取值. 通常的回答是 static.relative.absolute 和 fixed .当然,还有一个稍微生僻的 sticky .其实 ...
- 【NOIP2007】Hanoi双塔问题
题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形). 现要将这些圆盘移到C柱上 ...
- react native踩坑记录
一 .安装 1.Python2 和Java SE Development Kit (JDK)可以直接通过腾讯电脑关键安装, Android SDK安装的时候路径里不能有中文和空格 2.配置java环境 ...
- 打开JAVA之门:idea的安装及JAVA环境的创建
打开JAVA之门:idea的安装及JAVA环境的创建 1.idea的下载安装 首先打开 ->->->(IntelliJ IDEA: The Capable & Ergonom ...
- pwnable.kr之brainf*ck
pwnable.kr之brainf*ck 今天又是被难倒的一天Orz,个人感觉pwnable.kr上的题都比较剑走偏锋,仔细做过去,一定会有很大的收获. 不多说了,今天看的是第二关的第一道题:brai ...