如何在使用L前缀(Visual C ++编译器)时#define硬编码字符串?

时间:2012-03-14 06:42:52

标签: c++ c visual-studio visual-c++

如何#define路径L“C:\ Windows \ System32 \ taskmgr.exe”以处理宽字符

#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); 

3 个答案:

答案 0 :(得分: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 :(得分:3)

您使用的是哪个版本的Visual C ++?这适用于Visual Studio 2008:

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

如果像Xeo所评论的那样,想要扩展char数组,请使用MultiByteToWideChar

答案 2 :(得分: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");

硬编码路径名称的常见咆哮也适用。