Getting an ERROR_DDE_FAIL when opening office document using ShellExecuteEx
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?
}
}
精彩评论