动态加载exe文件

2024-01-10

我正在尝试从我的程序动态加载 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(使用前将#替换为@)

动态加载exe文件 的相关文章

随机推荐