接口的实现? 怎样实现VB中的Recordset与delphi进行数据交换?其中接口怎样实现???简单的说就是VB传一个RecordSet到delphi中,delphi实现数据的保存等功能? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 换句话说就是VB中的ADO对象RecordSet对应delphi中哪个类型? delphi中的ADO也有RecordSet试试看 TADORecordSet这个类在哪个单元呢?还有接口怎样实现? VB中的ADO对象RecordSet对应delphi中TCustomADODataSet.RecordSet但是怎样结合起来我就不太清楚了。 首先要告诉你的是: VB和DELPHI各自都对ADO的RECORDSET有额外的包装,想要直接通过类型转换的话是行不通的。其次:VB和DELPHI都有原生ADO对象,这个是所有语言都一样的,你必须先找到这个原生ADO对象。记得是在adointf.pas里有,你看看,我机器上没有DELPHI。另外告诉你,试图直接传递ADO对象RecordSet给外面去用,并不是一个好的设计方式。 找到ADO原生对象后,可以通过直接类型转换,把他转换成和DELPHI的RECORDSET相同的类型。实在不行的话,可以用IDISPATCH试下: With TVarData(Value) do if VType = varDispatch then Result := IDispatch(TVarData(Value).VDispatch) as _Recordset TO foxnt能不能具体的说一下,因为小弟刚接触接口方面的知识,所以在许多方面还不懂!请指教 在 Delphi 中导入 ADO 的类型库后,就可以像在 VB 中一样使用原始的 ADO 对象了!procedure test();var adoc: _Connection; ador: _Recordset;begin …… adoc := CreateOleObject('ADODB.Connection') as _Connection; ador := CreateOleObject('ADODB.Recordset') as _Recordset; ……end;要在 Delphi 中使用 VB 传来的 RecordSet,可以把 VB 的 RecordSet 作为变体参数传入,在 Delphi 中将之转化为 _Recordset 接口类型,就能够使用了。 delphi中变体参数怎样转化为_RecordSet? OleVariant-->_RecorSet怎样转换? var v: OleVariant; ador: _Recordset;begin ador := IDispatch(v) as _Recordset; …… 转换的时候发生错误Could not convert variant of type (ByRef Variant) into type (Dispatch) 是 IDispatch, 不是 Dispatch! 是呀,我也是用IDispatch的,但是出现上面的错误 var v: OleVariant; i: IDispatch;begin i := IDispatch(v);end;我刚试过,没问题啊! 编译通过,但在asp中引用该接口出现错误 我觉得如果使用delphi开发asp程序的话应该没有这样麻烦,好像李维的书中介绍过,就是在开始的new的时候选择asp开发,然后delphi中的组件就可以正常使用。开发完成后,程序生成一个asp对象,然后在asp程序中调用这个对象的各种方法就可以了。如果还要转化接口什么的话,就没有必要使用delphi开发了。 那我就帮不了你了。可能你传给 Delphi 程序的参数有问题,这个参数应该是你在 vb 中创建的 Recordset 对象的 IDispatch 接口指针,以 OleVariant 形式传递。如果参数有问题,在 Delphi 程序中就会产生异常! VB传的参数就是Recordset对象,delphi中的方法参数类型是OleVariant(In) vb 我很久没用了。不知道在 vb 中可不可以获得 IDispatch 接口? 可以先把 Recordset 转化成 IDispatch ,再作为 Variant 传递 to leapmars能不能试过的发个Mail[email protected]万分感激 to leapmars把你试过的例子发个Mail 统一转换到IDISPATCH,不明白你为什么喜欢转成OleVariant? 接口实际上就是个指针,当variant传递就行了. 你把DELPHI的RECORDSET接口转为IDISPATCH,然后交给VB,再由VB转为RECORDSET。反过来也一样。(当然,前提是你的RECORDSET为ADO类型的RECORDSET,而不是DELPHI的RECORDSET) 你不要受某些书的影响,总是把某些类型转为OLEVARIANT,这种转化既没有效率,也增加你自己的开发难度。就象你现在的问题,转为IDISPATCH就什么问题都没有了。 to zjhnwlh: 怎么你的问题还没解决吗? 如果 vb 支持 IDispatch 接口类型,就像楼上 foxnt 说的,当然可以把它作为参数类型。我昨天给你发的例子,传递的就是 IUnknown 接口指针,道理是一样的! 当然如果 vb 不直接支持 IDispatch 接口类型,就只有用变体了。 http://expert.csdn.net/Expert/topic/1636/1636914.xml?temp=.6488001其实我想实现的是在ASP中向ActiveForm传递VB中的RecordSet对象 to leapmars其实我在delphi中能实现这个功能,但在ActiveForm中不知怎样来实现 vb 是直接支持 IDispatch 接口类型的。我们写程序的时候,就经常在VC的COM里倒出IDISPATCH,然后给VB用。很好用的,比用变体方便的多,楼主的做法其实是舍近求远。 to foxnt现在我的问题是在ASP怎样来调用或者传递VB这个RecordSet对象给ActiveForm?请帮忙,万分感谢!!! 创建 ADODB.RecordSet 对象后,得到该对象的 IDispatch 接口指针,然后把这个指针传给 ActiveForm。在 vb 中参数的传送方式应为 ByVal,如果是 ByRef,传的就是指针的地址,这就不对了。 to leapmars能不能举个例子! 你可以把我给你的例子稍作改动啊!比如:TOne = class(TAutoObject, IOne) //原来为 TOne = class(TTypedComObject, IOne)TAutoObjectFactory.Create(……) //原来为 TTypedComObjectFactory.Create(……) 在 type library editor 中把 IOne 的 Parent Interface 改为 IDispatch,并且把方法中原来传递的 IUnknown* 参数改为 IDispatch*。 客户端 IntfTst 改用 vb 实现。就 ok 了! 当然 ITwo 也要做类似改动 哪么在ASP中怎样来调用它?在VB中是OK的,在ASP中怎样来传递对象呢? ASP 和 VB 里面的使用应该差不多吧。你既然在 VB 里面已经 OK 了,那就没什么大问题了!自己试试吧。不过 ASP 用的 VBScript 只有变体类型吧,所以还是有点区别。但这些内容 上面已经讨论过了,应该不难! 我没用过 ASP,具体的也不清楚了! 在ASP中如何传递<对象>呢? COM 编程是基于接口的,传递的参数也是接口,我们上面的讨论也都是关于接口传递的,怎么楼主还在问如何传递“对象”呢?建议楼主先看看 COM 方面的知识。 已知密文文件和公钥文件,如何用Libeay32.dll中的RSA_public_decrypt()函数进行解密? 求数字加密解密的函数 修罗戏子进来拿分。 如何判断文件被锁定? 如何获得文本文件的总行数? 高分相赠,TTreeview类的重构问题,回答有分 谁有imageEn中文帮助文档,急啊!!! 如何截获系统中的所有消息(除了用钩子外,还有没有其他的办法)?? sql菜菜子,100大元 哪位大神有delphi6实例入门源代码,跪求! 关于ORACLE的连接,急啊!! 关于数据库记录锁定的问题?
还有接口怎样实现?
但是怎样结合起来我就不太清楚了。
VB和DELPHI各自都对ADO的RECORDSET有额外的包装,想要直接通过类型转换的话是行不通的。
其次:VB和DELPHI都有原生ADO对象,这个是所有语言都一样的,你必须先找到这个原生ADO对象。记得是在adointf.pas里有,你看看,我机器上没有DELPHI。
另外告诉你,试图直接传递ADO对象RecordSet给外面去用,并不是一个好的设计方式。
实在不行的话,可以用IDISPATCH试下: With TVarData(Value) do
if VType = varDispatch then
Result := IDispatch(TVarData(Value).VDispatch) as _Recordset
能不能具体的说一下,因为小弟刚接触接口方面的知识,所以在许多方面还不懂!请指教
var
adoc: _Connection;
ador: _Recordset;begin
……
adoc := CreateOleObject('ADODB.Connection') as _Connection;
ador := CreateOleObject('ADODB.Recordset') as _Recordset;
……
end;要在 Delphi 中使用 VB 传来的 RecordSet,可以把 VB 的 RecordSet 作为变体参数传入,在 Delphi 中将之转化为 _Recordset 接口类型,就能够使用了。
v: OleVariant;
ador: _Recordset;begin
ador := IDispatch(v) as _Recordset;
……
Could not convert variant of type (ByRef Variant) into type (Dispatch)
v: OleVariant;
i: IDispatch;
begin
i := IDispatch(v);
end;我刚试过,没问题啊!
能不能试过的发个Mail
[email protected]
万分感激
把你试过的例子发个Mail
反过来也一样。(当然,前提是你的RECORDSET为ADO类型的RECORDSET,而不是DELPHI的RECORDSET)
你不要受某些书的影响,总是把某些类型转为OLEVARIANT,这种转化既没有效率,也增加你自己的开发难度。就象你现在的问题,转为IDISPATCH就什么问题都没有了。
其实我在delphi中能实现这个功能,但在ActiveForm中不知怎样来实现
我们写程序的时候,就经常在VC的COM里倒出IDISPATCH,然后给VB用。很好用的,比用变体方便的多,楼主的做法其实是舍近求远。
现在我的问题是在ASP怎样来调用或者传递VB这个RecordSet对象给ActiveForm?
请帮忙,万分感谢!!!
能不能举个例子!
TOne = class(TAutoObject, IOne) //原来为 TOne = class(TTypedComObject, IOne)TAutoObjectFactory.Create(……) //原来为 TTypedComObjectFactory.Create(……) 在 type library editor 中把 IOne 的 Parent Interface 改为 IDispatch,并且把方法中原来传递的 IUnknown* 参数改为 IDispatch*。 客户端 IntfTst 改用 vb 实现。就 ok 了!
在VB中是OK的,在ASP中怎样来传递对象呢?