本人在编程中遇到了这样一个问题:在应用程序TESTDLL中1个FORM上建立1个空的树TV (TTREEVIEW控件),
再建立1个动态链接库,动态生成树状控件的内容, 控件可以生成,也能有效的工作,但在退出FORM或释放动态库时
,出现这样的错误:
Project TestDll.exe raised exception class EAccessViolation with message
'Access violation at address 00408D67 in module 'testdll.exe'.read of address
010AAF54. PROCESS stopped. use step or run to continue.我估计是在动态库中建立的数据,外部程序无法访问造成的,但经过两天的摸索,也未能找出解决的办法,此程序
在工作中急用,因此求各位智者/大侠帮帮忙,在线等待,一解决就加分.以下是经简化的程序:以下是主程序:unit untTestDll;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ImgList, ComCtrls, Ora, OraSmart, DB, DBAccess, Inifiles;type
  TfrmTest = class(TForm)
    Button1: TButton;
    tv: TTreeView;
    ImageList1: TImageList;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  frmTest: TfrmTest;
  libHandle: THandle;
implementation{$R *.dfm}procedure TfrmTest.Button1Click(Sender: TObject);var
  BuildTree: procedure(TV: TTreeView; ChildName: String); stdcall;
begin
  libHandle := loadlibrary('JXDTGL.DLL');
  if libHandle > 0 then
  begin
    @BuildTree := GetprocAddress(libHandle, 'BuildTree');
    if @BuildTree <> nil then
    begin
      BuildTree(tv,'根结点');
    end;
  end;
end;
procedure TfrmTest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeLibrary(libHandle);
end;end.以下是动态库library Jxdtgl;uses
  System, SysUtils, Classes, Ora, OraSmart, IniFiles, Windows, ComCtrls,Dialogs;{$R *.res}//建树
procedure BuildTree(TV: TTreeView; ChildName: string); stdcall;
var
 PNode: TTreeNode;
begin
  PNode := TV.Items.AddChild(nil, ChildName);
end;exports
  BuildTree;begin
end.

解决方案 »

  1.   

    procedure BuildTree(TV: TTreeView; ChildName: pchar///); stdcall;
      

  2.   

    各位大侠, 是我将参数类型写错了应是PCHAR,问题不在这里,请继续讨论...
      

  3.   

    是否dll中申请的资源未释放 例如stringlist或者其他需要手工释放的东东
      

  4.   

    我想问题在于无法释放在DLL中创建的treenode对象,因我跟踪过,是在释放TREENODE对象时出的以上错误,我想是因为程序无法访问DLL中创建的对象的地址,但不知如何解决这个问题
      

  5.   

    procedure BuildTree(Var TV: TTreeView; ChildName: string); stdcall;
    begin
      TV.Items.AddChild(nil, ChildName);
    end;
    这样不涉及到释放DLL STACK指针
    是不是会安全一些?