|
|
实在太难。而且,令人哭笑不得的是:
我在C++中实现了一些类库,来完成和 VB6 很类似的功能,比如:
Event, RefCount, RTTI, 还有一个 CStr (按照 value 使用!重载了+,=,+=)
但是这些内容,很难,包装封装倒 COM 里面,虽然“外形功能相似”。
除非按照COM规范重写所有C++代码,这是不可能的,就算改了,也会失去 C++ 的大量特性。
还有CStr,虽然VB6里也是按照 value 使用,而且有 +,= 操作符,但那是 BSTR, 不是我的 CStr。
就是说,在C++中,设计的离 VB6 的风格越近, 和 VB6 交互就反而越麻烦。。。
(还有个小麻烦是,COM 接口 和 我的C++里面的接口,类继承关系,很容易混淆。
比如, C++里有个IForm接口, 有个派生类 CForm
而封装进 COM,需要增加 IIForm, ICForm ,很恶心。)
------------哦对了,可以用 namespace 搞定,嘿嘿
换言之,VB6离开了 COM, 就会很麻烦,甚至没有办法用了。
你可以用 c++写个 dll 让VB6支持“指针”。但是,那种代码比 c++ 还难 debug, 用VB便没有意义
可以用下列 4 种方式:
1 用 dll 函数,直接包装 c++ 类,比如:
(还好俺有 RTTI 机制,嘿嘿。。。)
Sub IForm_SetPos(ByVal obj As Long, _ '// 对象的 IDynamic 指针
ByVal x As Long, ByVal y As Long, ByVal w As Long, ByVal h As Long)
这个方法内部是这样的:
if(!obj)return;
IForm *tmp = reinterpret_cast<IDynamic *>(obj)->Cast(L"inst::ui::IForm");
if(tmp) tmp->SetPos(x,y,z,w);
由于在 VB6 中类型转换不方便,创建对象的时候,总是返回 IDynamic 接口地址(Root Class)
但仍然无法很好解决 Event 的问题,而我的 C++ 的 event 是模仿VB6设计的,真实哭笑不得
2 我的引擎不生成 COM, 而让客户用 COM。
因为客户要做的是 Logic 代码,而 Logic 就是一些数学计算,不需要那么高级的 C++ 功能,
而且,VB6 创建的代码,完完全全是 COM 规范,嘿嘿。所以,让 VB6 用户生成一个 COM 是很简单的。
此外,对于 CStr ,我会封装到 VB6 里用。封装个字符串到 VB,是很简单的。
(我不会使用 VB6 的 BSTR,在 VB6 里仍然有乱码,真恶心!)
3 干脆用脚本语言,把逻辑全部用脚本写,找一种和VB6一样简单易用的脚本。
实际上,VB6本身就是一种脚本语言,只不过能编译成本地EXE代码~
但是,用第三方脚本的话,编写我的“那个设计模式”仍然不方便。。。
4 用我自己定义的高级脚本语言,语法基本和 VB6 一样!
而且,好处是,这种脚本,直接支持:我的“那个设计模式”! |
|