1

顧客が 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 は永久に壊れていますか?

4

1 に答える 1

0

問題はShellExecuteの最後のパラメーターであることがわかりました。0は何年も機能していましたが、この場合、印刷動詞に対してSW_SHOWが正しく機能する必要があります。おそらく、最近のWindows Updateによって動作が変更されましたか?

于 2012-03-21T22:12:12.297 に答える