¥请活跃于软件前沿的高手回答:如何实现不同发布者类的继承¥

yesry 2003-06-25 04:51:30
类似于COM。
甲编写了 class A;发布了目标代码,不会发布全部源代码,只能发布class的部分说明。
乙编写了 class B:public A;
由于class A只有部分函数说明和部分成员的声明,所以,乙开发的时候发生困难,virtual函数表可能不完全,所以可能不能对齐。成员变量更不用说了,更难对齐。
例如:
甲开发了
class MyClass
{
public:
virtual void F1()
{
ShowMessage("MyClass F1 in dll");
}
int x,y;
};
class MyClass2:public MyClass
{
public:
virtual void F1()
{
MyClass::F1();
ShowMessage("MyClass2 F1 in dll");
}
};
extern "C"
__declspec(dllexport) MyClass * WINAPI CreateMyClass()
{
return new MyClass2;
}
发布的时候
class MyClass
{
public:
virtual void F1()
{
//实现的源代码不会发布的。
}
int x,y;
};


对于乙。
//从甲处得到
class MyClass
{
public:
virtual void F1()
{
//实现的源代码不会发布的。
}
int x,y;
};

class MyB:public MyClass
{
virtual void F1()
{
MyClass::F1();//重要问题:如何调用没有源代码的甲的实现方法?如果可以,还能实现MyClass2::F1的功能。
x=1;y2=3;//两边都能访问。
}
};
MyClass * (*CreateMyClass)();
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HMODULE h;
h=LoadLibrary("Class.dll");
(void*)CreateMyClass=GetProcAddress(h,"CreateMyClass");
MyClass *c=CreateMyClass();//到了这里,我不能实现了,我的原意是实现MyB的实例创建的。
c->F1();
}

不知道大家看明白了没有,我的意思是:甲发布部分源代码和目标代码,乙继承甲发布的class,并且使用、扩充甲的class的功能。然后,更高级的是,甲能调用没有发布任何源代码的乙的目标代码。我们知道COM有继承性,但是成员变量不好访问,并且函数参数类型极其有限。

这些问题都是开发系统软件必备的。请各位高手讨论讨论,对大家都有好处。
...全文
33 71 打赏 收藏 转发到动态 举报
写回复
用AI写文章
71 条回复
切换为时间正序
请发表友善的回复…
发表回复
心平至和 2003-07-18
  • 打赏
  • 举报
回复
建立扩展MFC DLL,就可以实现。
新建->工程->MFC DLL。就这样,真的很行,我试过。
kingcaiyao 2003-07-18
  • 打赏
  • 举报
回复
To aweay:
IUnknown接口中的三个虚拟函数都有实现(请注意虚拟函数与该函数有没有实现是不同的),三个函数虚拟表明它们可以被其派生类重载。当然,在不同的应用中,用户的接口可根据需要来重载这三个函数,比如说IDispatch接口, IDispatch接口的主要目的就是为了那些不支持VTable(Virtual Function Table)的语言如VB等支持COM编程,因此IDispatch接口重载了AddRef,Release这两个函数,还有两个就是它自已的函数GetIDsOfNames和Invoke,还有一点要强调的是函数因为需要改变其default action而进行override,但你不能说这个函数在其父类中没有实现。
事实上,在BCB中,对于双接口(由VTable来实现),每一个接口事实上在虚拟函数表中的前7个入口,即:
IUnknown QueryInterface
IUnknown AddRef
IUnknown Release
IDispatch AddRef
IDispatch Relase
IDispacth GetIDsOfNames
IDispatch Invoke
。。。。。
接下来的入口就会存放你在接口中定义的属性和方法。
kingcaiyao 2003-07-18
  • 打赏
  • 举报
回复
To aweay:
我并不认为这个问题一定要从IUnknown接口继承来解决。我程序中定义的接口大部分都是从IDispatch继承下来的,一般我都是用TLB来生成的,我并没有写IDL来实现。同时,IUnknown接口中的三个方法并不是全部没实现,其中QueryInterface就应该有实现,当我们用IDispatch接口在客户端调用COM接口中的函数时,程序在执行时首先就是通过QueryInterface函数来取得IDispatch接口的指针,然后就是我们熟悉的用GetIDsOfNames和Invoke方法来激活接口中的属性或方法。至于你说AddRef及Release这两个函数没有实现,AddRef,Release,QueryInterface当然都是虚拟函数,但它们是不是全部都是pure virtual function?大胆地说一句,不一定。

还有一点我想说的是,BCB中对于COM接口下的函数并不是所有的数据类型都可以作为参数,单纯从编译器的角度来讲,这要看TVariant是否有此类型的运算符operator,大家可以跟踪代码便知道无论是输入参数还是输出参数,都是用TVariant封装来处理。
kingcaiyao 2003-07-18
  • 打赏
  • 举报
