顧客が 64 ビット Windows にインストールした 32 ビット プログラムがあります。
その構成で ShellExecute と print 動詞を使用すると問題が発生するようです。まず私のテストプログラム。
// printme.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "objbase.h"
#include <windows.h>
#include <shellapi.h>
int main(int argc, char* argv[])
{
if (argc != 2)
{
printf("Usage: %s file_to_print", argv[0]);
return 0;
}
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) ; //| COINIT_DISABLE_OLE1DDE);
HINSTANCE retVal = ::ShellExecute(NULL, "print", argv[1], NULL, NULL, 0); // don't ask, as the user can always cancel...
printf("RetVal = %08x\n", retVal);
printf("LastError = %08x\n", GetLastError());
return 0;
}
このプログラムは、Windows 7 までの 32 ビット Windows バージョンで正しく動作します。このプログラムは、コマンド ラインで渡された最初の引数で印刷動詞を実行するだけです。
printme Page1.htm
問題のシステムでは、レジストリは次のように設定されています。
HKEY_CLASSES_ROOT\htmlfile\shell\print\command には、rundll32.exe %windir%\system32\mshtml.dll,PrintHTML "%1" を含む REG_EXPAND_SZ 型の既定値が含まれています。
次のコマンド rundll32 c:\windows\system32\mshtml.dll,PrintHTML “Page1.htm” を実行すると、印刷ダイアログが正常に表示されます。
ただし、プログラムを実行すると点滅しますが、印刷ダイアログは表示されず、停止した C:\Windows\sysWow64\rundll32.exe のコピーがプロセス マネージャーにあり、完了しません。
回避策はありますか、または 64 ビット Windows 上の 32 ビット プログラムからの一般的なファイル タイプの一般的な動詞に対して、ShellExecute は永久に壊れていますか?