指针错误,大家来看看这个怎么回事,就差一点了(100分)

  • 主题发起人 主题发起人 吴剑明
  • 开始时间 开始时间

吴剑明

Unregistered / Unconfirmed
GUEST, unregistred user!
在普通的应用程序里,我试过:
var
b : integer;
begin
b := integer(Query);
.....
datasource1.dataset := pointer(b)
end;
是成功的,在DBGRID上能看到传过来的数据集。
于是我想,能不能在COM里面,先传出一个QUERY的整数,在程序里再把它转成指针,
这样不就能在DBGRID里显示COM组件的查询结果了么。于是我试了一下:
在COM里有一个属性Rs,定义为:
result := integer(query1)
返回一个整型。
在程序里写如下代码:
b : integer;
begin
a := createcomobject(class_mycom) as Imycom
a.dosql //先运行一个SQL
datasource1.dataset := pointer(a.Rs)
end;
奇怪的是,编译通过了,但运行到了 datasource1.dataset := pointer(Rs) 这里,
就出了个指针错误的提示。但是这时,RS属性确实已经获得了COM里的查询结果集。这个
我已经证实了。但就是不能通过DBGRID来显示。
请老大门指教
 
你干麻要用com提供数据集?
直接提供不行吗?
 
需求要求这样干。:)
 
我也不董,对不起
 
对不起,COM我不懂。不过我想能不能先:
b:=a.RS;
datasource.dataset:=pointer(b);
 
应该是地址空间不同的问题吧。
 
都没解决问题:)
 
同意BaKuBaKu,COM组件和你的程序不是同属一个地址空间
 
>>但是这时,RS属性确实已经获得了COM里的查询结果集。这个我已经证实了。

如何证实的?不妨说来听听?
 
道理很明白其实DLL和COM是一样的唯一的区别就是DLL中的类不可以重载而COM可以.
你的问题和前两天一位仁兄提出的有关DLL的调用是一个类型.地址的映射并没有问题,
问题是查询结束后的数据传递.数据集已经获得,这我相信但你应该用内存流来传递数
据.我常这么干!



 
温柔一刀 :
我把 ADOQUERY1 := RS
可以得到由COM传回来的数据集。所以就证明了。:)

barton :
请老大详细指点
 
请教!!
 
>>我把 ADOQUERY1 := RS可以得到由COM传回来的数据集。所以就证明了。:)

既然如此,你就在“后面”继续写datasource.dataset:=ADOQUERY1;难道不行?
如果这样,那倒真是有点见鬼了...,需要研究一下...
 
温柔一刀 :
您说对了,就是不行。:)
着急啊
 
老大们指教啊
 
把详细的错误信息贴出来看看.
 
错误就是 : 指针错误 啊
 
(再详细一点)

也就是说,ADOQUERY1 := RS之后,可以用ADOQUERY1.first;ADOQUERY1.fieldbyname('myfield').asstring;
但是datasource.dataset:=ADOQUERY1;就出指针错?

你可不要告诉我你使用什么别的方法“证明”的。
 
因为我对Delphi的ADO控件不熟,所以我仅仅从COM的观点谈谈我的看法.
1.在COM的世界里,将一个对象的指针当作整数来传递有失稳妥,出问题也是在所难免
请记住,Delphi的ADO控件包装的是ADO COM对象.
2.建议你传递_Recordset(这只是我在VC++里用的,没在Delphi里试过) , 方法如下:
在Delphi的Type Library Editor里Import ADO;
定义一个方法来取得你的Recordset,比如:
function Ttest.Method1(out rs: _Recordset): HResult;
begin
_Recordset:=Query.Recordset;
end;

虽然我很喜欢Delphi,但是做COM/MTS/COM+,个人认为还是VC++最好.


 
多人接受答案了。
 
后退
顶部