【问题标题】:How to know the caller application of the dll in delphidelphi中如何知道dll的调用者应用
【发布时间】:2015-10-09 02:28:03
【问题描述】:

我有一个可以从不同的 exe 应用程序调用的 dll(dll 和 exe 是用 Delphi 5 编写的)。 是否可以在 dll 中知道它是从哪个 exe 应用程序调用的? 换句话说,假设我有 App1.exe、App2.exe 和 MyDll.dll。 App1.exe 称为 MyDll.exe。我想知道它是从 App1 调用的,而不是从 App2 调用的 dll。

【问题讨论】:

  • 你能提供一些代码吗?
  • DLL 不应该关心调用者是谁,但如果它需要知道它应该提供应用程序可以用来提供该信息的方法。需要明确的是,如果我编写一个提供许可信息的 DLL,我不应该关心调用该 DLL 的应用程序是命名为 Project1.exe 还是 SomeApp.exe -我应该关心的是调用我的应用程序提供的信息表明它有权使用我的 DLL。
  • 当然,在可能的情况下,例如当您同时控制 DLL 和 EXE 开发时。例如,在编写 Shell 扩展 DLL 时,有时需要/需要检测 DLL 是否由 explorer.exe 本身加载,如果不是,则拒绝加载,以免加载到使用 OS 对话框托管资源管理器实例的进程中,例如打开/保存文件对话框。您不能要求资源管理器调用可以导出的额外功能。只是说,从 DLL 中检测加载过程有其用途,即使不常用。

标签: delphi


【解决方案1】:

如果您调用 Windows API 函数 GetModuleFileName() 传递 NULL (0) 作为模块句柄(第一个参数),那么这将返回 进程 的文件名,即可执行文件:

function GetProcessFileName: String;
var
  buf: array[0..MAX_PATH-1] of Char;
begin
  GetModuleFileName(0, @buf, Length(buf));
  result := buf;
end;

注意:正如 Raymond Chen 常说的,示例程序很少或根本不做错误检查! :)

有关使用此 API 的更多信息,请参阅文档并相应地使用。

【讨论】:

  • 由于DLL是用Delphi编写的,它也可以使用ParamStr()函数。当其Index参数为0时,返回调用进程的完整路径和文件名(使用GetModuleFileName(0, ...),如上图),例如:function GetProcessFilename: String; begin Result := ParamStr(0); end;
  • @David - 感谢您的清理。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
相关资源
最近更新 更多