我的程序如下:
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('&para;&macr;&Igrave;&not;&Aacute;&acute;&frac12;&Oacute;&iquest;&acirc;&frac14;&Oacute;&Ocirc;&Oslash;&Ecirc;§°&Uuml;!','&ETH;&Aring;&Iuml;&cent;',MB_ICONINFORMATION);
  except
    Application.MessageBox('&para;&macr;&Igrave;&not;&Aacute;&acute;&frac12;&Oacute;&iquest;&acirc;&frac14;&Oacute;&Ocirc;&Oslash;&Ecirc;§°&Uuml;,&Ccedil;&euml;&Egrave;·&Egrave;&Iuml;&para;&macr;&Igrave;&not;&Aacute;&acute;&frac12;&Oacute;&iquest;&acirc;[chartlib.dll]&acute;&aelig;&Ocirc;&Uacute;&Oacute;&Uacute;±&frac34;&micro;&Oslash;&Iuml;&micro;&Iacute;&sup3;&Auml;&iquest;&Acirc;&frac14;&raquo;ò&Otilde;&szlig;&micro;±&Ccedil;°&Auml;&iquest;&Acirc;&frac14;.','&ETH;&Aring;&Iuml;&cent;',MB_ICONINFORMATION);
  end;
end;创建后是正常的,问题出现在关闭窗体后,就出现了地址冲突,不可读错误。