Dll文件里有一个函数,代码如下:
function Init(FormHandle: THandle): Boolean; stdcall;
var
  Databases,Database: IXMLNode;
  XMLDocument1 : IXMLDocument ;
  strXmlFile : String;
begin
  CoInitialize(nil);//注册
  MainHandle := FormHandle;
  strXmlFile := GetRegistry();//调用此函数行到注册表路径;
  if strXmlFile = '' then begin
  Result := false;
    exit;
  end;
  strXmlFile := strXmlFile + 'Web\Config\DatabaseConfig.xml';
  if(FileExists(strXmlFile) = false) then
  begin
      MessageDlg ('三星功能创建错误: 找不到数据库配置文件('+strXmlFile+')!', mtError, [mbOK], 0);
    Result := false;
      exit;
  end ;
    XMLDocument1 := TXMLDocument.Create(nil);
    XMLDocument1.LoadFromFile(strXmlFile);
    XMLDocument1.Active := True;
   try
    Databases := XMLDocument1.DocumentElement.ChildNodes.FindNode('Databases');
    Database := Databases.ChildNodes.FindNode('Database');
    ID := Database.AttributeNodes.Nodes['ID'].Text;
    DataSource := Database.ChildNodes.FindNode('DataSource').Text;
    User := Database.ChildNodes.FindNode('User').Text;
    Password := Database.ChildNodes.FindNode('Password').Text;
    Result := true;
  except
    Result:=false;
  end;
  XMLDocument1.Active := false;
end;在.exe程序里调用Dll里的上面这个函数,代码如下:
procedure TForm1.FormCreate(Sender: TObject);
var
  result : Boolean ;
begin
   result := Init(Form1.Handle);
   if result=true then begin
      application.MessageBox(pchar('OK'), pchar(application.Title));
   end
   else begin
     application.MessageBox(pchar('Error'), pchar(application.Title));
   end;
end;程序出现了如下问题:跟踪调试后发现,所有代码都执行完毕后弹出一个错误对话框:'access violation at 0x00000000:read of address 0x00000000'.
请问这是什么原因呀?是不是用了哪个没有创建的对像呀?我真是晕了。

解决方案 »

  1.   

    Databases,Database: IXMLNode;
    XMLDocument1 : IXMLDocument ;三个是引用释放, 退出时发生的吧, 可能在这, 也可以显示释放, 在用完后Databases := nil
    ...
      

  2.   

    to:comanche(太可怕)
             我加了那一句,还是不行呀,还是那个错哟。
      

  3.   

    一共用三个 com 对像嘛, 都加上显示释放看看
      

  4.   

    先把CoInitialize(nil);这句注释调试试(是多线程吗,不一定要调用这句吧)
    不行的话在dll和主程序的第一个unit(一般是.dpr文件)的uses里都加上shareMem
      

  5.   

    我加了shareMem 还是不行。
      

  6.   

    大家看看我在.exe文件里调用函数时传的参数对不对呀?我老是觉得那个参数不对,因为我只要把DLL里的参数去掉,调用时没有参数,程序是没有问题的,可是带上那个参数就报那个错误。
      

  7.   

    你把FormHandle传入的目的是什么?应该是Appliation.handle吧?
    如果是保证运行时dll窗体与主程序融合,一般是把主程序的TApplication或Application.handle作为参数传入dll
      

  8.   

    我刚才试了一下,就算我把application.handle作为参数,还是报错呀。
      

  9.   

    哦, 看到 Coinitialize(nil) 没看到 CoUninitialize
      

  10.   

    加上CoUninitialize这句后。
    跟踪调试到这一句时弹出错误对话框:'Access violation at address 40008EEA in module 'rtl70.bpl'.Read of address 00CEBDA8'和以前报的错不太一样。
      

  11.   

    o, 这个不是你的错
    重起 delphi
      

  12.   

    你运行后暂停, view -> cpu window 看下 goto address $40008EEA, 是哪句话看看
      

  13.   

    我不知道这是什么意思。CPU里显示的是
    40008EEA   8B02     mov eax,[edx]这是什么呀?
      

  14.   

    如果真是这句发生的话, 你看主 exe 中的 init 是不是少加了 stdcall 修释
      

  15.   

    主程序里还要加stdcall吗?
    我是这样的:function Init(FormHandle: THandle): Boolean;external 'SamSungDll.dll';
      

  16.   

    to:comanch(太可怕):
         我加了stdcall,程序不再报错了,但是还是有一个问题,当我退出程序时,好点窗体的叉叉按钮时报了错:'Invalid pointer operation'
      

  17.   

    晕到, 当然要加, 这两个的出入口方试是不一样的, 
    不加是相当于 fastcall, 对 windows 而言相当于 PASCAL 调用(不太一样, 但相当), 他用 eax 作为第一返回参数 
    而 dll 用的是 stack, 这个叫 cdecl calling, 对delphi 定义而言就是 stdcall, 取的方法都不一样了
      

  18.   

    最后这个 Invalid pointer operation, 不是此函数了, 因该是有界面的窗体引起, 有没用到 Application.Handle 或其它 handle 作为 dll 的 Application.Handle, 有的话要在最后设 Dll Application.Handle := nil, 因为 application 会去尝试 free 自已的东东,原因嘛具体我也指不出是哪里
      

  19.   

    我看你 MainHandle := FormHandle; 这然送进来没用到, 这个 MainHandle 之后怎用的??
      

  20.   

    我在DLL工程文件里的uses里加了sharemem这个,就不报那个错了。
    你上面讲的那个MainHandle := FormHandle的确是没有用到。
    不管怎么样真是太感谢你了,呵呵,我也是因为工作需要所以才刚刚学习Delphi的,之前一直是用C#开发的,所以Delphi好多东东都不是太懂,以后多多交流,谢谢啦 ……
      

  21.   

    共同学习啦, delphi 这两年用得多, 原来我用 c++ 多