调用代码:
function TForm1.FindFunction(DllName, FuncName: string):Pointer;
type
  Ta = procedure ;stdcall;
var
  a: Pointer;
  MyHandle:THandle;
begin  //读取动态链接库
  MyHandle := LoadLibrary (PChar(DllName));  If MyHandle <= 0 then
  begin
    Raise Exception.Create('打开动态链接库失败,失败代码:'+Inttostr(Getlasterror));
    result := nil;
  end else
  begin
    a := GetProcAddress(MyHandle, PChar(FuncName));
    result := a;
  end;
end;procedure TForm1.FormShow(Sender: TObject);
var
  MyProc: TNotifyEvent;
begin
  @MyProc := FindFunction('dll.dll','Check1');
  //n11是一个菜单的名称
  n11.OnClick := MyProc;
end;另:为什么我用a.ShortCut := 15429;直接设定快捷键没有作用?

解决方案 »

  1.   

    類的函數與 一般函數不同, 你這樣做是不行的, 找不到@MyProc 沒有 sender
      

  2.   

    呵呵,首先dll里的Check1是怎么定义的,TNotifyEvent是怎么回事楼主还没太弄明白。暂时你可以这么改:
    在Delphi里给nll添加OnClick处理函数:
    procedure TForm1.nllClick(Sender: TObject);
    begin
      if @MyProc <> nil then
        MyProc;  // 暂时将 MyProc 改为全局的
    end;
    在FormShow里载入dll:
    procedure TForm1.FormShow(Sender: TObject);
    begin
      @MyProc := FindFunction('dll.dll','Check1'));
    end;
    然后:dll 是你写的吗? 可以导出 TNotifyEvent 型的函数??
    不可能吧? 改成一个“普通”的函数,应该就行了。另外,如果不是需要针对不同配置选择载入不同的dll,楼主可以使用“静态”链接dll的方法,动态链接得写很多罗嗦代码,最后还得卸载。“静态”链接MyProc:
    function MyProc(...): ...; extern 'dll.dll';
      

  3.   

    可以给菜单项设置快捷键。不过楼主的 a 是个纯粹的指针,呵呵,那就不号意思了楼主可先学学 Pascal。
      

  4.   

    菜单是动态生成的,所以函数也要动态指定,而且函数全部写入了dll
      

  5.   

    菜单是动态的就是动态的白,比如:
    var
      MenuItem: TMenuItem;
    MenuItem := .... // 动态创建之
    MenuItem.OnClick := MyMenuItemClick;
    MenuItem.ShortCut := ... // 热键这有何难?
      

  6.   

    可是指向函数的时候的mymenuitemclick这个函数在什么地方?
    只能从dll文件中读取