100分请问自己开发ocx控件的版本兼容问题

高手都到碗里来 2009-07-13 08:45:51
我有一个ocx控件,用这个控件开发了一个程序,后来这个程序的代码没有了,只剩下exe文件。

后来我又用这个ocx控件开发了另外一套程序,不过这个时候ocx控件已经做了很多修改了。
现在需要在一台电脑上同时运行新旧2套程序,这个时候问题就来了,如果安装了新的软件,原来的程序就会运行不了。

这个ocx控件,我一直都是用工程兼容方式编译的,现在如果用不兼容方式编译,那现在的程序就要改很多东西,工程量之大超乎想象~~~哭


不知道高手们有没有什么好的办法?比如能不能通过clsid调用?(我估计clsID可能不一样)
...全文
234 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinull 2009-10-28
  • 打赏
  • 举报
回复
困惑中
lyserver 2009-07-14
  • 打赏
  • 举报
回复
我以经常使用的Shell.Application为例,演示如何不使用ProgID而是直接使用CLSID生成接口实例,具体代码如下:

'* ******************************************** *
'* 模块名称:test.bas
'* 功能:演示如何直接通过CLSID生成接口实例。
'* 作者:lyserver
'* 联系方式:http://blog.csdn.net/lyserver
'* ******************************************** *
Option Explicit
Private Type GUID
data1 As Long
data2 As Integer
data3 As Integer
data4(7) As Byte
End Type
Private Const S_OK As Long = &H0
Private Declare Function CoCreateInstance Lib "ole32.dll" (clsid As GUID, ByVal pUnkOuter As Long, ByVal dwClsContext As Long, riid As GUID, pvObj As Any) As Long
Private Const CLSCTX_INPROC_SERVER As Long = &H1
Private Declare Function IIDFromString Lib "ole32.dll" (ByVal lpszIID As Long, iid As GUID) As Long
Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpszCLSID As Long, clsid As GUID) As Long

Sub main()
Dim shApp As Object
Dim clsid As GUID, iid As GUID
Const IID_IDispatch As String = "{00020400-0000-0000-C000-000000000046}"
Const CLSID_IShell As String = "{13709620-C279-11CE-A49E-444553540000}"

'以下三条语句用来创建Shell.Application接口实例,
' 相当于VB中Set shApp=CreateObject("Shell.Application")语句
If IIDFromString(StrPtr(IID_IDispatch), iid) <> S_OK Then Exit Sub
If CLSIDFromString(StrPtr(CLSID_IShell), clsid) <> S_OK Then Exit Sub
If CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER, iid, shApp) <> S_OK Then Exit Sub

'用VB的方式调用接口的一个属性
MsgBox shApp.Windows.Count

'释放接口
Set shApp = Nothing
End Sub
Tiger_Zhao 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 bloom8848 的回复:]
唉,请问怎么样才能通过clsid而不是progid加载控件呢?[/Quote]
不是加载的问题,而是同一个 ProgID 不能注册两份。所以必须改工程名。
zz005 2009-07-14
  • 打赏
  • 举报
回复
学习
贝隆 2009-07-13
  • 打赏
  • 举报
回复
重新注册一次你的控件
1、在运行中卸载对该OCX文件的注册,具体做法: 开始-》运行-》输入:regsvr32 XXX.ocx /u 回车
2、将Windows\System32(或者System)目录下 的该OCX文件删除
3、将该OCX文件再次复制到System32目录下
4、注册改OCX控件,具体做法: 开始-》运行-》输入:regsvr32 XXX.ocx 回车

这样你就完成了对该控件的注册,你可以在VB环境的:工程-》部件中添加对该控件的引用
  • 打赏
  • 举报
回复
2楼的方法是可行,不过如果用2楼的方法,我新的程序只要用到这个ocx的地方都需要重新写代码,
如果是动态加载的地方还好,如果是直接画控件的就麻烦了
  • 打赏
  • 举报
回复
我用Me.Controls.Add加载新的控件有问题,
如果是直接拉的控件,运行起来是没有问题的

所以现在的主要问题是Me.Controls.Add中如何区分新旧版本?
孤独剑_LPZ 2009-07-13
  • 打赏
  • 举报
回复
2楼的方法是可行的,不妨试试
  • 打赏
  • 举报
回复
唉,请问怎么样才能通过clsid而不是progid加载控件呢?
cqq_chen 2009-07-13
  • 打赏
  • 举报
回复
是比较烦人!
我碰到同样的问题,还是注册相同的ProgID的方法好用一些.
Tiger_Zhao 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chinayuppie 的回复:]
将\windows\system\下的.ocx删掉,分别在新旧程序安装目录下放新旧.ocx文件可不可以啊[/Quote]
不能,注册的 ProgID 相同。
booksoon 2009-07-13
  • 打赏
  • 举报
回复
将\windows\system\下的.ocx删掉,分别在新旧程序安装目录下放新旧.ocx文件可不可以啊
Tiger_Zhao 2009-07-13
  • 打赏
  • 举报
回复
工程兼容方式每次编译的 GUID 都不一样,所以不能新旧两个同名(ProgID)控件同时注册。

其实修改起来也很方便:
1)修改 OCX 所在的工程名
比如,该工程的 vbp 文件中,将 Name="Project1" 更改为 Name="Project9"
2)更改所有控件引用 ProgID
假定控件名为 UserControl1,用文本替换工具将所有代码中出现的 Project1.UserControl1 替换成 Project9.UserControl1
3)重新编译成不同名称的 OCX,就可以同时注册使用新旧两个 OCX。
  • 打赏
  • 举报
回复
我晕,在google里搜索到这个帖子里来了,搞笑
东方之珠 2009-07-13
  • 打赏
  • 举报
回复
ocx控件提供的接口参数要支持你的旧程序就好了。
  • 打赏
  • 举报
回复
我正在查找如何调用不同版本ProgID的方法
clear_zero 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tiger_zhao 的回复:]
引用 8 楼 bloom8848 的回复:
2楼的方法是可行,不过如果用2楼的方法,我新的程序只要用到这个ocx的地方都需要重新写代码,
如果是动态加载的地方还好,如果是直接画控件的就麻烦了
用文本替换工具直接对源文件进行替换,而不是在代码窗口中替换。
[/Quote]

同意这个,觉得这个是最保险的方法
而且你的ocx还会不断改进的
zhonghbmarker 2009-07-13
  • 打赏
  • 举报
回复
共同探讨,学习下!
lyserver 2009-07-13
  • 打赏
  • 举报
回复
可以通过clsID生成COM对象,相关函数为Private Declare Function CoCreateInstance Lib "ole32" (rclsid As Any, ByVal pUnkOuter As Long, ByVal dwClsContext As Long, riid As Any, ByVal ppv As Long) As Long
Tiger_Zhao 2009-07-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bloom8848 的回复:]
2楼的方法是可行,不过如果用2楼的方法,我新的程序只要用到这个ocx的地方都需要重新写代码,
如果是动态加载的地方还好,如果是直接画控件的就麻烦了[/Quote]
用文本替换工具直接对源文件进行替换,而不是在代码窗口中替换。

1,453

社区成员

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

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