`

DLL中导出函数的声明有两种方式:

    博客分类:
  • C++
 
阅读更多

DLL中导出函数的声明有两种方式:

一种方式是:在函数声明中加上__declspec(dllexport);
另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。

方式一:在函数声明中加上__declspec(dllexport)
/// 在动态链接库程序中
/// 声明动态链接库(**.dll)的对外接口函数TestFuction
extern "C" __declspec(dllexport) int TestFuction(int nType,char *strPath,std::vector<string> &vecData)
{
////do anything here////
return 0;
}


/// 在外部希望调用动态链接库的程序中
/// 加载动态链接库(**.dll)并调用其对外接口TestFuction
void func()
{
//typedef与函数TestFuction类型相同的函数指针为TESTDLL
typedef int (_cdecl * TESTDLL)(int nType,char *strPath,std::vector<string> &vecData);
HINSTANCE hmod;
//加载动态链接库**.dll
hmod =::LoadLibrary(_TEXT("dll相对路径//**.dll"));
if(NULL == hmod)
{
TRACE("加载**.dll失败");
}
//定义一个与函数TestFuction类型相同的函数指针lpproc
TESTDLL lpproc;
//搜索**.dll中函数名为TestFuction的对外接口
lpproc = (TESTDLL)GetProcAddress (hmod,"TestFuction");
//如果搜索成功
if(NULL != lpproc)
{
int nType = 0;
char* strPath = "Data";
std::vector<string> vecData;
//通过函数指针lpproc调用**.dll的接口函数TestFuction
int nResult = (*lpproc)(nType,strPath,vecData);
}
//...
//在恰当的时候释放动态链接库**.dll
FreeLibrary(hmod);
}


方式二:采用模块定义(.def)文件声明
首先创建 一个DLL程序(DllTestDef)
在*.cpp中
int __stdcall Add(int numa, int numb)
{
return (numa + numb);
}

int __stdcall Sub(int numa, int numb)
{
return (numa - numb);
}

然后创建一个.def的文件,在里面加上

;DllTestDef.lib : 导出DLL函数
;作者:----
LIBRARY DllTestDef
EXPORTS
Add @ 1
Sub @ 2

最后创建一个测试程序:.cpp文件如下:
#include <iostream>
#include <windows.h>

using namespace std;

typedef int (__stdcall *FUN)(int, int);
HINSTANCE hInstance;
FUN fun;

int main()
{
hInstance = LoadLibrary("DLLTestDef.dll");
if(!hInstance)
cout << "Not Find this Dll" << endl;
fun = (FUN)GetProcAddress(hInstance, MAKEINTRESOURCE(1));
if (!fun)
{
cout << "not find this fun" << endl;
}
cout << fun(1, 2) << endl;
FreeLibrary(hInstance);
return 0;
}

说明:
.def文件的规则为:

(1)LIBRARY语句说明.def文件相应的DLL;

(2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);

(3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。

(4)使用__declspec(dllexport)和使用.def文件是有区别的。

如果你的DLL是提供给VC用户使用的,你只需要把编译DLL时产生的.lib提供给用户,
它可以很轻松地调用你的DLL。但是如果你的DLL是供VB、PB、Delphi用户使用的,那么会产生一个小麻烦。
因为VC++编译器对于__declspec(dllexport)声明的函数会进行名称转换,如下面的函数:
__declspec(dllexport) int __stdcall Add()
会转换为Add@0,这样你在VB中必须这样声明:
Declare Function Add Lib "DLLTestDef.dll" Alias "Add@0" () As Long
@后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式导出函数了。

分享到:
评论

相关推荐

    DLL导出函数查看器(专用工具)

    DLL导出函数查看器是一款专门设计用于查看DLL文件中导出函数的专业工具,对于软件开发、调试和系统维护人员来说,它是一个不可或缺的辅助工具。 首先,我们要理解DLL的导出函数。在DLL中,可以定义一些函数,并声明...

    解决dll导出函数多余的办法_delphi_

    然而,有时可能会遇到DLL导出函数多余的问题,即DLL中包含的函数多于实际需要使用的函数,这可能导致不必要的内存消耗、降低程序性能,甚至引发兼容性问题。本文将详细介绍如何在Delphi中解决DLL导出函数多余的问题...

    精选_两种方式实现DLL导出函数之dllexport与def文件导出_源码打包

    总结,理解并熟练掌握这两种DLL导出函数的方法对于Windows平台的开发者来说至关重要,它们能够帮助你有效地组织和复用代码,提高软件开发的效率和质量。通过分析提供的源码打包,你可以深入学习这两种方法的实际应用...

    DLL导出函数

    DLL(Dynamic Link Library)是Windows...总结来说,DLL导出函数是Windows编程中的关键操作,它可以实现代码共享和模块化。通过不使用DEF文件或使用DEF文件,开发者可以选择最适合项目需求的方式来导出和使用DLL功能。

    VC++使用关键字_declspec (dllexport)导出函数

    下面我们将深入探讨这两个修饰符以及如何在VC++中使用它们来导出函数。 首先,让我们了解什么是DLL。DLL(动态链接库)是一种可重用的代码库,其中包含可由多个程序共享的函数和资源。使用DLL可以减少内存占用,...

    DLL接口导出.rar

    - **隐式导出**:这是默认的方式,通过在函数声明前加上`__declspec(dllexport)`关键字,编译器会自动将该函数添加到DLL的导出表中。在使用DLL的程序中,只需包含对应的头文件,编译器就能找到相应的函数入口。 -...

    DLL导出对话框(无模式,有模式两种).

    在这个主题中,我们将深入探讨DLL如何导出对话框,并分析无模式和有模式两种不同类型的对话框。 首先,DLL导出对话框的关键在于DLL中的导出函数。在DLL中,我们需要定义一个或多个函数,这些函数负责创建和管理...

    c++调用dll的两种方式

    C++中调用DLL主要有两种方法:使用`LoadLibrary`和`GetProcAddress`函数(API方式)以及使用`extern "C"`和`__declspec(dllimport/dllexport)`(编译器方式)。接下来,我们将深入探讨这两种方法。 **API方式调用...

    dll 类导出

    有两种主要方式:隐式调用和显式调用。 **隐式调用** 是通过链接器将DLL中的函数或类导入到目标程序中。当编译客户端程序时,需要指定DLL的导入库(.lib文件)。这样,链接器会处理所有必要的链接工作。例如,如果...

    C++中DLL函数的导出和导入(20211119134451).pdf

    首先,DLL的导出通常有两种方式:使用DEF文件和使用`__declspec(dllexport)`。DEF文件是一种文本格式,它包含DLL的基本属性,如模块定义(LIBRARY语句)和导出函数列表(EXPORTS语句)。例如,一个简单的DEF文件可能...

    DLL动态库函数查看工具

    1. **导出函数**:DLL中可供其他程序调用的函数称为导出函数。它们在编译时通过`__declspec(dllexport)`关键字或DEF文件定义。 2. **导入函数**:当一个应用程序需要使用DLL中的功能时,需要通过`__declspec...

    vs2008 调用DLL

    3. **头文件和导出函数**:创建一个头文件,其中包含DLL的函数声明,以便在主应用程序中使用。导出函数的声明应带有`__declspec(dllexport)`,例如: ```cpp extern "C" __declspec(dllexport) int MyFunction(int...

    传递函数指针到DLL函数中去的示例

    在Windows编程中,动态链接库(DLL)是一种可重用代码的模块,它包含可由多个应用程序同时调用的函数和资源。DLL可以减少内存占用并简化软件维护。本示例将详细介绍如何将函数指针传递给DLL函数,以便DLL在运行时...

    动态链接库dll导出类的方法 VC

    在这个“动态链接库dll导出类的方法 VC”项目中,我们有两个关键的工程:DllInstenceMfc用于生成DLL,而Test Dll则是调用这个DLL的应用程序。 首先,让我们深入了解一下VC++(Visual C++)环境中如何创建和使用DLL...

    C/C++:Windows编程—调用DLL程序的2种方法 示例demo

    在这个例子中,`dlltest1.h`包含了DLL导出函数的声明,`DLLTest1_function`是DLL中实际实现的函数。 2. 显式链接: 显式链接是在运行时动态加载和调用DLL的函数。我们使用`LoadLibrary()`函数加载DLL,`...

    VC++ DLL 实现回调函数的实例

    DLL文件本质上是包含可执行代码和数据的库,它可以通过导出函数接口供其他应用程序或DLL调用。在VC++中,我们通常使用`__declspec(dllexport)`和`__declspec(dllimport)`关键字来控制函数或类的导出和导入。当在DLL...

    用Dll中的函数来设置控件

    这涉及到两个部分:链接到DLL(静态或动态)和调用导出函数。 - 静态链接:在项目设置中,指定DLL的.lib文件,编译时会链接到DLL。 - 动态链接:在运行时使用`LoadLibrary`和`GetProcAddress`函数加载DLL并获取...

    QT调用dll和MFC调用QT的dll

    - 导入DLL:在主QT项目中,通过`LoadLibrary`和`GetProcAddress`函数加载DLL,并获取导出函数的指针。记得在程序结束时使用`FreeLibrary`释放资源。 2. QT调用QT的DLL: - 共享数据类型:确保所有涉及的数据类型...

    C++ DLL 导出类 示例

    确保在类定义和成员函数声明中使用了适当的导出关键字。 4. **控制台程序调用DLL**: 创建一个独立的控制台应用程序项目,用于调用DLL中的类。首先,需要包含DLL的头文件,并使用`__declspec(dllimport)`关键字...

    DLL回调应用程序函数

    DLL(动态链接库)回调是一种技术,它允许DLL在被加载后调用应用程序中预先定义好的函数。这种方式可以增强程序间的交互性和灵活性,特别适用于扩展功能或插件式设计。 #### 回调函数在DLL中的定义与使用 在DLL中...

Global site tag (gtag.js) - Google Analytics