Получение ERROR_DDE_FAIL при открытии офисного документа с помощью ShellExecuteEx - PullRequest
1 голос
/ 22 июля 2011

Я обнаружил ошибку, возвращенную 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?
    }
}
...