VB中引用ocx控件,是静态载入该控件的吗?

Gothic_girl 2009-09-03 08:38:33
问题描述:

通过vc/mfc生成了一个ocx控件,在vb中调用,后因项目变更,ocx接口实现逻辑发生了变化,但是这个对外接口本身并未改变。使用时候发现,卸载原控件,重新注册新版本ocx后,vb程序运行调用逻辑还是原来的ocx版本接口。

现想请教如下几个问题:
1 VB中引用ocx控件,是静态载入该控件的吗?即在工程编译时候已经载入了ocx接口的相关逻辑,而不是运行时候根据clsid去找到ocx并进行调用的?
2 是否有办法在不重新编译vb程序的前提下,更新ocx版本?(接口不变,逻辑改变)
...全文
810 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gothic_girl 2009-09-10
  • 打赏
  • 举报
回复
收到,试试先···
Tiger_Zhao 2009-09-08
  • 打赏
  • 举报
回复
还有对应的 oca 文件也要先删除。
Tiger_Zhao 2009-09-08
  • 打赏
  • 举报
回复
Visual Studio 6 中有个工具 OLE View,你到 Type Libraries 分支下查看你 OCX 的类型库名称:
1)是否存在同名的多个项目
2)项目中 ocx 文件的路径是否是你注册新版本的路径
将所有不是新版本的 ocx 注销掉,重新注册新版本。
记得 VB 要先关闭。
Gothic_girl 2009-09-07
  • 打赏
  • 举报
回复
??难道源码中的clsid不是?
PctGL 2009-09-06
  • 打赏
  • 举报
回复
你那个叫臆测
Gothic_girl 2009-09-06
  • 打赏
  • 举报
回复
......
Gothic_girl 2009-09-05
  • 打赏
  • 举报
回复
逻辑改变的意思就是,接口不变,但是其中逻辑代码改变

例如一个接口,接收一个输入参数,本来返回这个参数和a的和,后来变成返回和b的和

由于修改逻辑时候还是ocx原有的工程,故clsid等都不会变化
贝隆 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 slowgrace 的回复:]
你的问题是:
如果你不想重新编译VB程序,如何更新ocx版本?

楼上的答复共有2种方法:
(1)按照老张的说法,如果你不想重新编译VB程序,那你就把新的.ocx文件直接覆盖老的.ocx文件就行了。可是我怀疑这样不行,
(2)解注册老控件,注册新控件。据楼主说这样会异常。

正确的办法是什么?


[/Quote]


对!
slowgrace 2009-09-04
  • 打赏
  • 举报
回复
你的问题是:
如果你不想重新编译VB程序,如何更新ocx版本?

楼上的答复共有2种方法:
(1)按照老张的说法,如果你不想重新编译VB程序,那你就把新的.ocx文件直接覆盖老的.ocx文件就行了。可是我怀疑这样不行,
(2)解注册老控件,注册新控件。据楼主说这样会异常。

正确的办法是什么?

wozhidaode 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 veron_04 的回复:]
使用OCX前请先注册控件,注册了请在:部件 中添加引用。给你一个手工注册OCX控件的工具,很方便。
http://download.csdn.net/source/1627047
[/Quote]
下来看看
PctGL 2009-09-04
  • 打赏
  • 举报
回复
是vb引用非vb的控件,你说那些是vb做的控件,现在是vb exe + vc ocx

如果lz能够确定 clsid 没有被修改的话可以直接引用,更新时覆盖即可,
只要你确保,所有exe在编辑时已确定的接口不会发生接口函数名字,
参数等任何改变,程序执行时也不会有什么问题的,相反倒是有一定好处

另外什么叫逻辑改变?接口函数的实现代码?接口函数的声明?
sonic_andy 2009-09-04
  • 打赏
  • 举报
回复
看看Table1,就知道哪些GUID改变了,哪些没改变:->
sonic_andy 2009-09-04
  • 打赏
  • 举报
回复
还可以参考MSDN中的这篇文章,这里贴不下,发到BLOG中了:
http://blog.csdn.net/sonic_andy/archive/2009/09/04/4520931.aspx
sonic_andy 2009-09-04
  • 打赏
  • 举报
回复
是二进制兼容还是工程兼容呢?
二进制兼容一般不会有问题.
工程兼容的话,已经编译的程序用它就会出问题.
因为工程兼容的模块会重新生成除类库LIBID外的所有GUID

摘自MSDN:

何时需要使用版本的兼容性


增强软件部件时,Visual Basic 提供了两种保持向后兼容的机制— 即“版本兼容”特性和 Implements 特性。

版本兼容性
对于用早期版本编译的程序,Visual Basic 的“版本兼容”特性可以在保持向后兼容的同时增强部件。“属性”对话框“部件”选项卡的“版本兼容”包含三个选项:

“不兼容”:每次编译部件时都会生成新的类型库,包含新的类 ID 和新的接口 ID。在部件的各个版本之间没有任何关系,使用某一版本编译的程序无法使用以后的版本。


“工程兼容”:每次编译部件时都会生成新的类型库— 但类型库的标识符将保留,这样测试工程能够保留对部件工程的引用。所有来自以前版本的类 ID都保留;只有对同以前版本不再二进制兼容的类才更改接口 ID。
注意 这是 Visual Basic 5.0 的工程兼容的改变,如果任意一个类不再是二进制兼容了,那么该工程所有的类 ID 和接口 ID 都将改变。

重点 在释放部件的兼容版本方面,“工程兼容”和“不兼容”一样。

