Скажем, у вас есть приложение, которое вы хотите предоставить пользователям возможность просматривать каталог system32 и запускать программы (например, telnet).
Каков наилучший метод для поддержки этого, когда вам нужно поддерживать XP в качестве клиента и 2k в качестве сервера?
Написав все это, я задаюсь вопросом, не слишком ли много времени / усилий для обеспечения просмотра, чтобы сделать это, где они могли бы просто скопировать его из проводника. Требуется возможность запуска.
Я нашел обсуждение на Найнив .
Пока, похоже, есть следующие опции
- Создайте папку sysnative в Windows, которая позволит вам просматривать / выполнять 64-битные. Проблемы:
- доступно только в Vista / Longhorn, поэтому нет поддержки XP 64
- приводит к разным именам путей, не может использовать один и тот же путь в нескольких версиях.
- будет активен для всех окон, а не только для нашего приложения
- может не (вероятно, не) делать при установке приложения
- позволяет явно указать через путь только, какую версию приложения запускать, если есть 32-битная и 64-битная версия
- Используйте Windows API для временного отключения перенаправления при отображении списков файлов или выполнении пользователем команд запуска. Проблемы:
- Доступно только в 64-битной версии - придется связываться с GetProcAddress
- доступно только для определенных пакетов обновлений
- должен индивидуально идентифицировать все места, которые должны быть реализованы
- пользователь должен будет предоставить отдельную информацию о том, является ли это 64-битным приложением или 32-битным.
Если бы у кого-нибудь был пример кода, который отображал диалоговое окно Windows OpenFile (скажем, с использованием MFC CFileDialog), показывающее нативно для XP / Vista и позволяющее просматривать 64-битный каталог system32, это было бы здорово.
Если бы у кого-нибудь был пример запуска названного приложения, это тоже было бы здорово!
Edit:
В настоящее время мы используем CreateProcess для запуска приложения (которое не работает).
err = CreateProcess((wchar_t*)exeName.c_str(), (wchar_t*)cmdLine.c_str(), NULL, NULL, FALSE, CREATE_SEPARATE_WOW_VDM, NULL, workingDir.c_str(), &startupInfo, &processInfo);