2012-03-14 41 views
2

如何#定義路徑L 「C:\ WINDOWS \ SYSTEM32 \的TaskMgr.exe」 爲++您使用的處理寬字符如何在使用L前綴(Visual C++編譯器)時定義硬編碼的字符串?

#define TASK_MGR "C:\\Windows\\System32\\taskmgr.exe" 

KillProcess(TASK_MGR); //this works 

HINSTANCE resurrect = ShellExecute(NULL, L"open", L"C:\\Windows\\System32\\taskmgr.exe", NULL, NULL, SW_MINIMIZE); 
+0

你究竟想要完成什麼?擴展'TASK_MGR'提供的字符串? – Xeo 2012-03-14 07:03:07

+1

這樣的硬代碼路徑非常糟糕的想法 – 2012-03-14 07:07:26

+1

爲什麼自己處理ansi/unicode轉換時遇到麻煩?讓你的應用程序是純粹的unicode,你已經刪除了一個問題。最好的解決方案是解決問題的解決方案。 – 2012-03-14 07:10:59

回答

3

的Visual C的哪個版本?這適用於Visual Studio 2008中:

#define PATH L"C:\\Windows\\System32\\taskmgr.exe"; 
void func() 
{ 
    const wchar_t *test = PATH; 
} 

如果像XEO評論說,要擴大字符數組,使用MultiByteToWideChar

+0

我*想*他想擴大已經'#define'd字符串,但它很不清楚......順便說一句,擺脫定義中的';'。 – Xeo 2012-03-14 07:02:44

+0

您可以使用另一個宏來啓動它,類似於_T()宏 – Necrolis 2012-03-14 07:10:21

+0

謝謝Crend,Xeo和Necrolis。 – Martin 2012-03-19 13:10:09

4

您需要使用多個宏。幸運的是,Windows頭文件已經定義了這樣一個宏,它在必要時會擴展字符串文字,TEXT(),所以沒有必要編寫自己的理由。

下面的代碼工作正常:

#define TASK_MGR "C:\\Windows\\System32\\taskmgr.exe" 

KillProcess(TASK_MGR); // Not sure what KillProcess is or why it takes a narrow 
         // string, regardless of whether Unicode is defined... 
         // The Win32 function is named TerminateProcess. 

HINSTANCE resurrect = ShellExecute(NULL, L"open", TEXT(TASK_MGR), NULL, NULL, 
            SW_MINIMIZE); 

...好吧,除了這個事實,你硬編碼的路徑,任務管理器,它不會在所有機器上的那個位置(被發現像我一樣)。但我相信這僅僅是爲了舉例的目的,並且您已經知道不要硬編碼路徑。

+1

+1用於提示TEXT()。 – ComicSansMS 2012-03-14 07:26:24

+0

@你是正確的,例如硬編碼路徑的目的。謝謝。 – Martin 2012-03-14 08:56:35

3

您可以使用字符串連接:

#define TASK_MGR "C:\\Windows\\System32\\taskmgr.exe" 

/* ... */ 

HINSTANCE resurrect = ShellExecute(NULL, L"open", L"" TASK_MGR, NULL, NULL, SW_MINIMIZE); 

就個人而言,我會用

static TCHAR const TASK_MGR[] = _T("C:\\Windows\\System32\\taskmgr.exe"); 

通常的咆哮去硬編碼路徑名也同樣適用。

+0

當我使用這種方法時,我得到編譯器錯誤C2308 – Martin 2012-03-14 10:24:36

相關問題