讨论一下dll中如何使用动态连接输出一个类

comet 2001-07-13 06:28:50
如题!
...全文
212 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qianying 2001-07-18
  • 打赏
  • 举报
回复
.
comet 2001-07-14
  • 打赏
  • 举报
回复
to:oceanheart
你的方法我试过了。是可以的。
但是调用程序还是需要包含头文件。
能不包含头文件而实现吗?

to:xxxbird
上次我的那个关于打印的问题有没有帮我考虑?
是不是使用memdc后图像变成了一副位图,而打印机打印位图的白色部分时是会有斑点的??
david4no 2001-07-14
  • 打赏
  • 举报
回复
在你的类的声明文件中!定义一个类似于下面的语句!
#ifdef I_WANT_EXPORT
#define EXPORT_CLASS __declspec(dllexport)
#else
#define EXPORT_CLASS __declspec(dllimport)
#endif

class EXPORT_CLASS CExportClass{};
然后在你的类实现中!在包含类声明的.h语句的前面定义I_WANT_EXPORT即
#define I_WANT_EXPORT
#include "类声明的.h"
即可输出一个类了!最后实现类!即可
oceanheart 2001-07-14
  • 打赏
  • 举报
回复
最好的办法是使用COM技术,输出接口指针。
如果不想用COM,那你可以试试这种办法:
把你要输出的成员函数都定义成虚函数,把要输出的成员变量都用函数封装起来,
例如:GetXXXX();SetXXXX(int xxxx);
然后在调用的程序里定义一个纯虚类,函数定义的顺序一定要和DLL中完全一致,
这样就可以调用了。调用方使用的是重新定义的类对象指针,但因为两方的虚方法表
完全相同,因此调用的是DLL中的正确的函数。
cchuocp 2001-07-14
  • 打赏
  • 举报
回复
在你的h文件的类名前加上 __declspec(dllexport),如下(两个下划线):
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };

xxxbird 2001-07-14
  • 打赏
  • 举报
回复

MSDN, DLLHUSK

comet 2001-07-14
  • 打赏
  • 举报
回复
非常感谢oceanheart和llshore
comet 2001-07-14
  • 打赏
  • 举报
回复
to:oceanheart
我回去试试你的方法。
comet 2001-07-14
  • 打赏
  • 举报
回复
to:david4no
我要显式连接。你那样行吗?
VH 2001-07-14
  • 打赏
  • 举报
回复
只有用“MFC扩展动态连接库”才能输出类,方法是在类定义前面加上宏AFX_EXT_CLASE例如:
class AFX_EXT_CLASS CMyClass : public CObject
{
。。。
};
在应用程序中同样要有类似的类定义。
llshore 2001-07-14
  • 打赏
  • 举报
回复
TO:oceanheart
真正参考COM的实现方法是:
///////GControlDef.h 一个公用的头文件,在DLL与外部工程中包含
#ifndef __GCONTROLDEF_H__SHORE__
#define __GCONTROLDEF_H__SHORE__

class IGraphControl
{
public:
virtual DWORD GetGraphStyle() = 0;
virtual void SetGraphStyle(DWORD) = 0;
virtual void SetGraphTitle(LPCSTR) = 0;
virtual void SetIndexText(int,LPCSTR) = 0;
virtual void SetGroupText(int,LPCSTR) = 0;
virtual void SetValue(int,int,double) = 0;
virtual void Release() = 0;
};
#endif //__GCONTROLDEF_H__SHORE__

//// WrappedInfo.h : DLL工程中的一个类定义文件,用于实现上述接口
#include "GControlDef.h"
class CWrappedCtl : public CStatic, public IGraphControl
{
……
//实现IGraphControl中定义的所有纯虚函数
}
//DLL的一个引出函数
AFX_EXT_API BOOL CreateWrappedControl(IGraphControl** ppIOut)
{
*ppIOut = NULL;
CWrappedCtl *pGControl = new CWrappedCtl;
if(pGControl == NULL)
return FALSE;
if(!pGControl->Create(NULL, WS_CHILD,
CRect(0, 0, 0, 0), (CWnd*)GetParentGrid()))
return FALSE;
*ppIOut = (IGraphControl*)pGControl;
return TRUE;
}

to:comet(comet)
你想不包含头文件使用一个类么?程序中不认识一个类如何使用类中定义的方法?

comet 2001-07-13
  • 打赏
  • 举报
回复
我曾想在dll中建一个输出函数,该函数返回类实例的指针。
如;
MyClass* GetInstance()
{
MyClass *instance=new MyClass;
return instance;
}
这样调用程序就可以得到一个类实例的指针变量,但是却不知道如何调用类的成员变量、函数。
如果能把这个问题解决就行了。
oceanheart 2001-07-13
  • 打赏
  • 举报
回复
只能在MFC扩展动态库中输出类,方法是在类定义前面加上宏AFX_EXT_CLASE或AFX_CLASS_EXPORT,例如:
class AFX_EXT_CLASS CTestObj : public CObject
{
。。。
};
comet 2001-07-13
  • 打赏
  • 举报
回复
什么类都可以。有成员变量、成员函数、虚函数.......
wjyasd 2001-07-13
  • 打赏
  • 举报
回复
是可以在动态连接库中如何导出类吧?
火鸟33 2001-07-13
  • 打赏
  • 举报
回复
说清楚点--什么类
WhiteWaterBlueSky 2001-07-13
  • 打赏
  • 举报
回复
动态连接!?
可以吗?
NowCan 2001-07-13
  • 打赏
  • 举报
回复
GetProcAddress里用类名。
哈哈,瞎猜的。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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