描述:
原问题:在COM组件里经常要加入一些新的类,而调用COM组件的客户程序不知道这些类的具体结构,希望每次在COM加入新类时,客户程序通过读一个配置文件(这个文件中记录着COM中类名称和类中域和方法的名称),就能实例COM中的类,并调用类的方法。请问如何做才能使客户程序在每次COM中加入新类时都不必进行扩展并重新编译?如果COM没有办法,还有没有其他技术可以完成?谢谢回答。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
有人说让服务器端支持OLE自动化,客户集成一个脚本引擎就可以了,但我的COM组件和客户程序都是用VC写的啊,能在VC的程序里加入脚本引擎吗?
又有人说做成COM插件,但是如果加入两个新类(例如customer1,customer2)了,我在我的客户程序要做的是把这两个类所对应的两个实例的各个域赋值,例如:customer1.getX()=customer2.getA();customer1.getY()=customer2.getB();........
问题是新加入类之后客户程序如何能知道这个新类有什么方法呢?
解决方案1:
我感觉这好像没什么用处啊,按照你说的,服务器端加入了新的类(Class1、Class2),客户代码不必改变,也就是说客户代码是在加入新的类之前写的,那么在服务器端加入Class1、Class2之前客户端并不能调用它们了,也就是说客户端只能调用新版本的服务器!那又为什么不直接调用呢?
解决方案2:
----------------------------------------
相信自己,相信明天!
快给我分,不然我抢的啦^_^
----------------------------------------
时光.漫步
晕。首先你应该把问题描述清楚。你这个问题实际没有什么价值。回答你的问题是,可以实现你的意图。但是实际没人喜欢这样干。你可以通过你的配置文件将com对象的所有方法及属性都用xml描述出来,同时你的所有接口都是dual的。然后你调用方法或获取属性都使用IDispath::Invoke方法。没问题
你的想法实现了。你甚至可以用脚本实现com组件的开发,看看msdn上的"Writing COM Objects with Scripting Languages".但是实际使用价值不大。
在VC中使用COM组件有三种方法:
1.利用COM库函数使用代码组件(CoCreateInstance()等函数)
2.通过ClassWizard来使用组件(用类型库)
3.利用#import指令来使用组件(智能指针)
我一般用第二种,有人说第三种服务器改了,客户端可以不改,即是智能的,我没有试过,楼主不妨试一试。是不是这样!!!
"请问如何做才能使客户程序在每次COM中加入新类时都不必进行扩展并重新编译"
似乎很难啊。
如果有人可以给出一份完整的方案就利害了。
问题是新加入类之后客户程序如何能知道这个新类有什么方法呢?
---------------------------------
你想怎么表现给客户程序????
说清楚
可以将类的GUID写入到注册个中特定位置,让客户程序自己读取。可以加入脚本引擎支持,这个在codeproject上有文章说明