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

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

Сообщение Anonymous »

Я работаю над проектом Windows C ++, используя Visual Studio 2022 с сборкой Unicode, и я сталкиваюсь с проблемой с ShellexeCuteexa . Он периодически терпит неудачу с помощью error_file_not_found (код ошибки 2), даже если путь файла является правильным. Проблема, по -видимому, связана с обработкой строки пути файла, переданной в ShellexeCuteexa .
журналы отладки:
Я добавил журнал, чтобы распечатать путь к файлу до и после вызова Shellexecutexa , но заметил, что «после» forge не будет печатать. «До» журнала печатает правильный путь файла, но после вызова Shellexecuteexa , журнал «после» не является выводом, предполагая, что что-то может изменить или перезаписать строку перед вторым вызовом журнала.

Код: Выделить всё

LOG_CONSOLE("Before: %s", _strdup(execinfo.lpFile));   // Print the file path before execution
BOOL bIsExecute = ShellExecuteExA(&execinfo);          // This intermittently fails with ERROR_FILE_NOT_FOUND
LOG_CONSOLE("After: %s", _strdup(execinfo.lpFile));    // This log's Path does not appear after execution
< /code>
 Вывод текущего журнала: < /h4>
Before: C:\Users\\Desktop\MyProgram.exe
After:          // After log's Path does not appear
< /code>
Путь журнала «после» не появляется, даже если путь кажется действительным в журнале «до». Эта проблема возникает только при использовании необработанного указателя, возвращаемого makemiddlewarepath () < /code>. < /P>
 Симптом: < /h3>
[list]
[*]ShellExecuteExA
спорадически возвращает false .
[*]

Код: Выделить всё

GetLastError()
дает 2 (error_file_not_found) , но файл определенно существует на указанном пути. Cstring .
[/list]
code:

Код: Выделить всё

// Windows C++ (Unicode build, Visual Studio 2022)

SHELLEXECUTEINFOA execinfo;
ZeroMemory(&execinfo, sizeof(execinfo));
execinfo.cbSize = sizeof(execinfo);
execinfo.lpVerb = TEXT("open");
execinfo.lpFile = MakeMiddlewarePath();  // File path
execinfo.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS;
execinfo.nShow = SW_SHOWMINIMIZED;

LOG_CONSOLE("Before: %s", _strdup(execinfo.lpFile));
BOOL bIsExecute = ShellExecuteExA(&execinfo);  // 

Подробнее здесь: [url]https://stackoverflow.com/questions/79589834/shellexecuteexa-sometimes-fails-with-error-file-not-found-2-and-changes-lpfile[/url]
Ответить

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

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

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

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

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