2012-03-20 6 views
1

64ビットウィンドウに顧客がインストールした32ビットプログラムがあります。ShellExecute印刷動詞が64ビットウィンドウの32ビットアプリケーションから印刷できない

ShellExecuteとその設定での印刷動詞の使用に問題があるようです。まず私のテストプログラム。

// 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のバージョンアップで正常に動作します。

プリントミーPage1.htmを

問題のシステムでは、以下のように、レジストリが設定されています

HKEY_CLASSES_ROOT \ HTMLFILE \シェル\印刷\コマンド ます。rundll32を含むタイプREG_EXPAND_SZのデフォルト値が含まれています.exeファイル%WINDIR%\ SYSTEM32 \ mshtml.dllを、PrintHTML "%1"

私は、次のコマンド ます。rundll32 C実行する場合:\ WINDOWS \ SYSTEM32 \ mshtml.dllを、PrintHTML「Page1.htmを」 印刷ダイアログを正常に表示されます。

私のプログラムの実行は点滅しますが、印刷ダイアログは表示されず、完了していない C:\ Windows \ sysWow64 \ rundll32.exeの停止したコピーがプロセスマネージャにあります。

回避策はありますか、または64ビットウィンドウ上の32ビットプログラムからの共通ファイルタイプの共通動詞に対してShellExecuteが永久に壊れていますか?

+0

[スタート]メニューの[実行]プロンプトからこのコマンドを実行すると、スタックプロセスが発生します。 * elevated * cmdウィンドウからコマンドを実行すると、プロセスが停止することはありませんが、UIは表示されません。私は64ビットのWindows 7を使用しています.UACの問題があると思われます。 –

+0

@AdrianMcCarthyどのコマンドですか? rundll32?またはコンパイルされたバージョンのprintme? htmlファイルは存在しましたか? –

答えて

0

問題が判明したのは、ShellExecuteの最後のパラメータです。 0は何年も働いていましたが、この場合はSW_SHOWが印刷動詞に対して正しく機能する必要があります。おそらく、最近のWindowsのアップデートによって動作が変わったでしょうか?

関連する問題