写了一个DLL,可是在使用时去有时会出现内存错误,请问应当如何调试DLL!!谢谢!

解决方案 »

  1.   

    Delphi Menu->Run->Parameters->Local
    填上Host Application
    直接运行就可以调试了~~
    当然你要保证exe和dll都有包含了调试信息~~
      

  2.   

    这样没法调试吧,我在DLL里只有过程!
    就几个过程,没有窗体!
      

  3.   

    没有窗体一样调试呀?~~
    在DLL代码里还不可以设置断点~~
    就把不是国家机密的代码部分贴出来看看~~
    让大家帮你分析分析~~
      

  4.   

    每个函数是不是加了 stdcall有没有用到string
      

  5.   

    代码啦!!!先贴一个过程,我做成普通的测试窗体后没有问题,不知为什么!function  AnalysisData(SourceData :PChar;SysData :PSysData) :Boolean;stdcall;
    var
      XMLAnalysis :TCurveAnalysis;
      i :integer;
      TrackList :PTrackSysDataList;
    begin
      Result := True;
      XMLAnalysis := TCurveAnalysis.Create;
      try
        try
          XMLAnalysis.LoadXMLData(SourceData);
          StrPCopy(SysData^.ServerURL,XMLAnalysis.ServerHost);
          StrPCopy(SysData^.Version,XMLAnalysis.Version);
          StrPCopy(SysData^.Caption,XMLAnalysis.Caption);
          StrPCopy(SysData^.Name,XMLAnalysis.Name);
          SetLength(TrackList,XMLAnalysis.TrackCount);
          for i := 0 to XMLAnalysis.TrackCount - 1 do begin
            CopyTrackData(@TrackList[i],XMLAnalysis.TrackData[i]^);
          end;
          SysData^.TrackSysDataList := TrackList;
        except
          Result := False;
        end;
      finally
        XMLAnalysis.Free;
      end;
    end;
      

  6.   

    动态连接库的装载
    静态装载:procedure name;external 'lib.dll';动态装载:var handle:Thandle;
    handle:=loadlibrary('lib.dll');
    if handle<>0 then
    begin
    {dosomething}
    freelibrary(handle);
    end;
      

  7.   

    一步一步排错1. 排除接口错误~~
    function AnalysisData(SourceData :PChar;SysData :PSysData) :Boolean;stdcall;
    begin
      Result := True;
      { 检查两边接口声明是否一致 }
    end;2.排除类使用的错误~~
    function AnalysisData(SourceData :PChar;SysData :PSysData): Boolean; stdcall;
    var
      XMLAnalysis :TCurveAnalysis;
    begin
      Result := True;
      XMLAnalysis := TCurveAnalysis.Create;
      try
      finally
        XMLAnalysis.Free;
      end;
      { 检查TCurveAnalysis是否需要其他的对象辅助 }
    end;3. 排除资源访问失效~~
    function  AnalysisData(SourceData :PChar;SysData :PSysData) :Boolean;stdcall;
    var
      TrackList :PTrackSysDataList;
    begin
      Result := True;
      SetLength(TrackList, 10);
      SysData^.TrackSysDataList := TrackList;
      { 检查资源是否分配 }
    end;
      

  8.   

    错误是找到啦,可是现在却无法解决!!!
    错误在于SetLength(TrakList,Count),由于DELPHI采用的是即用即放,所以出了门他就给放啦,就出错啦!
      

  9.   

    啊,这在看到,那你在调用的地方就分配好资源~~函数里就做个内存复制不就可以了~~也可以把TrackList作为DLL的全局变量~~不释放Dll资源还在~~
      

  10.   

    建个调用程序。
    在Dll工程中
    Run->Parameters->选择上面建好的应用程序。在Dll里设断点。F9就可以调试了