游戏开发论坛

 找回密码
 立即注册
搜索
查看: 9694|回复: 28

我的C++引擎如何和VB6交互的问题

[复制链接]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2008-6-26 18:44:00 | 显示全部楼层 |阅读模式
实在太难。而且,令人哭笑不得的是:

我在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 一样!
而且,好处是,这种脚本,直接支持:我的“那个设计模式”!

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-6-26 19:42:00 | 显示全部楼层

Re:我的C++引擎如何和VB6交互的问题

我正在封装 CStr 的 COM. 先把常用小类封装下,找找感觉。
按理说也可以在 VB 内部重写 CStr,但那是重复劳动。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-6-27 14:34:00 | 显示全部楼层

Re:我的C++引擎如何和VB6交互的问题

感觉只有1中方法可以拯救我的代码:

编写“重构”工具----把C++代码翻译成VB6或.NET!

我说过,我的C++代码参考了一些VB6和.net的东西,所以,翻译代码,总可以吧。
(不过最近是不考虑这个的阿)
要么,就不如不动C++代码,而发明一个脚本语言。

2种方法哪一种经济用哪一种。

11

主题

747

帖子

752

积分

高级会员

Rank: 4

积分
752
发表于 2008-6-27 23:52:00 | 显示全部楼层

Re:我的C++引擎如何和VB6交互的问题

我觉得答案你自己都说了。问题和结果你都知道了,甚至还有了解决办法,加油吧,最好的结果是自己的总结。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-6-30 02:42:00 | 显示全部楼层

Re:我的C++引擎如何和VB6交互的问题

不,以上帖子仍然没有满意解决我得问题。差的还不少。
不过,昨天想出来了。实验过,很好。。。http://bbs.gameres.com/showthread.asp?threadid=112771

61

主题

1429

帖子

1430

积分

金牌会员

Rank: 6Rank: 6

积分
1430
发表于 2008-6-30 07:59:00 | 显示全部楼层

Re:我的C++引擎如何和VB6交互的问题

用什么语言,什么方法不是很重要,做出游戏才是王道

11

主题

747

帖子

752

积分

高级会员

Rank: 4

积分
752
发表于 2008-7-1 02:27:00 | 显示全部楼层

Re: Re:我的C++引擎如何和VB6交互的问题

使命召唤: Re:我的C++引擎如何和VB6交互的问题

用什么语言,什么方法不是很重要,做出游戏才是王道

多实在,好好学学,少吹牛,多做事。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2008-7-1 06:51:00 | 显示全部楼层

Re: Re: Re:我的C++引擎如何和VB6交互的问题

jnmao: Re: Re:我的C++引擎如何和VB6交互的问题


多实在,好好学学,少吹牛,多做事。


早旧做出来过了,你做过什么?写过几行代码?

11

主题

747

帖子

752

积分

高级会员

Rank: 4

积分
752
发表于 2008-7-1 12:20:00 | 显示全部楼层

Re:我的C++引擎如何和VB6交互的问题

小样,可别问我这些问题,不是我托大,我开始写basic的时候你还不知道计算机长什么样呢。

15

主题

2093

帖子

2093

积分

金牌会员

Rank: 6Rank: 6

积分
2093
发表于 2008-7-1 14:47:00 | 显示全部楼层

Re:我的C++引擎如何和VB6交互的问题

不交互的就没问题了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 10:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表