我的程序如下:
type
TPlugIn_Help = Class(TObject)
public
ParentHandle : THandle;
procedure ActionPlugIn(Sender : TObject);
end; procedure AddPlugIn(main_menu: TMainMenu;subindex : integer);
procedure PlugIn_Load(MainMenu : TMainMenu;subindex : integer;Handle : THandle);stdcall;var
menu : TPlugIn_Help;implementationprocedure TPlugIn_Help.ActionPlugIn(Sender: TObject);
begin
if FileExists('HelpTMIS.chm') then
begin
if findwindow(nil,'教师信息管理系统帮助') = 0 then
shellexecute(ParentHandle,'open','HelpTMIS.chm',nil,nil,SW_SHOWNormal);
end
else
MessageDlg('帮助文件不存在!',mtInformation,[mbOk],0);
end;procedure AddPlugIn(main_menu: TMainMenu;subindex : integer);
var
m : TMenuItem;
begin
m := NewItem('帮助...', scNone, False, True,
menu.ActionPlugIn, 0, 'menu_help');
main_menu.Items[subindex].Add(m);
if Not FileExists('HelpTMIS.chm') then
m.Enabled := false;
end;procedure PlugIn_Load(MainMenu : TMainMenu;subindex : integer;Handle : THandle);
begin
menu.ParentHandle := Handle;
AddPlugIn(MainMenu,subindex);
end;initialization
menu := TPlugIn_Help.Create;finalization
menu.Free;end.uses
system,
uPlugIn in 'uPlugIn.pas';{$R *.res}
exports
PlugIn_Load;begin
end.测试是在一个form上建立一个mainmenu菜单,然后动态调用:
TProc = procedure(mainmenu : TMainMenu;index : integer;Handle : THandle);stdcall;
var
Form1: TForm1;
Lib_Handle : THandle;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
myproc : TProc;
begin
if Lib_Handle <> 0 then exit;
try
Lib_Handle := LoadLibrary('PlugIndll.dll');
if Lib_Handle <> 0 then
begin
@myproc := GetProcAddress(Lib_Handle,'PlugIn_Load');
if (@myproc) <> nil then
myproc(MainMenu1,0,Handle)
end
else
Application.MessageBox('¶¯Ì¬Á´½Ó¿â¼ÓÔØʧ°Ü!','ÐÅÏ¢',MB_ICONINFORMATION);
except
Application.MessageBox('¶¯Ì¬Á´½Ó¿â¼ÓÔØʧ°Ü,ÇëÈ·È϶¯Ì¬Á´½Ó¿â[chartlib.dll]´æÔÚÓÚ±¾µØϵͳĿ¼»òÕßµ±Ç°Ä¿Â¼.','ÐÅÏ¢',MB_ICONINFORMATION);
end;
end;创建后是正常的,问题出现在关闭窗体后,就出现了地址冲突,不可读错误。
type
TPlugIn_Help = Class(TObject)
public
ParentHandle : THandle;
procedure ActionPlugIn(Sender : TObject);
end; procedure AddPlugIn(main_menu: TMainMenu;subindex : integer);
procedure PlugIn_Load(MainMenu : TMainMenu;subindex : integer;Handle : THandle);stdcall;var
menu : TPlugIn_Help;implementationprocedure TPlugIn_Help.ActionPlugIn(Sender: TObject);
begin
if FileExists('HelpTMIS.chm') then
begin
if findwindow(nil,'教师信息管理系统帮助') = 0 then
shellexecute(ParentHandle,'open','HelpTMIS.chm',nil,nil,SW_SHOWNormal);
end
else
MessageDlg('帮助文件不存在!',mtInformation,[mbOk],0);
end;procedure AddPlugIn(main_menu: TMainMenu;subindex : integer);
var
m : TMenuItem;
begin
m := NewItem('帮助...', scNone, False, True,
menu.ActionPlugIn, 0, 'menu_help');
main_menu.Items[subindex].Add(m);
if Not FileExists('HelpTMIS.chm') then
m.Enabled := false;
end;procedure PlugIn_Load(MainMenu : TMainMenu;subindex : integer;Handle : THandle);
begin
menu.ParentHandle := Handle;
AddPlugIn(MainMenu,subindex);
end;initialization
menu := TPlugIn_Help.Create;finalization
menu.Free;end.uses
system,
uPlugIn in 'uPlugIn.pas';{$R *.res}
exports
PlugIn_Load;begin
end.测试是在一个form上建立一个mainmenu菜单,然后动态调用:
TProc = procedure(mainmenu : TMainMenu;index : integer;Handle : THandle);stdcall;
var
Form1: TForm1;
Lib_Handle : THandle;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
myproc : TProc;
begin
if Lib_Handle <> 0 then exit;
try
Lib_Handle := LoadLibrary('PlugIndll.dll');
if Lib_Handle <> 0 then
begin
@myproc := GetProcAddress(Lib_Handle,'PlugIn_Load');
if (@myproc) <> nil then
myproc(MainMenu1,0,Handle)
end
else
Application.MessageBox('¶¯Ì¬Á´½Ó¿â¼ÓÔØʧ°Ü!','ÐÅÏ¢',MB_ICONINFORMATION);
except
Application.MessageBox('¶¯Ì¬Á´½Ó¿â¼ÓÔØʧ°Ü,ÇëÈ·È϶¯Ì¬Á´½Ó¿â[chartlib.dll]´æÔÚÓÚ±¾µØϵͳĿ¼»òÕßµ±Ç°Ä¿Â¼.','ÐÅÏ¢',MB_ICONINFORMATION);
end;
end;创建后是正常的,问题出现在关闭窗体后,就出现了地址冲突,不可读错误。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货