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++ dll3 个托管 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中获取哪个应用程序调用了函数的主要内容,如果未能解决你的问题,请参考以下文章

在非托管 C++ 程序中实现 C# DLL COM 文件

如何将数据从非托管应用程序传递到 C# COM DLL

在非托管 C++ DLL 和托管 C# UI 之间发送信息

如何在非托管 C++ 中捕获托管异常(来自委托)?

从 C++/CLI 应用程序将 STL 字符串传递给 C++ DLL

在非 Qt 应用程序中使用基于 Qt 的 DLL