*寻求解释* 我用VB6写的OCX怎么无法导入到DELPHI5中? (内含300分) (100分)

  • 主题发起人 主题发起人 chinaplate
  • 开始时间 开始时间
C

chinaplate

Unregistered / Unconfirmed
GUEST, unregistred user!
我用VB6写了一个OCX控件,它封装了微软的控件MSCOMM32.OCX(读写串口的),用它来和
一个串口设备通讯。在VB和PB中调用一切正常。
可是,我用D5,Component->Import ActiveX Control->Install,将其导入,未提示此部件已
安装信息。在相应的组件页上找不到此控件。

是不是VB做的OCX在DELPHI中用还要经过一些处理?
 
这是生成的.pas文件,其中根本没有Register过程。

unit ocxMeter_TLB;

// ************************************************************************ //
// WARNING
// 。。。。。
// ************************************************************************ //

// PASTLWTR : $Revision: 1.88.1.0.1.0 $
// File generated on 01-11-9 15:45:26 from Type Library described below.

// ************************************************************************ //
// Type Lib: D:/program/commOcx/ocxMeterOk.ocx (1)
// IID/LCID: {CF7AE0E4-B3C9-11D2-A9CB-0050BAA840FC}/0
// Helpfile:
// DepndLst:
// (1) v2.0 stdole, (C:/WINDOWS/SYSTEM/STDOLE2.TLB)
// (2) v4.0 StdVCL, (C:/WINDOWS/SYSTEM/STDVCL40.DLL)
// ************************************************************************ //
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
interface

uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL;

// *********************************************************************//
// GUIDS declared in the TypeLibrary. Following prefixes are used:
// Type Libraries : LIBID_xxxx
// CoClasses : CLASS_xxxx
// DISPInterfaces : DIID_xxxx
// Non-DISP interfaces: IID_xxxx
// *********************************************************************//
const
// TypeLibrary Major and minor versions
ocxMeterMajorVersion = 8;
ocxMeterMinorVersion = 0;

LIBID_ocxMeter: TGUID = '{CF7AE0E4-B3C9-11D2-A9CB-0050BAA840FC}';

IID__Meter: TGUID = '{F7D5FC9C-D525-11D5-9077-0050BA41D673}';
DIID___Meter: TGUID = '{F7D5FC9D-D525-11D5-9077-0050BA41D673}';
CLASS_Meter: TGUID = '{CF7AE0E6-B3C9-11D2-A9CB-0050BAA840FC}';
type

// *********************************************************************//
// Forward declaration of types defined in TypeLibrary
// *********************************************************************//
_Meter = interface;
_MeterDisp = dispinterface;
__Meter = dispinterface;

// *********************************************************************//
// Declaration of CoClasses defined in Type Library
// (NOTE: Here we map each CoClass to its Default Interface)
// *********************************************************************//
Meter = _Meter;


// *********************************************************************//
// Interface: _Meter
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {F7D5FC9C-D525-11D5-9077-0050BA41D673}
// *********************************************************************//
_Meter = interface(IDispatch)
['{F7D5FC9C-D525-11D5-9077-0050BA41D673}']
function Get_HaveOpened: WordBool; safecall;
function Get_MyInput: WideString; safecall;
function Get_MyWeight: Double; safecall;
procedure OpenMe(var Cmd: WideString); safecall;
procedure CloseMe; safecall;
property HaveOpened: WordBool read Get_HaveOpened;
property MyInput: WideString read Get_MyInput;
property MyWeight: Double read Get_MyWeight;
end;

// *********************************************************************//
// DispIntf: _MeterDisp
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {F7D5FC9C-D525-11D5-9077-0050BA41D673}
// *********************************************************************//
_MeterDisp = dispinterface
['{F7D5FC9C-D525-11D5-9077-0050BA41D673}']
property HaveOpened: WordBool readonly dispid 1745027074;
property MyInput: WideString readonly dispid 1745027073;
property MyWeight: Double readonly dispid 1745027072;
procedure OpenMe(var Cmd: WideString); dispid 1610809348;
procedure CloseMe; dispid 1610809349;
end;

// *********************************************************************//
// DispIntf: __Meter
// Flags: (4240) Hidden NonExtensible Dispatchable
// GUID: {F7D5FC9D-D525-11D5-9077-0050BA41D673}
// *********************************************************************//
__Meter = dispinterface
['{F7D5FC9D-D525-11D5-9077-0050BA41D673}']
end;

implementation

uses ComObj;

end.
 
看看这个,你会很痛苦的。[:)][:D][:D][:D][:)]
http://www.delphibbs.com/delphibbs/dispq.asp?lid=496774
 
谢谢yzhshi。。。。。
痛苦中。。。。。。。

我确是曾经在D5中安装过此控件,现在才知道,当时D5未打补丁。当时能安装上,
但也不能正常使用。我刚刚找了个未打补丁的D5一试,确实如此。

除了痛苦,除了重写,还有什么可以做的吗?
有请有识之士。。。。

 
一个办法,找一台能够安装的计算机,有的肯定能够安装。
安装完成后,将pas和dcu等文件拷贝过来Import Component。
 
办法不错,确实搞定了。
但还是不能用。"interface not supported"
哎,怎一个叹字了得。

 
将VB中所有涉及中文的全部干掉,或者使用E文的VB编译,然后实验一下。
这种方法我曾经实验成功过。
 
没成功,
我要放弃这个VB做的控件,以后也不用VB写了。

