怎么调用dll中的类?

cococut 2005-02-17 02:05:42
我的dll中有类A,类B,
我怎么能够这样的调用
A a;
a.fun();
B b;
b.fun2();
...全文
1510 9 打赏 收藏 转发到动态 举报
写回复
用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/Librarymodules:下填写对 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

#defineDLLCLASS_API__declspec(dllexport)

//导出一个类(包括其方法、属性)
classDLLCLASS_APICDllClass
{
public:
CDllClass(void);
voidMSG(constchar*conststr);
};

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文件)和头文件就可以了

如果是显示调用比较麻烦,你搜搜,以前的帖子有讨论的。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