- 浏览: 2045793 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (795)
- java (263)
- 聚类搜索引擎 (9)
- 经验之谈 (67)
- DSP (3)
- C++ (140)
- Linux (37)
- SNMP (6)
- Python (6)
- 数据库 (61)
- 网络 (20)
- 算法 (15)
- 设计模式 (4)
- 笔试题 (38)
- 散文 (35)
- 数据结构 (9)
- 银行知识 (0)
- 榜样 (9)
- Lucene (15)
- Heritrix (6)
- MetaSeeker (0)
- netbeans (12)
- php (3)
- 英语 (8)
- DB2 (0)
- java基础 (5)
- mongodb & hadoop (4)
- Javascript (7)
- Spring (4)
- ibatis & myibatis (1)
- velocity (1)
- 微服务 (0)
- paddle (1)
- 第三方 (0)
- 知识沉淀 (1)
- 建模 (0)
最新评论
-
0372:
标示对java很陌生!
中文乱码解决的4种方式 -
梦留心痕:
Java中\是转意字符, 可是你的这句话我没看懂,只要把得到的 ...
java中如何忽略字符串中的转义字符--转载 -
yanjianpengit:
[b][/b]
java为什么非静态内部类里面不能有静态成员 -
springdata-jpa:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
eclipse 如何把java项目转成web项目 -
qq1130127172:
,非常好。
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
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文件方式导出函数了。
发表评论
-
k-means算法的C++实现
2011-04-05 11:38 2342k-means算法的C++实现: http://www.ku ... -
main()中的参数
2010-10-31 10:41 1539所有的应用程序都是从以main函数作为入口, 而mai ... -
static作用
2010-10-26 19:15 2389转自(from http://www.cnb ... -
mmap函数
2010-10-25 22:41 1913mmap函数的使用方法 UNIX ... -
C语言中三种内存分配方式
2010-10-25 20:23 01.malloc 原型:extern void *ma ... -
位拷贝和值拷贝
2010-10-23 15:37 1599为了便于说明我们以String类为例: 首先定义String ... -
(转帖)把类的析构函数写成虚函数的用意
2010-10-23 15:10 1700#include <iostream.h> cl ... -
动态规划/贪心算法----0/1背包问题AND普通背包问题
2010-10-23 14:03 6828两个背包问题都是比较典型的问题,对这两种算法的理解有很好的帮助 ... -
netstat, nslookup, finger, ping命令
2010-10-22 17:13 1533Netstat用于显示与IP、TCP ... -
C++返回值
2010-10-22 16:53 1549C++函数返回值: (1)正常情况下,函数的参数要复制一份在 ... -
switch语句后的表达式的值
2010-10-22 16:23 1842一般格式: switch (表达式) { case 常量 ... -
C++四种强制类型转换
2010-10-19 11:45 1578显式类型转换又被称之 ... -
C++四种强制类型转化的区别
2010-10-19 11:43 1357先介绍const_cast和reinterpret_cast: ... -
Visual C++线程同步技术剖析:临界区,时间,信号量,互斥量
2010-10-18 14:24 1834使线程同步 在程序中使用多线程时,一般很少有多个线程能在其 ... -
(转)临界区,互斥量,信号量,事件的区别
2010-10-18 14:22 1772四种进程或线程同步互斥的控制方法1、临界区:通过对多线程的串行 ... -
(转)在C++中实现同步锁,类似synchronize(object){....}
2010-10-18 13:49 1884在做C++的项目中发现, ... -
C++线程同步
2010-10-18 13:46 1617线程同步是多 ... -
C++多线程编程
2010-10-18 10:56 1755今天我给大家讲一讲C++ ... -
关于C++对函数传参与函数返回值进行引用传递的详解
2010-10-16 22:51 4061关于C++对函数传参与函数返回值进行引用传递的详解 ... -
i++和i--哪个效率高
2010-10-15 09:01 3317for(i = n; i > 0; i--){…} ...
相关推荐
DLL导出函数查看器是一款专门设计用于查看DLL文件中导出函数的专业工具,对于软件开发、调试和系统维护人员来说,它是一个不可或缺的辅助工具。 首先,我们要理解DLL的导出函数。在DLL中,可以定义一些函数,并声明...
然而,有时可能会遇到DLL导出函数多余的问题,即DLL中包含的函数多于实际需要使用的函数,这可能导致不必要的内存消耗、降低程序性能,甚至引发兼容性问题。本文将详细介绍如何在Delphi中解决DLL导出函数多余的问题...
总结,理解并熟练掌握这两种DLL导出函数的方法对于Windows平台的开发者来说至关重要,它们能够帮助你有效地组织和复用代码,提高软件开发的效率和质量。通过分析提供的源码打包,你可以深入学习这两种方法的实际应用...
DLL(Dynamic Link Library)是Windows...总结来说,DLL导出函数是Windows编程中的关键操作,它可以实现代码共享和模块化。通过不使用DEF文件或使用DEF文件,开发者可以选择最适合项目需求的方式来导出和使用DLL功能。
下面我们将深入探讨这两个修饰符以及如何在VC++中使用它们来导出函数。 首先,让我们了解什么是DLL。DLL(动态链接库)是一种可重用的代码库,其中包含可由多个程序共享的函数和资源。使用DLL可以减少内存占用,...
- **隐式导出**:这是默认的方式,通过在函数声明前加上`__declspec(dllexport)`关键字,编译器会自动将该函数添加到DLL的导出表中。在使用DLL的程序中,只需包含对应的头文件,编译器就能找到相应的函数入口。 -...
在这个主题中,我们将深入探讨DLL如何导出对话框,并分析无模式和有模式两种不同类型的对话框。 首先,DLL导出对话框的关键在于DLL中的导出函数。在DLL中,我们需要定义一个或多个函数,这些函数负责创建和管理...
C++中调用DLL主要有两种方法:使用`LoadLibrary`和`GetProcAddress`函数(API方式)以及使用`extern "C"`和`__declspec(dllimport/dllexport)`(编译器方式)。接下来,我们将深入探讨这两种方法。 **API方式调用...
有两种主要方式:隐式调用和显式调用。 **隐式调用** 是通过链接器将DLL中的函数或类导入到目标程序中。当编译客户端程序时,需要指定DLL的导入库(.lib文件)。这样,链接器会处理所有必要的链接工作。例如,如果...
首先,DLL的导出通常有两种方式:使用DEF文件和使用`__declspec(dllexport)`。DEF文件是一种文本格式,它包含DLL的基本属性,如模块定义(LIBRARY语句)和导出函数列表(EXPORTS语句)。例如,一个简单的DEF文件可能...
1. **导出函数**:DLL中可供其他程序调用的函数称为导出函数。它们在编译时通过`__declspec(dllexport)`关键字或DEF文件定义。 2. **导入函数**:当一个应用程序需要使用DLL中的功能时,需要通过`__declspec...
3. **头文件和导出函数**:创建一个头文件,其中包含DLL的函数声明,以便在主应用程序中使用。导出函数的声明应带有`__declspec(dllexport)`,例如: ```cpp extern "C" __declspec(dllexport) int MyFunction(int...
在Windows编程中,动态链接库(DLL)是一种可重用代码的模块,它包含可由多个应用程序同时调用的函数和资源。DLL可以减少内存占用并简化软件维护。本示例将详细介绍如何将函数指针传递给DLL函数,以便DLL在运行时...
在这个“动态链接库dll导出类的方法 VC”项目中,我们有两个关键的工程:DllInstenceMfc用于生成DLL,而Test Dll则是调用这个DLL的应用程序。 首先,让我们深入了解一下VC++(Visual C++)环境中如何创建和使用DLL...
在这个例子中,`dlltest1.h`包含了DLL导出函数的声明,`DLLTest1_function`是DLL中实际实现的函数。 2. 显式链接: 显式链接是在运行时动态加载和调用DLL的函数。我们使用`LoadLibrary()`函数加载DLL,`...
这涉及到两个部分:链接到DLL(静态或动态)和调用导出函数。 - 静态链接:在项目设置中,指定DLL的.lib文件,编译时会链接到DLL。 - 动态链接:在运行时使用`LoadLibrary`和`GetProcAddress`函数加载DLL并获取...
- 导入DLL:在主QT项目中,通过`LoadLibrary`和`GetProcAddress`函数加载DLL,并获取导出函数的指针。记得在程序结束时使用`FreeLibrary`释放资源。 2. QT调用QT的DLL: - 共享数据类型:确保所有涉及的数据类型...
确保在类定义和成员函数声明中使用了适当的导出关键字。 4. **控制台程序调用DLL**: 创建一个独立的控制台应用程序项目,用于调用DLL中的类。首先,需要包含DLL的头文件,并使用`__declspec(dllimport)`关键字...
DLL(动态链接库)回调是一种技术,它允许DLL在被加载后调用应用程序中预先定义好的函数。这种方式可以增强程序间的交互性和灵活性,特别适用于扩展功能或插件式设计。 #### 回调函数在DLL中的定义与使用 在DLL中...
函数导出有两种方式: - **标准导出**:使用`library`关键字开始,然后在`exports`关键字后列出函数名。 - **导出表**:创建一个包含导出函数名和地址的`.def`文件,然后在`uses`部分引用该文件。 4. **调用DLL...