Можно ли использовать COM без регистрации с приложениями HTA?

Поскольку приложения HTA ​​размещаются в MSHTA.exe, как можно предоставить манифест? Кроме того, я предполагаю, что предоставление MSHTA.exe.manifest потенциально может нарушить работу других приложений HTA?


person Matt Davison    schedule 27.01.2009    source источник


Ответы (2)


В Vista + MSHTA.exe имеет встроенный манифест, который имеет приоритет над внешними манифестами, поэтому ваше предложение не подходит.

В XP / 2003, да, ваше предложение будет работать, хотя это будет плохой тон, как и удаление файлов в System32 для изменения поведения системного двоичного файла (особенно убедитесь, что любая регистрация, которую вы вводите в манифест, является объектами, которыми вы являетесь только один, о котором нужно заботиться).

Правильным решением, доступным в Win2003 и выше, является использование Microsoft.Windows.ActCtx, чтобы создать экземпляр вашего объекта с учетом явной ссылки на манифест.

Например:

var actCtx = WScript.CreateObject("Microsoft.Windows.ActCtx");
actCtx.Manifest = "myregfree.manifest";
var obj =  actCtx.CreateObject("MyObj");   

Возможно, если это должно работать и на XP, вы можете выбрать комбинацию обоих решений.

person Eugene Talagrand    schedule 19.04.2009
comment
Кто-нибудь проверял, включает ли XP SP3 сборку ActCtx? Судя по ссылке выше, он также может быть развернут. - person Bob; 31.05.2009
comment
Я пробовал это, и он работает только в том случае, если я помещаю свою DLL в тот же каталог, что и MSHTA.exe - могу ли я поместить свою DLL в другой (не ограниченный UAC) каталог и указать MSHTA с настройками? Ничего из того, что я пробовал в файле манифеста, похоже, не работает, атрибут loadFrom игнорируется. - person Andrew; 15.12.2009
comment
Технически манифест myregfree.manifest выше является манифестом приложения. Регистрационные данные COM должны быть помещены в манифест сборки для проверки правильного каталога. То есть myregfree.manifest не должен иметь самих регистрационных данных, вместо этого он должен зависеть от второго манифеста, в котором есть данные. - person Eugene Talagrand; 08.01.2010
comment
Да, в Windows 7 ничего не изменилось - person Eugene Talagrand; 01.02.2012

Изменить: мой ответ неверен, но я оставлю его здесь, чтобы избежать подобных неправильных ответов :)


Если вы спрашиваете, можете ли вы получить доступ к COM-объекту, не регистрируя его на машине, то я думаю, что ответ - предварительный да. Однако работа, которую вам нужно будет выполнить, будет существенной и потребует реализации большого количества низкоуровневого кода, который, конечно же, предоставляет вам большинство инструментов разработки (Delphi, .NET, JAVA). Вам нужно будет напрямую взаимодействовать с dll (как обычная dll), запрашивать ее интерфейсы и вызывать свои методы.

Если у вас есть знания C, C ++, то способ доступа к COM с этих языков может дать вам несколько указателей.

Извините, я больше ничем не могу помочь.

person Toby Allen    schedule 05.02.2009
comment
Конечно, я мог бы использовать старые методы LoadLibrary / GetProcAddress, но это приложение HTA ... Я не понимаю, как мне делать вызовы Win32 API из HTA? - person Matt Davison; 06.02.2009
comment
Вопрос касался бесплатного COM-порта, который является функцией, добавленной в ОС. Благодаря этой функции вызовы COM прозрачны, нет необходимости в вызовах LoadLibrary и т. Д. При этом функция основана на связывании манифеста с клиентским приложением, поэтому я не думаю, что вы можете сделать это из HTA. - person DSO; 06.02.2009