Я обнаружил ошибку, возвращенную ShellExecuteEx при открытии офисного файла.Это происходит только на некоторых компьютерах, даже если они имеют одинаковую версию ОС / Office / и т. Д.
Я получаю ошибку ERROR_DDE_FAIL с сообщением из офиса с текстом: «Произошла ошибка при отправкекоманда приложения. "
Это код, который я использую:
// Create SHELLEXECUTEINFO structure for passing as parameter to the ShellExecuteEx
// function. Suppress errors by enabling SEE_MASK_FLAG_NO_UI on fMask member.
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof( SHELLEXECUTEINFO );
ShExecInfo.fMask = SEE_MASK_NOASYNC | SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpFile = lpFile;
ShExecInfo.lpVerb = "open";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOWNORMAL;
ShExecInfo.hInstApp = NULL;
//HINSTANCE nResult = ShellExecute(NULL, "open", lpFile, NULL, NULL, SW_SHOWNORMAL);
HRESULT hr = ::ShellExecuteEx( &ShExecInfo );
if (hr == TRUE)
{
::WaitForInputIdle( ShExecInfo.hProcess, INFINITE );
DWORD dwProcessId = ::GetProcessId( ShExecInfo.hProcess );
BOOL bHadLock = FALSE;
// Wait while file lock has been released.
while ( FileInUse( lpFile ) ) {
bHadLock = TRUE;
Sleep( 100 );
}
// Wait while process has stopped running in case of notepad or other
// editors who don't lock file.
if ( !bHadLock ) {
DWORD lpExitCode;
::GetExitCodeProcess( ShExecInfo.hProcess, &lpExitCode );
while ( lpExitCode == STATUS_PENDING ) {
Sleep( 100 );
::GetExitCodeProcess( ShExecInfo.hProcess, &lpExitCode );
}
}
}
else
{
DWORD dwError = ::GetLastError( );
if (dwError == ERROR_DDE_FAIL) {
// Why do I get this error and how to prevent this?
}
}