本人在编程中遇到了这样一个问题:在应用程序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个动态链接库,动态生成树状控件的内容, 控件可以生成,也能有效的工作,但在退出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.
begin
TV.Items.AddChild(nil, ChildName);
end;
这样不涉及到释放DLL STACK指针
是不是会安全一些?