回复
To aweay:


书生 2003-07-18
  • 打赏
  • 举报
回复
up
extractman 2003-07-15
  • 打赏
  • 举报
回复
dx?
yesry 2003-07-15
  • 打赏
  • 举报
回复
dx
extractman 2003-07-15
  • 打赏
  • 举报
回复
我猜想搂住的想法是这样的:

甲公司开发的 乙公司开发的
Class A class B:public A
------------- 用A的指针访问B -------------
| A的成员 |-----------------> | B的成员 |
| | | |
| | B可以访问直接A | |
公布的成员 | | <---------------- | |
-------------------------------------------------------------
公布后修改 | | | |
| | | |
------------- | |
| |
-------------
心平至和 2003-07-15
  • 打赏
  • 举报
回复
用扩展MFC不错,它可以实现你的想法。MFC就是这样实现的。
Siney 2003-07-14
  • 打赏
  • 举报
回复
例如:
Variant vSmallint(short(3));
Variant vInteger(4);
Variant vSingle(float(5));
Variant vDouble(double(6));

Variant vCurrency(Currency(7));

Siney 2003-07-14
  • 打赏
  • 举报
回复
variant可以传递任何基本参数,也就是如下参数类型是可以的:
short
• int
• float
• double
• Currency
• TDateTime
• bool
• WordBool
• Byte
• AnsiString&
• char *
• wchar_t * const
• Ole2::IDispatch* const
• Ole2::IUnknown* const //注意这里,所以如果你的类继承自IUnknown就...


Siney 2003-07-14
  • 打赏
  • 举报
回复
to yesry()
你上面的代码和com有关系吗?

另外,干脆你把你的代码贴出来,我帮你改好了。
Siney 2003-07-14
  • 打赏
  • 举报
回复
//dll中创建MyClass的后裔(在Exe声明和实现),在dll所创建的MyClass的后裔还在exe中使用。

这句话不明白,对于CreateClass(int index,MyClass **result)
这样的函数肯定是没有问题的,因为dx很多都是这样的函数。
yesry 2003-07-14
  • 打赏
  • 举报
回复
class MyClass
{
public:
AnsiString ss;//这只是代表,有很多成员class,
void *p;//只是代表,我有很多链表。
};

我想在“COM”中实现以下函数
CreateClass(int index,MyClass **result)
{
//功能是产生一个MyClass的实例
}


但是,这只是我的一个功能。我想做的真正目的是:
dll中创建MyClass的后裔(在Exe声明和实现),在dll所创建的MyClass的后裔还在exe中使用。

也许我说得不是很清楚,由于是未曾出现的技术,所以才稀里糊涂。
blankman 2003-07-12
  • 打赏
  • 举报
回复
gz
yesry 2003-07-11
  • 打赏
  • 举报
回复
class A
{
public:
A(){;}
~A(){;}
int i;
AnsiString name;
};
void __fastcall TForm1::Button1Click(TObject *Sender)
{
A *a=new A;
a->name="yyy";
Variant v=a;
Variant v=*a;//此句不通过

A *b;
b=(A*)v;//此句不通过

Caption=b->name;
}
//---------------------------------------------------------------------------
Siney 2003-07-11
  • 打赏
  • 举报
回复
你怎么不明白呢?
你只管创建你的类,COM会负责参数传递得,除非你要把接口指针作为参数传递,这个时候才要涉及参数列集得问题,而很多时候没有必要这样设计接口,除非(当且仅当)需要回调,而使用varint类包装参数,就什么都可以传递了。
yesry 2003-07-11
  • 打赏
  • 举报
回复
请各位大侠弄清楚我的原意:
dll中创建MyClass的后裔(在Exe声明和实现),在dll所创建的MyClass的后裔还在exe中使用。
yesry 2003-07-11
  • 打赏
  • 举报
回复
谁能回答我:
函数
int MyFunction(LABCDEFG_My_Class *theClass,int index);//LABCDEFG_My_Class是我定义的类

是否可以在COM(IUnknow 或后裔什么的)中实现?

kingcaiyao(AKing)、 Aweay(BCB绝对实力派) 总是绕一个大弯而没有正面回答,真不知是否需要RMB?如果可以,我们谈谈。

尤其是 Aweay(BCB绝对实力派):“或者你直接使用Varint类型的变量,什么都可以。”什么都可以?好像COM的函数的参数类型很有限,何来“什么都可以”?
Siney 2003-07-10
  • 打赏
  • 举报
回复
综上所述,楼主的想法是可以实现的,建议你去看看COM包容和参数列集的书。
加载更多回复(51)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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