某个个TPopupMenu位于dll中,用这样一个record封装起来: 
  TModule = record
    Name:PChar;
    TrayMenu:TMenuItem;
  end;dll中的调用接口为: function GetInfo:TModule;stdcall;export;
begin
  Result.Name := 'Demo';
  Result.TrayMenu := FrmMain.pm1.Items;
end;dll入口: begin
  FrmMain:=TFrmMain.Create(nil);
end.到主程序里加载dll,主程序是MDI Form。 type
  pGetInfo=function():TModule;stdcall;procedure LoadMod(DllPath:PChar);
var Hnd:THandle;
    FItem:TMenuItem;
    GetInfo:pGetInfo;
    Info:TMoudle;
begin
  Hnd:=LoadLibrary(DllPath);
    if Hnd<>0 then begin
          GetInfo:=GetProcAddress(Hnd,'GetInfo');
          if Assigned(GetInfo) then begin
        Info:=GetInfo;
        FItem:=Info.TrayMenu;
        FItem.Caption:=Info.Name;
        FrmMain.P2.Add(FItem);  // P2是某个TPopmenu中的一项
      end;
  end;
end;
情况是,在主窗体中无法响应新菜单项的事件,而这个菜单又确实是Dll中的指定菜单。
个人是黔驴技穷了,到这里求解决办法!

解决方案 »

  1.   

    可以不把菜单放个DLL中啊。你把功能放DLL中就行了
      

  2.   

    procedure TFrmMain.N1Click(Sender: TObject);
    begin
      FrmMain.Visible := not FrmMain.Visible;
      N1.Checked := not N1.Checked;
    end;
    这是DLL中测试用菜单的OnClick事件。。在Dll中TFrmMain下这个过程的声明后加上了stdcall;
    结果发现可以用它显示出dll窗体了,但是第二句报错;
    然后以试一试的心态,注释掉了stdcall,结果居然能用了也不知道IDE抽了还是我虎躯一震RP爆发了。。晕死
    既然问题已经不存在,放分吧~