TDataSource

iamduo 2009-04-19 08:43:03
我想通过传递Tform到dll里,然后查找所有TDataSource来处理。如果在同一个工程里,没有错。但是移到dll里,代码就出错。
何解?

在dll中
procedure ShowPrintForm(AOwner:TForm);StdCall;export;
var a:Integer;
begin
for a:=0 to AOwner.ComponentCount-1 do
begin
if AOwner.Components[a] is TDataSource then/////////这里希望能通过,请教。
begin
ShowMessage('为什么没有呢?');
AOwner.Components[a] as TDataSource//用as就出错
TDataSource(AOwner.Components[a])//用强制转换虽然成功,但是TDataSource没有效果
end;
if AOwner.Components[a].ClassName='TDataSource' then
begin
ShowMessage((AOwner.Components[a] as TDataSource).ClassName);//报invalid typecase 之类的话
TDataSource(AOwner.Components[a])//用强制转换虽然成功,但是TDataSource没有效果
end;
end;
end;

exports
ShowPrintForm;

...全文
185 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamduo 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 iamduo 的回复:]
引用 1 楼 bdmh 的回复:
dll中使用ado的问题好像多次出现,一般的解决办法和建议都是,在使用单元加上
initialization
CoInitialize (nil);
finalization
CoUninitialize();

楼主可以试试

我现在的代码就是
//dll中
procedure test(dd:TDataSource);StdCall;export;
begin
CoInitialize(nil);
if dd is TDataSource then
ShowMessage(dd.Name)
else ShowMessage(d…
[/Quote]


个人猜想是没有办法在dll里使用TDataSource了。
10楼的经验……血的教训。
zpxfzp 2009-04-22
  • 打赏
  • 举报
回复
//用强制转换虽然成功,但是TDataSource没有效果

啥意识,转换后不能用吗?我用TButton试验了一下,可以啊!
qiume 2009-04-21
  • 打赏
  • 举报
回复
经验告诉我,不要试图向DLL传递对象,麻烦多多......
dinoalex 2009-04-21
  • 打赏
  • 举报
回复
动态库里USES单元列表有没有DB这个单元?
nanchangfantasy 2009-04-21
  • 打赏
  • 举报
回复
学习,mark
iamduo 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
dll中使用ado的问题好像多次出现,一般的解决办法和建议都是,在使用单元加上
initialization
CoInitialize (nil);
finalization
CoUninitialize();

楼主可以试试
[/Quote]
我现在的代码就是
//dll中
procedure test(dd:TDataSource);StdCall;export;
begin
CoInitialize(nil);
if dd is TDataSource then
ShowMessage(dd.Name)
else ShowMessage(dd.ClassName);
CoUnInitialize;
end;

exports
test;

//form中
procedure test(dd:TDataSource);StdCall;external testdll.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
test(DataSource1);
test(DataSource2);
end;
还是无效。


顺便我在网上查到
http://blog.csdn.net/king_xing/archive/2009/03/25/4025133.aspx
《Delphi IDE向导代码竟然有二套TDataSource的ClassType!》

郁闷中。
bdmh 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liangpei2008 的回复:]
在dll内使用主程序传入地址并用RTTI转换造成地址不一致问题!
[/Quote]
这也是一个需要注意的地方,目标进程的模块基地址就是EXE基地址,一般是0x00400000,DLL的模块加载基地址与之不同
liangpei2008 2009-04-20
  • 打赏
  • 举报
回复
在dll内使用主程序传入地址并用RTTI转换造成地址不一致问题!
bdmh 2009-04-20
  • 打赏
  • 举报
回复
dll中使用ado的问题好像多次出现,一般的解决办法和建议都是,在使用单元加上
initialization
CoInitialize (nil);
finalization
CoUninitialize();

楼主可以试试
yuehaiyang 2009-04-20
  • 打赏
  • 举报
回复
没碰到过,顶下
sparklerl 2009-04-20
  • 打赏
  • 举报
回复
Mark
CACACACACA 2009-04-20
  • 打赏
  • 举报
回复
mark

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