社区
进程/线程/DLL
帖子详情
怎么调用dll中的类?
cococut
2005-02-17 02:05:42
我的dll中有类A,类B,
我怎么能够这样的调用
A a;
a.fun();
B b;
b.fun2();
...全文
1510
9
打赏
收藏
怎么调用dll中的类?
我的dll中有类A,类B, 我怎么能够这样的调用 A a; a.fun(); B b; b.fun2();
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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文件)和头文件就可以了
如果是显示调用比较麻烦,你搜搜,以前的帖子有讨论的。
Windows进程常用
DLL
模块注入技术
进程调试级注入,涉及调试器相关功能
调用
知识点
dll
模块重定位内存注入,模拟操作系统加载PE文件方式,直接将
dll
文件内存数据写入目标进程并执行。 导入表注入,涉及PE相关知识点,增加区段,移动导入表,增加导入...
Python如何
调用
DLL
库?——实例详解及代码
Python如何
调用
DLL
库?——实例详解及代码在Python
中
,您可以通过
调用
DLL
库完成各种功能,来满足不同的需求。
调用
DLL
库意味着从外部获取了一些函数,可以在Python
中
直接
调用
这些函数,这对于Python程序员来说是一种非常有用的技能。本文将为大家介绍如何在Python
中
调用
DLL
库。我们可以通过ctypes工具包访问动态链接库(
DLL
)。ctypes提供了与C语言兼容的数据
类
型,并支持用Python编写的Python模块的函数
调用
。
如何动态
调用
DLL
中
的导出
类
动态
调用
导出函数是常见的做法, 但我如何用qlibrary动态
调用
导出
类
呢? dunniu 2011-04-06 10:46
DLL
动态链接库是程序复用的重要方式,
DLL
可以导出函数,使函数被多个程序复用,
DLL
中
的函数实现可以被修改而无需重新编译和连接使用该
DLL
的应用程序。作为一名面向对象的程序员,希望
DLL
可以导出
类
,以便在
类
的层次上实现复用。
如何
调用
DLL
中
的
类
通过 _declspec(
dll
export)可以
调用
DLL
中
的
类
,下面是一个简单的例子。class simple in test.
dll
//simple.hclass _declspec(
dll
export) simple{public: simple(); void Set(float x, float y) { _x = x; _y = y;} float Get() {
动态加载
调用
DLL
里的
类
转自:http://blog.chinaunix.net/uid-283792-id-2448559.html 动态加载动态连接库能更加有效地使用内存,这在大型项目
中
是非常有用的一项技术。
DLL
中
的函数可以很容易的实现动态加载
调用
,网上也有很多相关的介绍,但
DLL
中
类
库怎样实现动态加载
调用
呢? 这是我在实际项目
中
遇到的一个问题,可以采用
类
工厂方法,把对象的指针导出来的方法解决这
进程/线程/DLL
15,471
社区成员
49,181
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章