关于在DLL中调用TXMLDocument时出错的问题!

关于在DLL中调用TXMLDocument时出错的问题! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061218133656127.html
我在dll中使用XML读取和写如配置,每次静态调用完以后都会出现错误:Access   violation   at   address   00000000.   Read   of   address   00000000.   ,应该是什么没有释放的问题请大家给看看  
  代码:  
  library   DoitLib;  
  uses  
      SysUtils,   xmldom,   XMLIntf,   MSxmldom,   XMLDoc,  
      Classes,   Forms,activex;  
   
  {$R   *.res}  
   
  /GetConfig:读取配置参数;返回值:Pchar//  
  //参数   Section   :分组节点;类型:Pchar//  
  //参数     Key:配置项节点:类型:Pchar   ///  
  /  
   
  function   GetConfig(Section,   Key:   Pchar):   Pchar;   stdcall;  
  var  
      MyPath:   string;   //文件路径  
      ConfigFile:   TXMLDocument;   //配置文件  
      TheNode:   IXMLNode;   //临时存储节点变量  
  begin  
      MyPath   :=   ExtractFileDir(GetModuleName(0))   +   '\Config.xml';   //获取文件路径  
      CoInitialize(nil);  
      ConfigFile   :=   TXMLDocument.Create(Application);   //创建XML  
    //   ConfigFile.DOMVendor   :=   OpenXMLFactory;   //指定解析器  
      ConfigFile.Active   :=   TRUE;  
      if   not   FileExists(MyPath)   then   {//如果文件不存在}     begin  
          result   :=   Pchar('');   //如果文件不存在,则返回空  
          exit;  
      end  
      else  
          ConfigFile.LoadFromFile(MyPath);   //如果文件存在,则从文件加载内容  
      TheNode   :=   ConfigFile.DocumentElement;   //获取根节点  
      if   TheNode.ChildNodes.FindNode(Section)   <>   nil   then  
          TheNode   :=   TheNode.ChildNodes.FindNode(Section)   //如果组节点存在,获取该组节点  
      else   begin  
          result   :=   Pchar('');   //如果组节点不存在,则返回空  
          exit;  
      end;  
   
      if   TheNode.ChildNodes.FindNode(Key)   <>   nil   then  
          TheNode   :=   TheNode.ChildNodes.FindNode(Key)   //如果配置项节点存在,获取该配置项节点  
      else   begin  
          result   :=   Pchar('');   //如果配置项节点不存在,则返回空  
          exit;  
      end;  
      result   :=   Pchar(TheNode.Text);  
    //   ConfigFile.Active   :=   false;  
      ConfigFile.Free;  
      CoUninitialize;  
  end;  
   
   
  function   SetConfig(Section,   Key,   NewValue:   Pchar):   integer;   stdcall;  
  var  
      MyPath:   string;   //文件路径  
      ConfigFile:   TXMLDocument;   //配置文件  
      TheNode:   IXMLNode;   //临时存储节点变量  
      TempRST:INTEGER;  
  begin  
      TempRST:=1;  
      CoInitialize(nil);  
      MyPath   :=   ExtractFileDir(GetModuleName(0))   +   '\Config.xml';   //获取文件路径  
   
      try  
          ConfigFile   :=   TXMLDocument.Create(Application);   //创建XML  
        //   ConfigFile.DOMVendor   :=   OpenXMLFactory;   //指定解析器  
          ConfigFile.Active   :=   TRUE;  
          //设置文件自动换行  
          if   not   FileExists(MyPath)   then   {//如果文件不存在}     begin  
   
              ConfigFile.Version   :=   '1.0';  
              ConfigFile.Encoding   :=   'GB2312';  
              ConfigFile.Options   :=   ConfigFile.Options   +   [doNodeAutoIndent];  
              TheNode   :=   ConfigFile.CreateNode('DoitFaxConfig');  
              ConfigFile.DocumentElement   :=   TheNode;  
          end  
          else   begin  
              ConfigFile.LoadFromFile(MyPath);   //如果文件存在,则从文件加载内容  
              ConfigFile.Version   :=   '1.0';  
              ConfigFile.Encoding   :=   'GB2312';  
              ConfigFile.Options   :=   ConfigFile.Options   +   [doNodeAutoIndent];  
          end;  
          TheNode   :=   ConfigFile.DocumentElement;   //获取根节点  
          if   TheNode.ChildNodes.FindNode(Section)   <>   nil   then  
              TheNode   :=   TheNode.ChildNodes.FindNode(Section)   //如果组节点存在,获取该组节点  
          else  
              TheNode   :=   TheNode.AddChild(Section);   //如果组节点不存在,则创建  
   
          if   TheNode.ChildNodes.FindNode(Key)   <>   nil   then  
              TheNode   :=   TheNode.ChildNodes.FindNode(Key)   //如果配置项节点存在,获取该配置项节点  
          else  
              TheNode   :=   TheNode.AddChild(Key);  
          TheNode.Text   :=   NewValue;  
          ConfigFile.SaveToFile(MyPath);  
          TempRST:=0;  
      finally  
      ConfigFile.Active   :=   false;  
      ConfigFile.Free;  
      ConfigFile.Destroy;  
      CoUninitialize;  
      result   :=   TempRST;  
      end;  
   
  end;  
  exports  
      GetConfig,   SetConfig;  
   
  begin  
  end.  
 

library   Project1;  
   
  {   Important   note   about   DLL   memory   management:   ShareMem   must   be   the  
      first   unit   in   your   library's   USES   clause   AND   your   project's   (select  
      Project-View   Source)   USES   clause   if   your   DLL   exports   any   procedures   or  
      functions   that   pass   strings   as   parameters   or   function   results.   This  
      applies   to   all   strings   passed   to   and   from   your   DLL--even   those   that  
      are   nested   in   records   and   classes.   ShareMem   is   the   interface   unit   to  
      the   BORLNDMM.DLL   shared   memory   manager,   which   must   be   deployed   along  
      with   your   DLL.   To   avoid   using   BORLNDMM.DLL,   pass   string   information  
      using   PChar   or   ShortString   parameters.   }  
   
  uses  
      SysUtils,XMLDoc,XMLIntf,activex,Forms,  
      Classes;  
   
  {$R   *.res}  
   
  function   GetConfig(Section,   Key:   Pchar):   Pchar;   stdcall;  
  var  
      MyPath:   string;   //文件路径  
      ConfigFile:   TXMLDocument;   //配置文件  
      TheNode:   IXMLNode;   //临时存储节点变量  
  begin  
      MyPath   :=   ExtractFileDir(GetModuleName(0))   +   '\Config.xml';   //获取文件路径  
      CoInitialize(nil);  
      ConfigFile   :=   TXMLDocument.Create(Application);   //创建XML  
    //   ConfigFile.DOMVendor   :=   OpenXMLFactory;   //指定解析器  
      ConfigFile.Active   :=   TRUE;  
      if   not   FileExists(MyPath)   then   {//如果文件不存在}     begin  
          result   :=   Pchar('');   //如果文件不存在,则返回空  
          exit;  
      end  
      else  
          ConfigFile.LoadFromFile(MyPath);   //如果文件存在,则从文件加载内容  
      TheNode   :=   ConfigFile.DocumentElement;   //获取根节点  
      if   TheNode.ChildNodes.FindNode(Section)   <>   nil   then  
          TheNode   :=   TheNode.ChildNodes.FindNode(Section)   //如果组节点存在,获取该组节点  
      else   begin  
          result   :=   Pchar('');   //如果组节点不存在,则返回空  
          exit;  
      end;  
   
      if   TheNode.ChildNodes.FindNode(Key)   <>   nil   then  
          TheNode   :=   TheNode.ChildNodes.FindNode(Key)   //如果配置项节点存在,获取该配置项节点  
      else   begin  
          result   :=   Pchar('');   //如果配置项节点不存在,则返回空  
          exit;  
      end;  
      result   :=   PChar(TheNode.Text);  
    //   ConfigFile.Active   :=   false;  
      ConfigFile.Free;  
      CoUninitialize;  
  end;  
   
   
  function   SetConfig(Section,   Key,   NewValue:   Pchar):   integer;   stdcall;  
  var  
      MyPath:   string;   //文件路径  
      ConfigFile:   TXMLDocument;   //配置文件  
      TheNode:   IXMLNode;   //临时存储节点变量  
      TempRST:INTEGER;  
  begin  
      TempRST:=1;  
      CoInitialize(nil);  
      MyPath   :=   ExtractFileDir(GetModuleName(0))   +   '\Config.xml';   //获取文件路径  
   
      try  
          ConfigFile   :=   TXMLDocument.Create(Application);   //创建XML  
        //   ConfigFile.DOMVendor   :=   OpenXMLFactory;   //指定解析器  
          ConfigFile.Active   :=   TRUE;  
          //设置文件自动换行  
          if   not   FileExists(MyPath)   then   {//如果文件不存在}     begin  
   
              ConfigFile.Version   :=   '1.0';  
              ConfigFile.Encoding   :=   'GB2312';  
              ConfigFile.Options   :=   ConfigFile.Options   +   [doNodeAutoIndent];  
              TheNode   :=   ConfigFile.CreateNode('DoitFaxConfig');  
              ConfigFile.DocumentElement   :=   TheNode;  
          end  
          else   begin  
              ConfigFile.LoadFromFile(MyPath);   //如果文件存在,则从文件加载内容  
              ConfigFile.Version   :=   '1.0';  
              ConfigFile.Encoding   :=   'GB2312';  
              ConfigFile.Options   :=   ConfigFile.Options   +   [doNodeAutoIndent];  
          end;  
          TheNode   :=   ConfigFile.DocumentElement;   //获取根节点  
          if   TheNode.ChildNodes.FindNode(Section)   <>   nil   then  
              TheNode   :=   TheNode.ChildNodes.FindNode(Section)   //如果组节点存在,获取该组节点  
          else  
              TheNode   :=   TheNode.AddChild(Section);   //如果组节点不存在,则创建  
   
          if   TheNode.ChildNodes.FindNode(Key)   <>   nil   then  
              TheNode   :=   TheNode.ChildNodes.FindNode(Key)   //如果配置项节点存在,获取该配置项节点  
          else  
              TheNode   :=   TheNode.AddChild(Key);  
          TheNode.Text   :=   NewValue;  
          ConfigFile.SaveToFile(MyPath);  
          TempRST:=0;  
      finally  
      ConfigFile.Active   :=   false;  
      ConfigFile.Free;  
      ConfigFile.Destroy;  
      CoUninitialize;  
      result   :=   TempRST;  
      end;  
  end;  
   
  exports  
      GetConfig,   SetConfig;  
   
  begin  
  end.  
 

重新建立一个DLL   换成上面代码试试~~

还是会有那个错误,我看不出下面的代码与上面代码有那里不同。

没什么哪里不同   那个DLL本身编译出错才是正确的  
  要做的是让一个程序调用你写的DLL  
   
  明白?

转载于:https://www.cnblogs.com/delphi2007/archive/2008/10/14/1310940.html

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值