社区
进程/线程/DLL
帖子详情
怎么调用dll中的类?
cococut
2005-02-17 02:05:42
我的dll中有类A,类B,
我怎么能够这样的调用
A a;
a.fun();
B b;
b.fun2();
...全文
1562
9
打赏
收藏
怎么调用dll中的类?
我的dll中有类A,类B, 我怎么能够这样的调用 A a; a.fun(); B b; b.fun2();
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sinall
2005-02-18
打赏
举报
回复
干脆用COM得了。
BigFanOfCpp
2005-02-17
打赏
举报
回复
还有就是,如果函数很多,就必须导出类,但是必须要变通一下,写一个导出函数,传出一个指针,指针指向你new出来的类对象就可以了,到了你的EXE或DLL里直接转换一下就可以了。
BigFanOfCpp
2005-02-17
打赏
举报
回复
如果是MFC规则DLL,不要加AFX_EXT_DATA,要用,AFX_CLASS_EXPORT,因为AFX_EXT_DATA是专门为扩展DLL准备的.
BigFanOfCpp
2005-02-17
打赏
举报
回复
简单的说:如果使用MFC的话,请在类声明前加AFX_EXT_DATA,这样在使用的时候,MFC会自动将AFX_EXT_DATA解析成__declspec(export)或__declspec(import)的,不需要你来关心。
class AFX_EXT_DATA A
{
public:
void Fun(){}
};
class AFX_EXT_DATA B
{
public:
void Fun2(){}
};
要想调用DLL中的类,一般有两种方式:
1:显示连接DLL,通过众所周知的LoadLibrary(DLL名称);加载成功后,因为这种加载方式只能导出函数,而不能导出类,所以需要一些辅助的技术,一般函数不多的话,可以在DLL里写一个导出函数,就是代理;比如:CallAFun,而CallAFun函数在DLL里再调用A的Fun函数;这个实现再高级一点就是COM模型了,因为隐藏了真正的实现,这里就不讨论了。
2:如果是隐式调用直接:
包含XXDLL.lib(Dll带的lib文件)和头文件就可以直接使用了。
3:最好的办法是使用MFC扩展DLL,它直接导出类,而不需要以上的操作。
ww51xh
2005-02-17
打赏
举报
回复
如楼上所说
master_ttch
2005-02-17
打赏
举报
回复
关于导出类
要输出整个的类,对类使用_declspec(_dllexpot);要输出类的成员函数,则对该函数使用_declspec(_dllexport)。如:
class AFX_EXT_CLASS CTextDoc : public CDocument
{
…
}
extern "C" AFX_EXT_API void WINAPI InitMYDLL();
新建两个工程,其中一个是dll工程(我的示例程序中这个工程名为DllClass),另一个是测试和使用dll的工程(名字为DllClassTest)
注意点:
1. Dll工程编译完成后,将.lib和.dll文件拷贝到测试和使用dll的工程的适当目录下(我的程序是release目录),然后将Dll工程中的导出类的头文件(以下简称头文件)拷贝到测试和使用dll的工程的适当目录下(在我的程序中是拷贝到此工程文件所在目录),然后把这个拷贝过来的头文件通过下面2和3进行修改。
2. 在Dll工程中的头文件使用的是 #define DLLCLASS_API __declspec(dllexport) 表示导出
在测试和使用dll的工程中的头文件使用的是 #define DLLCLASS_API __declspec(dllimport) 表示导入
3. 不论Dll工程的头文件如何实现(比如说包括内联函数等等),在测试和使用dll的工程中的头文件中全部都是声明而没有定义(即将类成员函数的实现部分去掉)
4。在测试和使用dll的工程的那个文件中包含对dll库的引入,分两步:
首先在是测试和使用dll的工程的setting菜单(按ALT+F7可以调出)中的LINK选项卡中的Object/Librarymodules:下填写对 dll 的连接,比如dll文件名字为DllClass.lib和DllClass.dll,则填写 ../Release/DllClass.lib(注意目录,我的程序中.lib文件是在目录release下)。
然后,添加对头文件的包含,比如dll文件名字为DllClass.lib和DllClass.dll,头文件为DllClass.h,则包含头文件为 #include "DllClass.h"
由此,就可以使用了。
相关源码如下:
dll工程中的DllClass.h 内容:
//此处在dll的头文件中为 dllexport,在应用文件中为dllimport
#defineDLLCLASS_API__declspec(dllexport)
//导出一个类(包括其方法、属性)
classDLLCLASS_APICDllClass
{
public:
CDllClass(void);
voidMSG(constchar*conststr);
};
dll工程中的DllClass.cpp内容:
#include"stdafx.h"
#include"DllClass.h"
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
CDllClass::CDllClass()
{
return;
}
void CDllClass::MSG(const char* const str)
{
MessageBox(NULL,str,"",MB_OK);
}
Dll测试工程中的DllClass.h内容:
//此处在dll的头文件中为 dllexport,在应用文件中为dllimport
#define DLLCLASS_API __declspec(dllimport)
//导出一个类(包括其方法、属性)
class DLLCLASS_API CDllClass
{
public:
CDllClass(void);
void MSG(const char* const str);
};
Dll测试工程中DllClassTest.cpp内容:
首部:
#include "DllClass.h"
class DllClass;
代码部分:
CDllClass CTest;
CTest.MSG("this is a string into dll");
legendhui
2005-02-17
打赏
举报
回复
xx
kingzai
2005-02-17
打赏
举报
回复
http://codeguru.earthweb.com/Cpp/W-P/dll/article.php/c3637/
SatanLi1982
2005-02-17
打赏
举报
回复
不知到楼主指的是那一种,如果是隐式调用直接:
包含XXDLL.lib(Dll带的lib文件)和头文件就可以了
如果是显示调用比较麻烦,你搜搜,以前的帖子有讨论的。
Python如何
调用
DLL
库?——实例详解及代码
Python如何
调用
DLL
库?——实例详解及代码在Python
中
,您可以通过
调用
DLL
库完成各种功能,来满足不同的需求。
调用
DLL
库意味着从外部获取了一些函数,可以在Python
中
直接
调用
这些函数,这对于Python程序员来说是一种非常有用的技能。本文将为大家介绍如何在Python
中
调用
DLL
库。我们可以通过ctypes工具包访问动态链接库(
DLL
)。ctypes提供了与C语言兼容的数据
类
型,并支持用Python编写的Python模块的函数
调用
。
C#如何
调用
DLL
?
3. 确保
DLL
在路径
中
:将
DLL
文件放在你的应用程序的输出目录
中
(例如,Debug或Release文件夹),或者将其放在系统的PATH环境变量
中
指定的目录
中
。你需要指定
DLL
的名称和要
调用
的函数名。3. 封装
DLL
调用
:在C++/CLI项目
中
,使用#include来包含你的非托管
DLL
的头文件,并编写托管代码来封装
DLL
中
的函数。5.
调用
封装的方法:在你的C#代码
中
,通过C++/CLI
类
库提供的托管接口来
调用
非托管
DLL
中
的函数。4. 添加引用:在你的C#项目
中
,添加对C++/CLI
类
库的引用。
C++
调用
dll
的方法
在C++
中
,为了支持重载机制,在编译生成的汇编码
中
,要对函数的名字进行一些处理,加入比如函数的返回
类
型等等.而在C
中
,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的。
dll
的开发者可以通过
dll
隐藏接口的代码实现,比如你只想让其他人使用你的算法,但不想让其他人知道你的算法和逻辑代码,就可以把它们封装到
dll
中
。动态
调用
不是链接时完成的,而是在运行时完成的,动态
调用
不会在可执行文件
中
写入
DLL
相关的信息,而是直接
调用
dll
中
的函数。
如何动态
调用
DLL
中
的导出
类
动态
调用
导出函数是常见的做法, 但我如何用qlibrary动态
调用
导出
类
呢? dunniu 2011-04-06 10:46
DLL
动态链接库是程序复用的重要方式,
DLL
可以导出函数,使函数被多个程序复用,
DLL
中
的函数实现可以被修改而无需重新编译和连接使用该
DLL
的应用程序。作为一名面向对象的程序员,希望
DLL
可以导出
类
,以便在
类
的层次上实现复用。
java
调用
dll
传参_求教高手:有关
DLL
调用
中
参数传递问题???
使用JNI
调用
DLL
中
的函数,
DLL
中
函数原形:SendMsg(longCommIndex,char*Msg,boolChinese);在JAVA
类
中
写成如下声明:publicnativelongMySendMsg(longCommIndex,StringMsg,booleanChinese);JAVA
中
调用
如下:System.out.println(mysm.MySendMs...
进程/线程/DLL
15,473
社区成员
49,171
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章