ShellExecute打印动词无法在64位窗口上从32位应用程序打印

时间:2012-03-20 16:32:23

标签: windows winapi shell-verbs

我有一个32位程序,由客户在64位窗口上安装。

在该配置中使用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版本上正常运行。该程序只是在命令行上传递的第一个参数上运行打印动词。

printme Page1.htm

在相关系统上,注册表设置如下:

HKEY_CLASSES_ROOT \ HTMLFILE \壳\打印\命令 包含类型为REG_EXPAND_SZ的默认值 rundll32.exe%windir%\ system32 \ mshtml.dll,PrintHTML“%1”

如果我运行以下命令 rundll32 c:\ windows \ system32 \ mshtml.dll,PrintHTML“Page1.htm” 打印对话框已成功显示。

然而,运行我的程序会闪烁,但打印对话框永远不会出现,并且会出现停滞的副本 C:\ Windows \ sysWow64 \ rundll32.exe在进程管理器中,永远不会完成。

是否有一种解决方法,或者对于64位窗口上32位程序的常见文件类型的常见谓词是否永久破坏了ShellExecute?

1 个答案:

答案 0 :(得分:0)

事实证明问题是ShellExecute的最后一个参数。虽然0工作多年,但现在要求SW_SHOW在这种情况下正确地用于打印动词。也许最近的Windows更新改变了行为?