2017-07-02 98 views
1

我有一个调用C++ dll的C#项目 并且在返回C++ dll中的值之前,我想检查调用我的方法的C#exe文件的名称。你能帮我建议吗?获取调用我的DLL的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; 
+0

这是如何与C#相关联的,你的DLL是用C++写的,你所能做的只是与C++相关? –

+0

我加载这样的C++ dll:[DllImport(“MindSystem.dll”,EntryPoint =“MindSystemPlusPlus”,CharSet = CharSet.Ansi,CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)] public static extern IntPtr MindSystemPlusPlus int值);当我加载它时,我希望C++ dll检查调用它的exe文件的名称 – MindSystem

+0

我应该删除C++标签吗?我正在寻找一个C++代码。从现在起,我在C++中没有任何代码 – MindSystem

回答

1

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

+1

加载DLL的多个应用程序不应该是一个问题,因为GetModuleFileName()将提供调用DLL函数的进程的可执行文件的路径。我相信这是这个问题的作者想要的东西。 – jacekbe

1

您可以拨打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 
    } 
} 
+0

这是我使用的代码。但如何使用结果来比较它,例如一个字符串? – MindSystem

+0

我试过这个,但它不工作: char fileName [MAX_PATH + 1]; \t \t GetModuleFileNameA(NULL,fileName,MAX_PATH + 1); \t \t return fileName; – MindSystem

+0

您不能返回fileName,因为它是一个字符数组,它是定义它的函数的本地数组。从函数返回后,它不再有效。你可以用C++字符串来包装它,如下所示:std :: string(fileName)并返回它。 请描述它不工作的方式。在调用GetModuleFileName之后,fileName的内容是什么。 – jacekbe

0

这要看情况。

如果您在/ clr中使用C++,则可以使用读取从Process::GetCurrentProcess()返回的Process的名称。

在Windows本地代码,你可以使用GetModuleFileName()

在Linux或Mac有根据您的平台不同的选择。