开发者

Getting an ERROR_DDE_FAIL when opening office document using ShellExecuteEx

开发者 https://www.devze.com 2023-03-22 08:58 出处:网络
I encountered an error returned from ShellExecuteEx when opening an office file. This only happens on some pc\'s even while they have same OS/Office version/ etc.

I encountered an error returned from ShellExecuteEx when opening an office file. This only happens on some pc's even while they have same OS/Office version/ etc.

The error I am getting is an ERROR_DDE_FAIL, with an message given from office with the text: "An error occurred in sending the command to the application."

This is the code I am using:

// 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?
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消