命令行参数由CreateprocessW截断

时间:2016-02-08 04:53:07

标签: c++ process command arguments truncate

VS10,MBCS,Unicode预处理器defs。 通过谷歌博士的案例手册,最好的帮助是here,但它并没有完全解决这个特殊问题。请考虑以下代码,其中thisexePath是可执行文件的路径:

cmdLineArg = (wchar_t *)calloc(BIGGERTHANMAXPATH, sizeof(wchar_t));
wcscpy_s (cmdLineArg, maxPathFolder, L"\\\\??\\C:\\My directory\\My directory\\");
CreateProcessW (thisexePath, cmdLineArg, NULL, NULL, FALSE, NULL, NULL, NULL, &lpStartupInfo, &lpProcessInfo)

当程序被调用时

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
wchar_t hrtext[256];
swprintf_s(hrtext, sizeof(hrtext), L"%ls", lpCmdLine);
//deal with possible buffer overflow later
MessageBoxW(NULL, hrtext, L"Display", MB_ICONINFORMATION);
}

hrtext只显示“我的目录\我的目录”,这里明显错过了什么?

1 个答案:

答案 0 :(得分:0)

这是不正确的:

wchar_t hrtext[256];
swprintf_s(hrtext, sizeof(hrtext), L"%ls", lpCmdLine);

第二个参数应表示字符数,而不是字节数。

MSDN link to swprintf_s

应该是这样的:

wchar_t hrtext[256];
swprintf_s(hrtext, sizeof(hrtext) / sizeof(wchar_t), L"%ls", lpCmdLine);

或简单地说:

wchar_t hrtext[256];
swprintf_s(hrtext, 256, L"%ls", lpCmdLine);