2012-03-19 91 views
0

在Visual Studio 2010 C++中,我讀取argv [0]以獲取工作目錄。Visual C++ 2010:argv [0]是調試模式下的完整路徑,但是發佈模式下只有.exe名稱

在調試模式下,它肯定是顯示該目錄的完整路徑和EXE文件名本身(如預期)

在發行模式下,它不僅具有程序.exe名稱,而不是完整的工作路徑。

  1. 爲什麼呢?
  2. 如何獲取工作目錄?
+0

我或許應該使用的Windows – pete 2012-03-19 18:10:15

+0

黨的GetCurrentDirectory功能,沒有工作 – pete 2012-03-19 18:15:08

+0

出於某種原因,這兩個GetCurrentDirectory和GetModuleFileName是造成訪問衝突。 – pete 2012-03-19 18:23:57

回答

4

MSVC會將用於啓動可執行文件的命令放入argv[0] - 這與當前工作目錄無關。

例如,如果用於發射foo.exe命令是:

  • foo,我發現通過搜索路徑的可執行文件,argv[0]foo
  • c:\foos-dir\foo,(路徑將不搜索)argv[0]c:\foos-dir\foo
  • foo.exe,argv的[0]將是foo.exe

你或許應該得到使用the Win32 GetCurrentDirectory() APIthe _getcwd() runtime function當前工作目錄。

下面是使用GetCurrentDirectory()一個簡單的例子:

TCHAR buffer[128];   
DWORD const buffer_chars = sizeof(buffer)/sizeof(buffer[0]); 

DWORD result = GetCurrentDirectory(buffer_chars, buffer); 

if ((result == 0) || (result >= buffer_chars)) { 
    puts("problem getting the working directory");   
    exit(1); 
} 

printf("Current working directory: %s\n", buffer); 
+0

謝謝。我試圖使用GetCurrentDirectory並失敗。當我做下面的事情時,它給了我訪問衝突: \t LPWSTR whatever =(LPWSTR)「」; \t int ret = GetCurrentDirectory(4096,whatever); – pete 2012-03-19 18:41:28

+0

你的'whatever'指針指向一個不可修改的緩衝區(它是一個字符串文字),更不用說與'4096'的大小有關。我將用一個使用'GetCurrentDirectory()'的簡短例子來更新答案。 – 2012-03-19 19:13:42

+1

您應該使用MAX_PATH而不是硬編碼128。 此外,Visual C++定義_countof()來確定靜態數組的大小。 (保存你的緩衝區/緩衝區[0]語法。) – 2012-03-20 05:35:04

相關問題