获取调用我的 dll 的 exe 的名称

Posted

技术标签:

【中文标题】获取调用我的 dll 的 exe 的名称【英文标题】:Get the name of the exe which invoke my dll 【发布时间】:2017-07-02 19:26:31 【问题描述】:

我有一个调用 C++ dll 的 C# 项目 在返回 C++ dll 中的值之前,我想检查调用我的方法的 C# exe 的名称。你能给我建议吗?

我像这样加载 c++ dll:

[DllImport("MindSystem.dll", 
           EntryPoint = "MindSystemPlusPlus",
           CharSet = CharSet.Ansi,
           CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)] 
public static extern IntPtr MindSystemPlusPlus(int value); 

当我加载它时,我希望 c++ dll 检查调用它的 exe 的名称

编辑:我试过这段代码,但 c# 中的输出是奇怪的字符:

char fileName[MAX_PATH + 1];
GetModuleFileNameA(NULL, fileName, MAX_PATH + 1);
return fileName;

【问题讨论】:

这和c#有什么关系,你的dll是用c++写的,你能做的就是和c++关联? 我像这样加载 c++ dll:[DllImport("MindSystem.dll", EntryPoint = "MindSystemPlusPlus", CharSet = CharSet.Ansi, CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)] public static extern IntPtr MindSystemPlusPlus(int value);当我加载它时,我希望 c++ dll 检查调用它的 exe 的名称 我应该如何删除 c++ 标签?我正在寻找一个 c++ 代码。从现在开始,我在 c++ 中没有任何代码 How to find caller assembly name in unmanaged c++ dll的可能重复 【参考方案1】:

您应该尝试使用 GetModuleFileName() 函数。您可以获得exe的完整路径。请记住,如果您的 DLL 由多个应用程序加载,则返回的文件路径将仅引用其中一个。

【讨论】:

多个应用程序加载 DLL 应该不是问题,因为 GetModuleFileName() 将提供调用 DLL 函数的进程的可执行文件路径。我相信这是问题作者想要的。【参考方案2】:

您可以调用GetModuleFileName 函数。 NULL 作为第一个参数表示请求当前进程的可执行文件的路径。

std::string expectedPath("C:\\expected.exe");

TCHAR fileName[MAX_PATH + 1];
DWORD charsWritten = GetModuleFileName(NULL, fileName, MAX_PATH + 1);
if (charsWritten != 0)

    if (expectedPath == fileName)
    
        // do something
    

【讨论】:

这是我使用的代码。但是如何使用结果来比较它,例如一个字符串? 我试过了,但它不起作用:char fileName[MAX_PATH + 1]; GetModuleFileNameA(NULL, 文件名, MAX_PATH + 1);返回文件名; 您不能返回 fileName,因为它是一个字符数组,它是定义它的函数的本地字符。从函数返回后,它不再有效。你可以像这样用 C++ 字符串包装它: std::string(fileName) 并返回它。并请描述它不工作的方式。调用 GetModuleFileName 后 fileName 的内容是什么。 我使用 const char* 而不是 std::string 但它仍然无法正常工作,这个输出在我的情况下是这样的:x§Âoé«_x§Âoÿ^¤Øæí2öpÿÿÿÿDçí XLqÿÿÿÿ0öp*/öp¤÷p 如果你试图在 C# 端读取这个返回的字符串,那么它将失败。请查看如何将字符串从 C/C++ DLL 传递到 C# 代码。喜欢这里:***.com/questions/20752001/…【参考方案3】:
#include <windows.h>
#include <shellapi.h>

int argc = 0;
auto wargv = CommandLineToArgvW(GetCommandLineW(), &argc);

auto program_path = wargv[0];

...


LocalFree(wargv);

文档:

https://msdn.microsoft.com/en-us/library/windows/desktop/bb776391(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/windows/desktop/ms683156(v=vs.85).aspx

【讨论】:

【参考方案4】:

视情况而定。

如果您使用带有 /clr 的 c++,您可以使用读取从 Process::GetCurrentProcess() 返回的 Process 的名称。

在 Windows 的本机代码中,您可以使用 GetModuleFileName()

在 Linux 或 MAC 中,根据您的平台有不同的选项。

【讨论】:

以上是关于获取调用我的 dll 的 exe 的名称的主要内容,如果未能解决你的问题,请参考以下文章

xperf 调用堆栈跟踪,特定于 dll

EXE执行文件如何调用DLL?

我的pb生成exe时没有生成相应的DLL是怎么回事?

MFC:如何获取 DLL 文件名?

vc 无dll的代码注入

如何在非托管 c++ dll 中查找调用方程序集名称