Shellexecuteexa иногда терпит неудачу с error_file_not_found (2) и меняет lpfile после вызова - почему? ⇐ C++
-
Anonymous
Shellexecuteexa иногда терпит неудачу с error_file_not_found (2) и меняет lpfile после вызова - почему?
// Windows C++ (Unicode build, Visual Studio 2022)
SHELLEXECUTEINFOA execinfo;
ZeroMemory(&execinfo, sizeof(execinfo));
execinfo.cbSize = sizeof(execinfo);
execinfo.lpVerb = "open";
execinfo.lpFile = MakeMiddlewarePath(); // returns a valid absolute path
execinfo.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS;
execinfo.nShow = SW_SHOWMINIMIZED;
BOOL ok = ShellExecuteExA(&execinfo); //
симптом < /strong> < /p>
[*]ShellExecuteExA спорадически возвращает FALSE.
[*]GetLastError() сразу после этого дает 2 (error_file_not_found) [/b].
[*] Файл определенно существует: абсолютный путь, возвращаемый makemiddlewarepath () , действителен. execinfo.lpFile before and after the ShellExecuteExA call, the pointer value itself is unchanged (as expected) but the string it points to is different—the characters have been overwritten.
Work‑around
CString temp = MakeMiddlewarePath(); // cache the string
execinfo.lpFile = temp.GetString(); // pass pointer into ShellExecuteExA
BOOL ok = ShellExecuteExA(&execinfo); // now works 100 % of the time
Использование кэшированного CString (чье время жизни выходит за рамки вызова функции) Исправляет оба вопроса:
нет более случайного error_file_not_found
[*] Содержимое code> code> code> code> code> code> code> code> code> code> /> < /ul>
Что я попробовал /исследовал < /h3>
Подтверждено, что путь файла правильный (зарегистрировал, открыл вручную). < /li>
Убедитесь, что не совпадают с тем, что буфеты. < /li>
Shellexecuteexa Quirks - большинство ответов упоминают цитирование, привилегии или see_mask_unicode , никто не объясните перезапись буфера. Shellexecuteexa для перезаписи этого буфера, используя при использовании стабильного (кэшированного) cstring предотвращает его? Позвоните? Спасибо! < /P>
среда < /strong> < /p>
Windows 10pro22h2 (x64) < /li>
Visual Studio 2022 (17.10) - /Mtd < /code>, c ++ 20 < /li>
ShellExecuteExA< /code>) Используется намеренно (Legacy Code) < /li>
< /ul>
Подробнее здесь: https://stackoverflow.com/questions/795 ... ges-lpfile
// Windows C++ (Unicode build, Visual Studio 2022)
SHELLEXECUTEINFOA execinfo;
ZeroMemory(&execinfo, sizeof(execinfo));
execinfo.cbSize = sizeof(execinfo);
execinfo.lpVerb = "open";
execinfo.lpFile = MakeMiddlewarePath(); // returns a valid absolute path
execinfo.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS;
execinfo.nShow = SW_SHOWMINIMIZED;
BOOL ok = ShellExecuteExA(&execinfo); //
симптом < /strong> < /p>
[*]ShellExecuteExA спорадически возвращает FALSE.
[*]GetLastError() сразу после этого дает 2 (error_file_not_found) [/b].
[*] Файл определенно существует: абсолютный путь, возвращаемый makemiddlewarepath () , действителен. execinfo.lpFile before and after the ShellExecuteExA call, the pointer value itself is unchanged (as expected) but the string it points to is different—the characters have been overwritten.
Work‑around
CString temp = MakeMiddlewarePath(); // cache the string
execinfo.lpFile = temp.GetString(); // pass pointer into ShellExecuteExA
BOOL ok = ShellExecuteExA(&execinfo); // now works 100 % of the time
Использование кэшированного CString (чье время жизни выходит за рамки вызова функции) Исправляет оба вопроса:
нет более случайного error_file_not_found
[*] Содержимое code> code> code> code> code> code> code> code> code> code> /> < /ul>
Что я попробовал /исследовал < /h3>
Подтверждено, что путь файла правильный (зарегистрировал, открыл вручную). < /li>
Убедитесь, что не совпадают с тем, что буфеты. < /li>
Shellexecuteexa Quirks - большинство ответов упоминают цитирование, привилегии или see_mask_unicode , никто не объясните перезапись буфера. Shellexecuteexa для перезаписи этого буфера, используя при использовании стабильного (кэшированного) cstring предотвращает его? Позвоните? Спасибо! < /P>
среда < /strong> < /p>
Windows 10pro22h2 (x64) < /li>
Visual Studio 2022 (17.10) - /Mtd < /code>, c ++ 20 < /li>
ShellExecuteExA< /code>) Используется намеренно (Legacy Code) < /li>
< /ul>
Подробнее здесь: https://stackoverflow.com/questions/795 ... ges-lpfile
Мобильная версия