我正在尝试从我的程序动态加载 exe 文件,并从该动态加载的 exe 运行 SomeProcedure。这是我在加载的 exe - library.exe 中所做的事情
interface
procedure SomeProcedure; stdcall;
implementation
procedure SomeProcedure;
begin
ShowMessage('Ala has a cat');
end;
这是我的 exe,它加载了library.exe并尝试从中运行SomeProcedure。
type
THandle = Integer;
TProc = procedure();
var
AHandle: THandle;
Proc: TProc;
procedure TForm1.Button1Click(Sender: TObject);
begin
AHandle := LoadLibrary('library.exe');
if AHandle <> 0 then begin
@Proc := GetProcAddress(AHandle, 'SomeProcedure');
if @Proc <> nil then
try
Proc;
finally
FreeLibrary(AHandle);
end;
end;
end;
end;
不幸的是它不起作用 - AHandle 有一个地址,但 GetProcAddress 总是返回 nil。我究竟做错了什么?
据我所知,您所尝试的事情是不可能的。您无法使用 LoadLibrary 加载 .exe 文件,然后调用其导出的函数。一个进程中只能加载一个 .exe 文件。您需要将功能移至库、COM 服务器或其他解决方案中。
正如 Sertac 指出的那样,文档 http://msdn.microsoft.com/library/ms684175.aspx确实涵盖了这一点:
LoadLibrary 还可以用于加载其他可执行模块。例如,该函数可以指定一个.exe文件
获取可在 FindResource 或 LoadResource 中使用的句柄。但是,请勿使用 LoadLibrary 运行 .exe 文件。相反,请使用 CreateProcess 函数。
您可以将 GetProcAddress 与可执行文件的模块句柄一起使用。但是您必须例如通过调用 GetModuleHandle(0) 来获取模块句柄。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)