У меня есть 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 \ оболочки \ печать \ команды
содержит значение по умолчанию типа 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-разрядных окнах?