就是说我把EXE里面的菜单储存在DLL里,调用函数时才取出来

解决方案 »

  1.   

    用插件吧(实质上也相当于调用DLL文件) 用‘插件’关键词在这边搜索一下 或者如果你有大富翁离线数据包,里边有篇不错的文章
      

  2.   

    给你一个简单的例子type
      TPluginX = procedure(var Menu: TMainMenu); stdcall;const
      X_AddMenuItem = 'AddMenuItem';//与DLL文件中过程名称一致
      X_PlugInName = 'Rain.XX';//库文件名称procedure TForm1.LoadPlugInDll(F: TSearchRec);
    var 
      S: string;
      I: Integer;
      PlugInX: TPlugInX;
    begin
      I := LoadLibrary(PChar(F.Name));
      if I <> 0 then
      begin
        PlugInX := GetProcAddress(XHandle, X_AddMenuItem);//取得函数指针
        if Assigned(PlugInX) then PlugInX(mmX);
      end;
    end;procedure TForm1.SearchLibrary;
    var
      F: TSearchRec;
      xPath: string;
      iFound: Integer;
    begin
      xPath := ExtractFilePath(Application.ExeName);
      try
        iFound := FindFirst(xPath + X_PlugInName, 0, F);
        while iFound = 0 do
        begin
          LoadPlugInDll(F);
          iFound := FindNext(F);
        end;
      finally
        FindClose(F);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      SearchLibrary;
    end;新建DLL文件
    File-New-Other-ActiveX-ActiveX Library
    Rain.XX(DLL)library Rain;uses
      ShareMem, ComServ, Menus;type
      TXClass = class
      public
        procedure MenuItemClick(Sender: TObject);
      end;exports
      DllGetClassObject,
      DllCanUnloadNow,
      DllRegisterServer,
      DllUnregisterServer;var
      XClass: TXClass;procedure TXClass.MenuItemClick(Sender: TObject);
    var
      mmiX: TMenuItem;
    begin
      mmiX := NewItem('&New MenuItem', 0, False, True, XClass.MenuItemClick, 0, '');
      (Sender as TMenuItem).Add(mmiX);
    end;procedure AddMenuItem(var Menu: TMainMenu); stdcall;
    var
      mmiX: TMenuItem;
    begin
      mmiX := NewItem('&New MenuItem', 0, False, True, XClass.MenuItemClick, 0, '');
      Menu.Items.Add(mmiX);
    end;{$R *.RES}
    {$E XX}//改变文件扩展名exports AddMenuItem Name 'AddMenuItem';begin
    end.