可是我仍然想弄明白这是怎么回事?
VB用不同的方式实现COM,到底是什么方式?具体有什么不同?

先等等其他人吧,过几天发分。
 
建议你将这个问题一直保留着,然后提前。
看大家是是否还有解决方案。
总感觉应该有解决方案的。
 
OK,我直接把你的帖子也贴上来。
 
---------------------------------------------------------------------------------------------
来自:yzhshi, 时间:2001-4-9 12:34:00, ID:496774
1、在VB中制作的ActiveX控件,在Delphi下使用,为什么在有的计算机上能够安装成功,
有的计算机上安装不上?(不出错,安装完成后不提示任何信息,也没有出现控件)(100分)。
2、VB中制作ActiveX控件时,使用自定义或者VB控件本身的方法(Method),为什么在Delphi中
一调用就出现错误?(有多种出错可能,最常见的是地址错误)(400分)


来自:hubdog, 时间:2001-4-9 12:56:00, ID:496783
VB制作的activeX控件不是规范的ActiveX控件,存在很多问题,
甚至在VC++中调用一样会有这样那样的问题.

要写真正意义上的ActiveX控件还是应该用VC++或Delphi


来自:yzhshi, 时间:2001-4-12 12:46:00, ID:499812
现在控件已经使用VB编写出来了,难道必须向Delphi移植吗?


来自:yzhshi, 时间:2001-4-12 12:55:00, ID:499826
我明明当初加了500分,怎么变成了100分。
各位答完后,我一定将分数补上。



来自:yzhshi, 时间:2001-4-18 20:05:00, ID:508405
难道真的没人遇到过同样问题吗?


来自:yzhshi, 时间:2001-4-23 17:43:00, ID:514667
看来只有等强制分配分数了,苦哇,100分没有得到任何有意义的建议。
还好,当初写错了,否则500大洋就全没了。呵呵……


来自:吕雪松, 时间:2001-4-25 12:55:00, ID:514908
要怪就怪M$把,现在VB都被抛弃了……


来自:yzhshi, 时间:2001-4-25 13:01:00, ID:514924
不会吧,VB是微软的拳头产品,甚至比VC还有市场……
而且我的问题怪在VB生成的控件在VC下没问题,在Delphi下却出这样那样的问题。
还有,第一个问题不仅仅是VB的控件,Delphi自己的RX控件,安装时也经常出类似的问题。


来自:myradio, 时间:2001-9-10 10:34:00, ID:618247
我用delphi 很好


来自:Boat, 时间:2001-10-16 21:07:00, ID:676563
VB 写出来的并不是真正的 ActiveX ,不论由 VC 或 Delphi 调用 VB 的 ActiveX 控件都不会成功.


来自:yzhshi, 时间:2001-11-8 10:19:00, ID:715329
真的很久没有来大富翁了,不过这个问题直径也没有结果。
至于VB编写的控件,我编写的那个在VC下调用没有问题,但是就是不能在Delphi下玩。


来自:zhangkan, 时间:2001-11-8 10:27:00, ID:715347
VB中VC是一家的,当然没有问题了.我用VB的MSCOMM控件,在Delphi下就老是有问题,我也想不
出好法子.


来自:Oldtiger, 时间:2001-11-8 21:28:00, ID:717505
你试用VB7重新编译一次看看,或许VB6是有些固有的毛病的

to zhangkan:
Mscomm不会出问题的呀!问题是你在使用的时候必须先注册
如果在没有注册的机器上运行,则可在程序中添加一个注册控件先注册
我就是这样做的,完全没问题呀!


来自:TangDL, 时间:2001-11-9 8:48:00, ID:718105
我也有同样的问题,在CSDN与DFW上有帖提问,至今无人解决,
理论上应是VB开放的接口不完全符合COM标准,但VS内部对其作了支持,
如果你的控件在VB能用的话,在VC下也应能用,
我现在的解决方法是用VC写一个控件包容一下VB的控件,
现在工作正常,事件、方法调用、运行一切正常

BTW:
VB7重新编译我不知会不会解决问题(我没用过),
VB控件仅在未打补丁的Delphi5中注册成功,其它皆不行(包括CBuilder)
不管注册成不成功,对VB控件的调用是绝对不会成功的
当然你重写VCL就不一定了



来自:yzhshi, 时间:2001-11-15 13:40:00, ID:731403
与兄感触颇多,就将分数送给你吧。
以后如果有哪位大侠将此问题解决,我再加200分!


得分大富翁:TangDL-100,

---------------------------------------------------------------------------------------------

 
*****************************************
** 注:至此,此贴100分已归yzhshi。 **
** 我另出300分寻求此问题的合理解释。**
*****************************************
 
我没有作出任何成绩,干脆,寻找给出合理解释的一起给他400分吧。
好像我也应该出一些分来,因为我也想知道这个答案,我们每人出200分,
有好的答案,我再拿出200分。OK!
 
支持vb ocx 的软件只有两个:vb 和 ie。除此之外就没有了。节哀。
 
不是,有的计算机上的Delphi就可以导入VB的Ocx控件,但是有的就不行,是使用同样一个OCX的。
 
我正在学习。。。。。
祝大家有好发现
 
用regsvr32手工注册这个ocx
然后在程序中动态创建?
我有时候就这么干.

唉,越来越发现自己什么都不懂.
 
动态创建需要做的工作太多了,属性赋值,事件赋值……
按照ActiveX的理论,一切都应该是水到渠成的,但是,事实上……
 
无奈,结束了吧。
 
后退
顶部