TimGallin Ответов: 1

Не слишком ли долго lpparameters SHELLEXECUTEINFO работают в windows xp?


UpdateData(TRUE);

SHELLEXECUTEINFOA sei;
memset(&sei, 0, sizeof SHELLEXECUTEINFOA);
sei.cbSize = sizeof SHELLEXECUTEINFOA;
sei.fMask = SEE_MASK_NOCLOSEPROCESS /*| SEE_MASK_FLAG_NO_UI*/;
sei.lpVerb = "runas";
sei.lpDirectory = GetModulePath();
sei.lpFile = "curl.exe";
sei.lpParameters = m_strCmd;
//MessageBox(m_strCmd, _T("tip"), MB_OK);
sei.nShow = SW_SHOW;
if (!ShellExecuteExA(&sei))
{
    CString strLog;
    strLog.Format(_T("启动curl失败(code:0x%x)"), GetLastError());
    MessageBox(strLog);
    return;
}

В этом коде lpParameters - это длинная строка длиной более 2048, ошибки возникают при запуске кодов в"ShellExecuteExA(& sei)", ошибка - " необработанное исключение в RunCurl.exe(KERNELE32.DLL): 0xC0000005: нарушение доступа."(RunCurl.exe это название моего проекта).Это похоже на доступ к памяти,но я не знаю, что делает это.Если я уменьшу длину lpParameters, то эта функция будет работать нормально.Если я запускаю эту функцию с длинным lpParameters(длина более 2048) в CMD, то она тоже работает нормально.И эта ошибка никогда не возникала на WIN7,я думаю, если SHELLEXECUTEINFOA не может получить слишком длинную строку на XP?

Что я уже пробовал:

читайте msdn, отладку в xp и WIN7, google

1 Ответов

Рейтинг:
2

KarstenK

Вы правы. На "старой доброй" Windows XP параметр не может быть таким длинным.

Теперь вы знаете, почему Windows 7 более современна ;-)


TimGallin

Да, спасибо, теперь я знаю причину.Если я использую ShellExecute на XP, ограничение lpParameters составляет около 2048, ограничение CreateProcess-около 32767,CMD.EXE это где-то рядом 8192.Is есть ли решение для решения этой проблемы, когда я использую ShellExecute ?