Глагол печати ShellExecute не может печататься из 32-битного приложения в 64-битных окнах
У меня есть 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;
}
Эта программа корректно работает на 32-битных версиях Windows до Windows 7. Программа просто запускает команду печати для первого аргумента, переданного в командной строке.
printme Page1.htm
В рассматриваемой системе реестр настроен следующим образом:
Команда HKEY_CLASSES_ROOT\htmlfile\shell\print\ содержит значение по умолчанию типа 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 находится в диспетчере процессов, который никогда не завершается.
Есть ли обходной путь, или ShellExecute навсегда поврежден для общих глаголов в общих типах файлов из 32-разрядных программ в 64-разрядных окнах?
1 ответ
Оказывается, проблема заключается в последнем параметре ShellExecute. Хотя 0 работал годами, теперь он требует, чтобы SW_SHOW работал правильно для глагола печати в этом случае. Возможно, недавнее обновление Windows изменило поведение?