代码啦!!!先贴一个过程,我做成普通的测试窗体后没有问题,不知为什么!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;
动态连接库的装载 静态装载:procedure name;external 'lib.dll';动态装载:var handle:Thandle; handle:=loadlibrary('lib.dll'); if handle<>0 then begin {dosomething} freelibrary(handle); end;
一步一步排错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;
填上Host Application
直接运行就可以调试了~~
当然你要保证exe和dll都有包含了调试信息~~
就几个过程,没有窗体!
在DLL代码里还不可以设置断点~~
就把不是国家机密的代码部分贴出来看看~~
让大家帮你分析分析~~
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;
静态装载:procedure name;external 'lib.dll';动态装载:var handle:Thandle;
handle:=loadlibrary('lib.dll');
if handle<>0 then
begin
{dosomething}
freelibrary(handle);
end;
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;
错误在于SetLength(TrakList,Count),由于DELPHI采用的是即用即放,所以出了门他就给放啦,就出错啦!
在Dll工程中
Run->Parameters->选择上面建好的应用程序。在Dll里设断点。F9就可以调试了