我想通过传递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;

解决方案 »

  1.   

    dll中使用ado的问题好像多次出现,一般的解决办法和建议都是,在使用单元加上
      initialization   
          CoInitialize   (nil);   
      finalization   
          CoUninitialize();   楼主可以试试
      

  2.   

    在dll内使用主程序传入地址并用RTTI转换造成地址不一致问题!
      

  3.   

    这也是一个需要注意的地方,目标进程的模块基地址就是EXE基地址,一般是0x00400000,DLL的模块加载基地址与之不同
      

  4.   

    我现在的代码就是
    //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!》郁闷中。
      

  5.   

    动态库里USES单元列表有没有DB这个单元?
      

  6.   

    经验告诉我,不要试图向DLL传递对象,麻烦多多......
      

  7.   

    //用强制转换虽然成功,但是TDataSource没有效果啥意识,转换后不能用吗?我用TButton试验了一下,可以啊!
      

  8.   

    个人猜想是没有办法在dll里使用TDataSource了。
    10楼的经验……血的教训。