DLL 演示
编写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编译即可。
二、使用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"aaa", MB_OK);
}
然后再新建一个def文件。
在工程右键->add->New Item…
在def文件编写如下代码:
LIBRARY "2_DLLDemo"
EXPORTS
SayHello
按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运行。
【隐式调用】
调用DLL时先把**.LIB和**.DLL拷贝在调用进程的工作目录和DEBUG目录里 然后用#pragma comment(lib,"***.lib") 或者在LINK选项里加入**.LIB 要是系统还是找不到就用绝对路径才行
再新建一个测试工程。
选择Win32 console Application,其它全部默认。
编写如下代码:
#include "stdafx.h"
#include <Windows.h>
#pragma comment (lib,"dll_demo.lib")
extern "C" _declspec(dllimport) void SayHello();
int _tmain(int argc, LPTSTR argv[])
{
SayHello();
return 0;
}
DLL 演示的更多相关文章
- NET基础课--WinForm开发推荐3
用户体验 较长时间的运算:使用进度条(progress bar) 不要阻塞界面(UI)线程:使用多线程进行长时间的运算 状态栏(status bar)提示应用程序的状态 操作开始之后,用户应当能够通过 ...
- Windows 证书签名的伪造
Windows 系统中的一些非常重要文件通常会被添加数字签名,其目的是用来防止被篡改,能确保用户通过互联网下载时能确信此代码没有被非法篡改和来源可信,从而保护了代码的完整性.保护了用户不会被病毒.恶意 ...
- 用DLL实现插件的简单演示
这是DLL的代码 library MyDll; uses SysUtils, Dialogs, Classes; procedure ShowInfo(info:PChar);stdcall; beg ...
- C#文件或文件夹压缩和解压方法(通过ICSharpCode.SharpZipLib.dll)
我在网上收集一下文件的压缩和解压的方法,是通过ICSharpCode.SharpZipLib.dll 来实现的 一.介绍的目录 第一步:下载压缩和解压的 ICSharpCode.SharpZipLib ...
- ASP.NET MVC搭建项目后台UI框架—5、Demo演示Controller和View的交互
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- 将halcon导出的c++程序打包成dll库
1.从“文件”菜单中,选择“新建”,然后选择“项目…”. 2.从“项目类型”窗格中选择“Visual C++”下的“Win32”. 3.从“模板”窗格中,选择“Win32 控制台应用程序”. 4.为 ...
- VC++动态链接库(DLL)编程深入浅出(zz)
VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...
- 为 Linux 应用程序编写 DLL[转]
自:http://www.ibm.com/developerworks/cn/linux/sdk/dll/index.html 在仅仅只会编写插件的时候为什么要编写整个应用程序? 插件和 DLL 通常 ...
- 整理分享C#通过user32.dll模拟物理按键操作的代码
对系统模拟按键方面的知识和按键映射代码做了一下梳理,在这里分享出来,适用于开发自动操作工具和游戏外挂. 主代码: public const int KEYEVENTF_EXTENDEDKEY = 0x ...
随机推荐
- [转载]Spring配置文件详解一:
原文地址:与base-package="com.xx">Spring配置文件详解一:<context:annotation-config/>与<contex ...
- VC数据类型
不同编码格式下的字符串处理及相互转化: ◆ 大家在编程时经常遇到的数据类型:● Ansi:char.char * .const char *CHAR.(PCHAR.PSTR.LPSTR).LPCSTR ...
- STL视频_00
[05:40]比赛规则 - Part01[06:33]比赛规则 - Part02[07:28]比赛规则 - Part03[08:45]提出的问题 - 1和2[09:23]提出的问题 - 3和4 *** ...
- Specify compute hosts with SSDs
scheduler_driver = nova.scheduler.filter_scheduler.FilterScheduler scheduler_available_filters = nov ...
- linux服务器应用NTP配置时间同步
linux服务器应用NTP配置时间同步 • 为什么建议使用ntpd而不是ntpdate? #####原因很简单,ntpd是步进式的逐渐调整时间,而ntpdate是断点更新,比如现在服务器时间是9.18 ...
- 在ubuntu上安装svn+apache2
参考网站: http://www.thinksaas.cn/group/topic/335434/ http://blog.sina.com.cn/s/blog_3eba8f1c0100dqk1.ht ...
- lr中检查点的使用web_find()和web_reg_find()的区别
web_find()和web_reg_find()的区别:1. 这两个函数函数类型不同,web_find()是普通函数,web_reg_find()是注册函数;2. VU run time设置中的 “ ...
- Elasticsearch使用积累
常用插件 Head查看分片情况,操作简单api Bigdesk监控所在机器的CPU,IO,JVM等指标,简单分片概览 KOPF查看集群gc回收磁盘性能, 分片情况, 简单操作api, 感觉该插件较He ...
- Shell check IP
#! /bin/bash checkip() { if echo $1 |egrep -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3 ...
- jdbc connection为什么放在webINF的lib里面
jdbc connection为什么放在webINF的lib里面