获取调用我的 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 的名称的主要内容,如果未能解决你的问题,请参考以下文章