Microsoft.Windows.ActCtx в Windows Xp - PullRequest
3 голосов
/ 11 июня 2009

В эти дни я очень занят разработкой приложения activex / com. Некоторые из наших клиентов работают в условиях жестких ограничений окон. Поэтому я решил сделать свое заявление беззаботным. Я нашел genman32.exe, который может легко создавать манифесты (также полезен mt.exe). Все прошло нормально, но когда я попытался выполнить свое приложение из wsh (vbs или js), что является обязательным для моей ситуации, потому что приложение работает на ком-сервере -

set o = CreateObject("Application.Interface") 

// No object reference 

Поскольку «CreateObject» смотрит на регистр, и в нем нет записи :), тогда я искал и нашел вещь, которая является «actctx». Это очень легко реализовать в среде dot.net. Но я должен выполнить свое приложение из wsh (vbs или js);), поэтому я решил немного поискать, затем нашел

set o = CreateObject("Microsoft.Windows.ActCtx")
o.manifest = "L:\\Application.dll.manifest"
set app = o.CreateObject("Application.Interface")
app.Launch() // which is my executing function

Проблема - Интерфейс «Microsoft.Windows.ActCtx» недоступен на компьютерах с Windows XP даже в пакете обновления 3 - Microsoft никогда не позволяет это легко - Есть ли решение этой проблемы? Знаете ли вы какие-либо другие методы или обновления Windows, которые создают этот интерфейс?

Ответы [ 2 ]

3 голосов
/ 04 октября 2010

Я выяснил проблему с моим манифестом. Я поделюсь этим со всеми, кто мог столкнуться с подобной проблемой.

Обратите внимание, что вы ДОЛЖНЫ указать свойство progid = "" в своем манифесте при использовании его с интерфейсом "Microsoft.Windows.ActCtx", в противном случае вы получите ошибку компонента ActiveX Component Can't Create Object.

<comClass
clsid="{ED59F192-EF2E-4BCC-95EB-85A8C5C65326}"
progid="myclass.process"
threadingModel = "Apartment" />

Следующий пример манифеста должен заставить вас работать:)

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
  manifestVersion="1.0">

<assemblyIdentity
   type="win32"
   name="myclass"
   version="1.0.0.0"/>

<file name = "myclass.dll">

<comClass
    clsid="{ED59F192-EF2E-4BCC-95EB-85A8C5C65326}"
    progid="myclass.process"
    threadingModel = "Apartment" />

<typelib tlbid="{7AE20C3A-48C2-42C1-A68D-A1C3EB0A2C65}"
       version="1.0" helpdir=""/>

</file>

<comInterfaceExternalProxyStub 
    name="_PROCESS" 
    iid="{187D0811-470D-44C0-B68C-C1C7F3EEFDA0}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid = "{7AE20C3A-48C2-42C1-A68D-A1C3EB0A2C65}" />

</assembly>
1 голос
/ 16 июня 2009

Если бы Microsoft.Windows.ActCtx можно было распространять, ему нужно было бы каким-то образом попасть на компьютер и зарегистрироваться во всем мире. Если у вас был доступ, чтобы зарегистрировать это на компьютере, не могли бы вы просто зарегистрировать Application.Interface? Если вы имеете дело с ограниченной средой ... ну, вы должны иметь дело с тем, что уже доступно.

Похоже, вы используете скрипт wsh для запуска приложения. Почему бы не написать заглушку для запуска приложения в собственном или управляемом коде (где вы сможете использовать манифест), а вместо этого вызвать эту заглушку?

...