问题没解决就结帖了,接着问接着送分!

时间:2021-10-23 19:01:25
原问题:在COM组件里经常要加入一些新的类,而调用COM组件的客户程序不知道这些类的具体结构,希望每次在COM加入新类时,客户程序通过读一个配置文件(这个文件中记录着COM中类名称和类中域和方法的名称),就能实例COM中的类,并调用类的方法。请问如何做才能使客户程序在每次COM中加入新类时都不必进行扩展并重新编译?如果COM没有办法,还有没有其他技术可以完成?谢谢回答。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
有人说让服务器端支持OLE自动化,客户集成一个脚本引擎就可以了,但我的COM组件和客户程序都是用VC写的啊,能在VC的程序里加入脚本引擎吗?
又有人说做成COM插件,但是如果加入两个新类(例如customer1,customer2)了,我在我的客户程序要做的是把这两个类所对应的两个实例的各个域赋值,例如:customer1.getX()=customer2.getA();customer1.getY()=customer2.getB();........
问题是新加入类之后客户程序如何能知道这个新类有什么方法呢?

12 个解决方案

#1


可以将类的GUID写入到注册个中特定位置,让客户程序自己读取。可以加入脚本引擎支持,这个在codeproject上有文章说明

#2


"请问如何做才能使客户程序在每次COM中加入新类时都不必进行扩展并重新编译"
似乎很难啊。
如果有人可以给出一份完整的方案就利害了。

#3


可以将类的GUID写入到注册个中特定位置,让客户程序自己读取。可以加入脚本引擎支持,这个在
~~~~~~~~~~~~~~~~~~请问哪里可以找到一个关于它的简单的文档或是示例啊?

codeproject上有文章说明

#4


可以将类的GUID写入到注册个中特定位置,让客户程序自己读取。可以加入脚本引擎支持,这个在codeproject上有文章说明
~~~~~~~~~~~~~~~~~~~~~~~刚刚看完它上面COM专栏的文章,没有讲如何加入脚本引擎的啊?

#5


不好解决啊

#6


问题是新加入类之后客户程序如何能知道这个新类有什么方法呢?
---------------------------------

你想怎么表现给客户程序????

说清楚

#7


我想让客户程序在启动时读取一个配置文件,里面记录着客户加入到COM中的类的名称,域以及方法,
这样客户程序就可以实例化这个新类,并操作他的方法了,但是从配置文件中读入的是字符串啊,字符串信息是无法转化成类信息的啊(例如:char *s="dog";class (*s)并不能得到一个dog实例啊)。

#8


在VC中使用COM组件有三种方法:
1.利用COM库函数使用代码组件(CoCreateInstance()等函数)
2.通过ClassWizard来使用组件(用类型库)
3.利用#import指令来使用组件(智能指针)
我一般用第二种,有人说第三种服务器改了,客户端可以不改,即是智能的,我没有试过,楼主不妨试一试。是不是这样!!!

#9


加入新类话,用智能指针也不行啊。。。。。。。。。。。。

#10


晕。首先你应该把问题描述清楚。你这个问题实际没有什么价值。回答你的问题是,可以实现你的意图。但是实际没人喜欢这样干。你可以通过你的配置文件将com对象的所有方法及属性都用xml描述出来,同时你的所有接口都是dual的。然后你调用方法或获取属性都使用IDispath::Invoke方法。没问题
你的想法实现了。你甚至可以用脚本实现com组件的开发,看看msdn上的"Writing COM Objects with Scripting Languages".但是实际使用价值不大。

#11




----------------------------------------
相信自己,相信明天!

快给我分,不然我抢的啦^_^
----------------------------------------
                       时光.漫步

#12


我感觉这好像没什么用处啊,按照你说的,服务器端加入了新的类(Class1、Class2),客户代码不必改变,也就是说客户代码是在加入新的类之前写的,那么在服务器端加入Class1、Class2之前客户端并不能调用它们了,也就是说客户端只能调用新版本的服务器!那又为什么不直接调用呢?

#1


可以将类的GUID写入到注册个中特定位置,让客户程序自己读取。可以加入脚本引擎支持,这个在codeproject上有文章说明

#2


"请问如何做才能使客户程序在每次COM中加入新类时都不必进行扩展并重新编译"
似乎很难啊。
如果有人可以给出一份完整的方案就利害了。

#3


可以将类的GUID写入到注册个中特定位置,让客户程序自己读取。可以加入脚本引擎支持,这个在
~~~~~~~~~~~~~~~~~~请问哪里可以找到一个关于它的简单的文档或是示例啊?

codeproject上有文章说明

#4


可以将类的GUID写入到注册个中特定位置,让客户程序自己读取。可以加入脚本引擎支持,这个在codeproject上有文章说明
~~~~~~~~~~~~~~~~~~~~~~~刚刚看完它上面COM专栏的文章,没有讲如何加入脚本引擎的啊?

#5


不好解决啊

#6


问题是新加入类之后客户程序如何能知道这个新类有什么方法呢?
---------------------------------

你想怎么表现给客户程序????

说清楚

#7


我想让客户程序在启动时读取一个配置文件,里面记录着客户加入到COM中的类的名称,域以及方法,
这样客户程序就可以实例化这个新类,并操作他的方法了,但是从配置文件中读入的是字符串啊,字符串信息是无法转化成类信息的啊(例如:char *s="dog";class (*s)并不能得到一个dog实例啊)。

#8


在VC中使用COM组件有三种方法:
1.利用COM库函数使用代码组件(CoCreateInstance()等函数)
2.通过ClassWizard来使用组件(用类型库)
3.利用#import指令来使用组件(智能指针)
我一般用第二种,有人说第三种服务器改了,客户端可以不改,即是智能的,我没有试过,楼主不妨试一试。是不是这样!!!

#9


加入新类话,用智能指针也不行啊。。。。。。。。。。。。

#10


晕。首先你应该把问题描述清楚。你这个问题实际没有什么价值。回答你的问题是,可以实现你的意图。但是实际没人喜欢这样干。你可以通过你的配置文件将com对象的所有方法及属性都用xml描述出来,同时你的所有接口都是dual的。然后你调用方法或获取属性都使用IDispath::Invoke方法。没问题
你的想法实现了。你甚至可以用脚本实现com组件的开发,看看msdn上的"Writing COM Objects with Scripting Languages".但是实际使用价值不大。

#11




----------------------------------------
相信自己,相信明天!

快给我分,不然我抢的啦^_^
----------------------------------------
                       时光.漫步

#12


我感觉这好像没什么用处啊,按照你说的,服务器端加入了新的类(Class1、Class2),客户代码不必改变,也就是说客户代码是在加入新的类之前写的,那么在服务器端加入Class1、Class2之前客户端并不能调用它们了,也就是说客户端只能调用新版本的服务器!那又为什么不直接调用呢?