• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

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

comet 2001-07-13 06:28:50
如题!
...全文
162 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
说清楚点--什么类
回复
动态连接!?
可以吗?
回复
NowCan 2001-07-13
GetProcAddress里用类名。
哈哈,瞎猜的。
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2001-07-13 06:28
社区公告

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