dllimport如何在非托管dll中获取哪个应用程序调用了函数
Posted
技术标签:
【中文标题】dllimport如何在非托管dll中获取哪个应用程序调用了函数【英文标题】:dllimport how to get which application called function in unmanaged dll 【发布时间】:2018-09-19 21:52:18 【问题描述】:我有 1 个带有 dllexport 函数的非托管 C++ dll 和 3 个托管 C# 应用程序,它们使用带有 dllimport 的非托管 dll 函数strong> ,好吧,一切正常。
我需要知道在 C++ dll 中,我怎样才能得到一个值来告诉我哪个 C# 应用程序从外部调用了它。
请看下图:
现在,当 client.exe 从非托管 dll 调用 function1 时,会显示一条消息 “client.exe call me!” 现在,当 console.exe 从非托管 dll 调用 function1 时,会显示一条消息 “console.exe 叫我!” 现在,当 pure.exe 从非托管 dll 调用 function1 时,会显示一条消息 “pure.exe 叫我!”
我需要非托管库自己找出它,我不想从 C# 应用程序发送任何额外的东西,比如获取 C# 文件路径并将其发送到函数。
有可能吗?如果是,我该怎么做?
【问题讨论】:
从技术上讲,该函数应该是通用的,并且不应根据调用它的进程来执行。但是,如果您有 3 种不同的处理方式,那么您应该导出 3 个不同的函数,并从每个 C# 应用程序调用各自的函数。 在技术上可以获取有关调用和执行库函数的进程(即调用 exe)的信息,但话又说回来,我非常同意 Soundararajan 这里... 看看Assembly
类。 IIRC 提供了一个功能来做到这一点。
伙计们,我们应该问 OP 他为什么要这样做,而不是告诉他他不应该这样做。据我们所知,他可能出于某种原因想要记录调用应用程序的名称。
DLL 在与调用者相同的进程中运行。所以你只需要一个API调用get the current process ID
【参考方案1】:
这应该可行:
constexpr DWORD bufsize = 32768;
WCHAR *calling_application = new WCHAR [bufsize];
DWORD nSize = GetModuleFileNameW (NULL, calling_application, bufsize);
if (nSize == 0 || nSize == bufsize)
// panic, should never happen
// ...
delete [] calling_application;
这里的文档:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms683197%28v=vs.85%29.aspx
【讨论】:
非常感谢 Paul,我正在检查它,如果它对我有用,我会回复并接受您的回答 你还需要检查错误,我不太明白+ 1
@DavidHeffernan 会有错误吗? 1 代表运气 :)(或字符串结束标记)
MAX_PATH
在使用标准路径时包含终止符的空间。所以+ 1
毫无意义。启用长文件名(大于MAX_PATH
)时,如果路径太长,调用可能会失败。您可以通过阅读文档来了解这一点。
@David Fine,已编辑。也许你想扭转你的否决票。过长的文件名会对 Explorer 造成严重破坏,因此这些不太可能成为问题,但我还是更改了代码。以上是关于dllimport如何在非托管dll中获取哪个应用程序调用了函数的主要内容,如果未能解决你的问题,请参考以下文章