编写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 演示的更多相关文章

  1. NET基础课--WinForm开发推荐3

    用户体验 较长时间的运算:使用进度条(progress bar) 不要阻塞界面(UI)线程:使用多线程进行长时间的运算 状态栏(status bar)提示应用程序的状态 操作开始之后,用户应当能够通过 ...

  2. Windows 证书签名的伪造

    Windows 系统中的一些非常重要文件通常会被添加数字签名,其目的是用来防止被篡改,能确保用户通过互联网下载时能确信此代码没有被非法篡改和来源可信,从而保护了代码的完整性.保护了用户不会被病毒.恶意 ...

  3. 用DLL实现插件的简单演示

    这是DLL的代码 library MyDll; uses SysUtils, Dialogs, Classes; procedure ShowInfo(info:PChar);stdcall; beg ...

  4. C#文件或文件夹压缩和解压方法(通过ICSharpCode.SharpZipLib.dll)

    我在网上收集一下文件的压缩和解压的方法,是通过ICSharpCode.SharpZipLib.dll 来实现的 一.介绍的目录 第一步:下载压缩和解压的 ICSharpCode.SharpZipLib ...

  5. 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 ...

  6. 将halcon导出的c++程序打包成dll库

     1.从“文件”菜单中,选择“新建”,然后选择“项目…”. 2.从“项目类型”窗格中选择“Visual C++”下的“Win32”. 3.从“模板”窗格中,选择“Win32 控制台应用程序”. 4.为 ...

  7. VC++动态链接库(DLL)编程深入浅出(zz)

    VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...

  8. 为 Linux 应用程序编写 DLL[转]

    自:http://www.ibm.com/developerworks/cn/linux/sdk/dll/index.html 在仅仅只会编写插件的时候为什么要编写整个应用程序? 插件和 DLL 通常 ...

  9. 整理分享C#通过user32.dll模拟物理按键操作的代码

    对系统模拟按键方面的知识和按键映射代码做了一下梳理,在这里分享出来,适用于开发自动操作工具和游戏外挂. 主代码: public const int KEYEVENTF_EXTENDEDKEY = 0x ...

随机推荐

  1. jQuery颜色面板插件

    /** * jQuery颜色面板插件 * * 使用方法:input框的id默认为inputObj,button框的id默认为btnObj,也可以自定义aaa,bbb * 1.初始化颜色面板:$.col ...

  2. 【转】nodejs mysql 链接数据库集群

    1.建立数据库连接:createConnection(Object)方法      该方法接受一个对象作为参数,该对象有四个常用的属性host,user,password,database.与php中 ...

  3. JavaWeb -- 四个域对比 request,servletContext, Session, pageContext

    requsest: 程序产生数据,用完了就没有用了, 用request, 作用范围:一个请求范围. Session: 程序产生数据,用完了 等一下还要使用, 用Session, 作用范围: 一个会话范 ...

  4. devstack apache2/keystone 没有启动

    在devstack中./rejoin-stack.sh 发现apache2/keystone 没有启动 单单手动启动apach2服务之后keystone并没有启动 sudo service apach ...

  5. SQL索引工作原理

    SQL 当一个新表被创建之时,系统将在磁盘中分配一段以8K为单位的连续空间,当字段的值从内存写入磁盘时,就在这一既定空间随机保存,当一个8K用完的时候, SQLS指针会自动分配一个8K的空间.这里,每 ...

  6. 51nod 1732 LCS变形

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1732 1732 51nod婚姻介绍所 题目来源: 原创 基准时间限制:1 ...

  7. element-ui中tabs页设置第一个页面不可关闭

    element官网中,有说明添加这个属性,默认为false,但是这个是一个单属性,似乎没法赋值. 这个用css就行了嘛,没必要搞得那么复杂,也不需要设置close属性,按照官网的示例文档即可.css设 ...

  8. java调接口

    package util; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputSt ...

  9. 数组中累加和为k的最大子数组的长度

    package com.hzins.suanfa; import java.util.HashMap; public class demo { /** * 数组中累加和为k的最大子数组的长度 * @p ...

  10. php 与 Smarty 中的 isset

    今天在做一个分页模块的时候,在获取前端返回的当前页时,烦了一个大错!本来应该是这样子滴: 而咱却写成了这个样子: 在php里输出测试都没错,结果到Smarty里就被拒了! 测试结果是 这货跟谁都相等, ...