调用代码:
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;直接设定快捷键没有作用?
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;直接设定快捷键没有作用?
在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';
var
MenuItem: TMenuItem;
MenuItem := .... // 动态创建之
MenuItem.OnClick := MyMenuItemClick;
MenuItem.ShortCut := ... // 热键这有何难?
只能从dll文件中读取