被拉去维护VB6代码,要将几个控件打包成一个OCX,当中引用了几个*.TLB,遭遇到:同名的接口,参数却不同,怎么破?

myfav 2020-10-23 12:16:48
一个控件引用olelib.tlb,另一个控件引用oleguids3.tlb。
可怕的是,这两个tlb都兢兢业业、勤勤恳恳地实现了一堆同名的接口:

IoleClientSite
IoleControlSite
IoleInPlaceActiveObject
IoleInPlaceFrame
IoleInPlaceSite
IoleInPlaceUIWindow
IoleObject
IoleWindow
IUnknown

然而,两个tlb定义接口的参数却完全不同!
试图打包生成OCX时,重名的接口,不同控件的调用,便乱成了一锅粥!
举个例子:
A控件原本引用oleguids3.tlb的IoleObject、IoleInPlaceActiveObject、IoleInPlaceSite,一切正常;
B控件原本引用olelib.tlb的IoleObject、IoleInPlaceActiveObject、IoleInPlaceSite,也一切正常;
然而打包到一个工程之后,似乎有且只有一个IoleObject、IoleInPlaceActiveObject、IoleInPlaceSite是优先使用的,于是就变成了:
A控件错误地引用了olelib.tlb的IoleObject、IoleInPlaceActiveObject、IoleInPlaceSite,一切完全不正常了!

有没办法指定A控件引用且只能引用oleguids3.tlb的重名接口?比方说,VB有没有类似这样的语法:
olelib :: IoleObject、olelib :: IoleInPlaceActiveObject、olelib :: IoleInPlaceSite
oleguids3 :: IoleObject、oleguids3 :: IoleInPlaceActiveObject、oleguids3 :: IoleInPlaceSite
即,用“命名空间”来区分接口呢?

求救大侠们,有没有办法解决这种重名问题?
...全文
703 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
myfav 2020-11-12
  • 打赏
  • 举报
回复
非常感谢大侠的提示!我拿“对象浏览器”查看了一下,果真有陷阱!——文件名并不等于库名!哈哈哈哈。
舉杯邀明月 2020-11-11
  • 打赏
  • 举报
回复
注意看一下,已经执行到函数体中了。
如果有“变量类型未定义”的问题,是不能正确启动程序的。
(实际我是在那儿设置了断点,然后“全编译执行”后中断的。)

所以说,用正确的“库.类型”形式来定义变量,是完全合法的。
舉杯邀明月 2020-11-11
  • 打赏
  • 举报
回复
你要弄清楚你的“类库名”是什么。
oleguids3.tlb 的文件名是“oleguids3”;
 但任意tlb的“类库名”未必是跟文件名相同!

它们可能相同,也可以“完全不同”的。
具体是什么,可以通过对象浏览器来查看一下。
给你一个截图,参考一下。
myfav 2020-10-26
  • 打赏
  • 举报
回复
引用 2 楼 舉杯邀明月 的回复:
解决方法也很简单,在变量定义时,指定 “库.类型”就行了。 楼主也可以试一下在那些“接口名”前强制指定是哪个库的接口。
非常感谢您的指教!不过我反复试验了好多遍,类似以下语句皆无法通过编译: Dim pOleObject As oleguids3.IOleObject 或 Dim pOleObject As oleguids3.tlb.IOleObject 都不行!在编译时,VB6永远会弹出错误提示: 编译错误: 用户定义类型未定义 应该如何写“库.类型”,您能否举一两个例子?非常感谢!
无·法 2020-10-26
  • 打赏
  • 举报
回复
现在还在维护的vb系统应该是上世纪残留的了吧
舉杯邀明月 2020-10-25
  • 打赏
  • 举报
回复
我还没遇到过你这样的“接口冲突”,
不过我的一个软件中遇到过“数据类型”冲突。

其实在tlb和模块中的“同名数据类型”的定义是完全一样的,
 但编译时他会提示“类型不匹配”。 
解决方法也很简单,在变量定义时,指定 “库.类型”就行了。
(不过最终的方案是把模块中的“重名类型”定义给删除了)

楼主也可以试一下在那些“接口名”前强制指定是哪个库的接口。
脆皮大雪糕 2020-10-23
  • 打赏
  • 举报
回复
控件A控件B分别编译,然后新建控件C分别引用控件A和B进行展现。 然后应用只要引用控件C就完成了……
内容概要:本文介绍了一种基于多目标粒子群算法(MOPSO)的微电网优化调度模型,综合考虑风能、光伏、储能系统、柴油发电机、燃气轮机以及与主电网之间的能量交互等多种分布式能源的协同运行。通过构建以运行本最小化、碳排放最低化和系统可靠性最优化为目标的多目标优化模型,利用Matlab平台实现MOPSO算法求解,完对微电网在不同运行场景下的能量管理与调度方案优化。该模型能够有效平衡经济性与环保性之间的关系,适用于含多类型分布式电源的复杂微电网系统,具有较强的工程应用价值和科研参考意义; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事微电网、智能电网、综合能源系统、可再生能源集与优化调度等领域研究的专业人士; 使用场景及目标:①用于多能源耦合微电网系统的协同优化调度研究;②支持多目标智能优化算法在能源系统中的建模与求解实践,帮助用户掌握MOPSO在实际工程问题中的应用方法;③为学术论文复现、毕业设计、科研项目开发提供完整的代码实例与技术支撑; 阅读建议:建议读者结合Matlab代码与理论文档,深入理解目标函数构建、约束条件处理及Pareto最优解集生机制,重点关注算法参数设置、多目标权衡分析与结果可视化,并可通过调整能源配置或引入新约束进行二次开发与创新研究。

864

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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