“二进制兼容”:当您编译工程时,如果检测到任何二进制不兼容的更改,将会为您显示一个对话框。如果您选择接受警告,部件将保留类型库标识符和类 ID。只有对不再是二进制兼容的类,才更改接口 ID。这同工程兼容性的行为相同。
然而,如果您选择忽略警告,部件也会保留接口 ID。只有在当编译器决定更改是在过程 ID 中,或是一个方法的签名,该选项才可用。

小心 如果您绝对肯定所做的修改不会影响兼容性,那么应该只选择“忽略”按钮。如果您不是绝对的肯定,请选择安全的做法并且选择“Accept”按钮,以允许接口 ID 能够被更改。

重点 违反编译器警告的选项代表了一个从 Visual Basic 5.0 的更改。在继续进行该选项之前,对不兼容更改的含义有全面的了解是非常重要的。


注意 谈论“版本兼容”时,通常是指“二进制兼容”。

下面介绍如何适当使用这些选项。

使用 Implements 语句实现兼容性
Implements 语句允许向类模块中增加多个接口,这在《Visual Basic 程序员指南》的“部件设计的一般准则”里的“多态性、接口、类型库和 GUID”和“通过接口的实现提供多态性”,以及“用对象编程”的“多态性”中介绍。

多接口可以使系统不断进化,无需破坏已有部件或进行大量的重新编译,因为已释放的接口永远不会改变。另一方面,可以通过创建新接口向系统增加新的功能。

这种方法非常接近部件对象模块 (COM) 的设计思想,而 ActiveX 规范正是基于部件对象模块的。

注意 “版本兼容”的“二进制兼容性”选项与 Implements 和多接口一起使用时是很有用的,可以防止对类的缺省接口的修改。

什么时候使用“版本兼容”选项
如果决定使用“版本兼容”特性,下面这些规则对于决定何时使用不同的选项会有所帮助:

使用“不兼容”终止兼容性
如果是在已有部件的新版本上开始工作,那么进行增强的唯一办法就是打破向后兼容性。此时,在第一次编译工程时设置“不兼容”。这可以保证在开始时标识符清单是空白的,而已有的程序不会错误地试图使用不兼容的版本。

在编译不具有兼容性的现有工程之前,还要

修改部件的文件名,使不兼容的版本不会覆盖用户硬盘上以前的版本。


改变工程属性对话框的通用选项卡上的工程名称,使不兼容的部件具有不同类型的库名。这就可确保部件提供的对象将具有唯一程序 ID 。
在“二进制版本兼容性的级别”中详细讨论了这些项目。

用“不兼容”进行编译后,切换到“工程兼容”简化开发任务。

在进行新的开发时使用“工程兼容”
开发部件的第一个版本时应使用“工程兼容”。“工程兼容”保留类型库标识符,这样就不需要经常设置测试工程对部件工程的引用了。

使用“工程兼容”还可以使测试时在部件工程和已编译部件之间切换更加容易。

“工程兼容”在“工程兼容性:避免引用丢失”中讨论。

对已有部件的新版本使用二进制兼容性
如果希望用早期版本编译的应用程序能够在新版本下工作,那么在开发任何部件的第二个版本时应该切换到“二进制兼容”。

切换到“二进制兼容”在相关主题“为兼容性提供参考点”中讨论。

不要混用二进制兼容性和多接口
如果使用多接口和 Implements 语句来提供向后兼容性,不要使用“二进制兼容”修改已定义为使用 Implemens 的抽象接口。

要增强部件的任何一个接口,Visual Basic 会修改接口的 ID。通过增加接口来改进软件的技术依赖于接口不变性。就是说接口一旦定义就永不修改— 包括接口 ID。

详细信息 关于使用多接口来设计部件软件的详细信息请参阅“部件设计的一般准则”的“通过接口的实现提供多态性”。“维护二进制兼容性”介绍了 Visual Basic 用来防止兼容性问题的版本系统。
Gothic_girl 2009-09-04
  • 打赏
  • 举报
回复
classid 是一样的,相当于只是原有的ocx工程代码中的接口逻辑更新,重新编译,并更新注册,但是···
PctGL 2009-09-04
  • 打赏
  • 举报
回复
总之不能用vb里面那个引用对话框来直接引用对象,那样的话,对象的版本什么的都被指定了,就不可能实现跨版本调用了,即便对象名字都一样,他们内部的 clxxid 是不一样的,所以不要引用,要在运行时动态创建
PctGL 2009-09-04
  • 打赏
  • 举报
回复
dim xx as object
xx = createobject("xxxx")

call xx.xx

这样来,前提是无论ocx怎么升级,而主程序不升级的话,也只能调用固定接口了
如果这样不行的话, 只能完全的自己做了,就象sdk写窗口程序一样的办法,从几个系统接口api实现实例对象
贝隆 2009-09-03
  • 打赏
  • 举报
回复
使用OCX前请先注册控件,注册了请在:部件 中添加引用。给你一个手工注册OCX控件的工具,很方便。
http://download.csdn.net/source/1627047
chinaboyzyq 2009-09-03
  • 打赏
  • 举报
回复
1.先用 regsvr32 /u your.ocx 解除服务注册
2.再用 regsvr32 c:\your.ocx 重新注册
试试,不行的话再如下:

注册信息,应该在注册表里,打开注册表编辑器,查找 你的.ocx信息把它们全部删除,然后再重新注册你的新版本,再调试一下看看.

Gothic_girl 2009-09-03
  • 打赏
  • 举报
回复
能否请教一下,现在遇到的 卸载原控件并注册新版本控件后,调用版本异常的原因可能是什么
加载更多回复(2)

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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