2017-07-02 85 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有根據您的平臺不同的選擇。