【问题标题】:Get the name of the exe which invoke my dll获取调用我的 dll 的 exe 的名称
【发布时间】: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++ 中没有任何代码

标签: c# c++


【解决方案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# 代码。喜欢这里:stackoverflow.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);

文档:

【讨论】:

    【解决方案4】:

    视情况而定。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      相关资源
      最近更新 更多