Shellexecuteexa иногда терпит неудачу с error_file_not_found (2) и меняет lpfile после вызова - почему?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Shellexecuteexa иногда терпит неудачу с error_file_not_found (2) и меняет lpfile после вызова - почему?

Сообщение Anonymous »


// 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»