2012-03-20 255 views
1

我有一个32位程序,由客户在64位窗口上安装。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; 
} 

该程序正常工作在32位Windows版本升级到Windows 7的计划只是运行在命令行上传递的第一个参数打印动词。

printme 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中的一个停止副本为 ,它在进程管理器中,从未完成。

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

+0

如果我从开始菜单中的运行提示符运行该命令,我得到卡住的进程。如果我从*提升的* cmd窗口运行该命令,该过程不会卡住,但我没有看到任何UI。我使用64位Windows 7.我怀疑你有一个UAC问题。 – 2012-03-20 17:11:06

+0

@AdrianMcCarthy哪个命令? RUNDLL32?或者printme的编译版本? HTML文件是否存在? – 2012-03-20 17:24:07

回答

0

原来问题是ShellExecute的最后一个参数。虽然0工作了多年,但现在需要SW_SHOW才能在此情况下正确运行打印动词。也许最近的Windows更新改变了行为?

相关问题