Следующая логика реализована для открытия файла с помощью «filename.extension» в приложении C++ с использованием управляемого C++:
try
{
CoInitialize(nullptr);
auto task = Concurrency::create_task(Windows::Storage::StorageFile::GetFileFromPathAsync(filePath));
// an excpetion is thrown in the next line
Concurrency::task_status status = task.then([&](Windows::Storage::StorageFile^ file){
if (file != nullptr)
{
concurrency::task<bool> launchFileOperation(Windows::System::Launcher::LaunchFileAsync(file));
launchFileOperation.then([&](bool success)
{
if (!success)
return 0;
}).wait();
}
}).wait();
}
catch (...)
{
CoUninitialize(); // an exeption is catched
return 0;
}
Поскольку приведенный выше код выдает исключение, мы переходим к альтернативному подходу к открытию файла через ::ShellExecuteEx
SHELLEXECUTEINFO exec_info = {0};
exec_info.cbSize = sizeof exec_info;
exec_info.fMask = SEE_MASK_NOCLOSEPROCESS
| SEE_MASK_DOENVSUBST;
exec_info.fMask &= ~SEE_MASK_NOASYNC;
exec_info.lpVerb = "open";
exec_info.lpFile = full_path_str;
exec_info.nShow = SW_SHOW;
bool result_b = ::ShellExecuteEx(&exec_info) ? true : false;
::ShellExecuteEx терпит неудачу и попадает в Microsoft ppltasks.h_REPORT_PPLTASK_UNOBSERVED_EXCEPTION();.
::ShellExecuteEx работает корректно, если удален подход на основе управляемого C++ Concurrency::create_task.
Почему Concurrency::create_task влияет на дальнейший вызов ::ShellExecuteEx?
Эта проблема появляется только в релизной сборке.
@SimonMourier, если первая часть кода не может открыть файл -> перейдите в ShellExecuteEx. Нравится if (!openFileViaTasks()){ShellExecuteEx(..)};





Добавление блоков try/catch к самому внутреннему блоку .wait() решило проблему.
try {
concurrency::task<bool> launchFileOperation(Windows::System::Launcher::LaunchFileAsync(file));
launchFileOperation.then([&](bool success) {
// logic
}).wait();
}
catch (concurrency::invalid_operation& ex)
{
...
}
catch (concurrency::task_canceled& ex)
{
...
}
Какая связь между ShellExecuteEx и первой частью вашего кода? Примечание. Для ShellExecuteEx требуется, чтобы поток был STA (CoInitialize(NULL) и т. д.).