1

Тема: WSH: Использование COM-сервера без его регистрации в системе

Есть тема VBScript: работа с WSC-серверами без их регистрации
А можно ли задействовать таким же обазом dll и ocx?
Метод GetObject с указанием пути к файлу выдаёт ошибку.

Set DX = GetObject("C:\DynamicWrap\dynwrap.dll","DynamicWrapper")

Быть может есть решение?

2

Re: WSH: Использование COM-сервера без его регистрации в системе

Реестр: регистрация COM-компонентов для пользователя

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3

Re: WSH: Использование COM-сервера без его регистрации в системе

Это как раз таки противоположное.
Мне интересно как использовать COM-objects без регистрации. Думаю такое возможно.
Эх, пойду Г.Борна полистаю, может чего интересного и найду

4

Re: WSH: Использование COM-сервера без его регистрации в системе

kiber_punk
Да не такое уж и противоположное . Собственно, в чём проблема и неудобство регистрации? Только в правах, имхо. А приведённое решение эту проблему вроде как обходит. Можно написать скриптовый код, который зарегистрирует компонент таким способом непосредственно перед его использованием.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

5

Re: WSH: Использование COM-сервера без его регистрации в системе

Думаю, Борна листать бесполезняк. Если бы такое было возможно, уже напропалую бы этим пользовались. Но если чего налистаешь, не забудь поделиться.

6

Re: WSH: Использование COM-сервера без его регистрации в системе

http://habrahabr.ru/blogs/javascript/52027/

Мой пример для wscript.
Я скопировал wscript.exe и dynwrapx.dll в отдельную папку и создал файлы (кодировка utf-8):

фаил

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

<assemblyIdentity
  type="win32"
  name="wscript.exe"
  version="1.0.0.0" /> 

  <dependency>
          <dependentAssembly>
              <assemblyIdentity
                  type="win32"
                  name="dynwrapx.sxs"
                  version="1.0.0.0" />
          </dependentAssembly>
  </dependency>

  <dependency>
          <dependentAssembly>
              <assemblyIdentity
                  type="win32"
                  name="sqlite3.sxs"
                  version="1.0.0.0" />
          </dependentAssembly>
  </dependency>

  <dependency>
          <dependentAssembly>
              <assemblyIdentity
                  type="win32"
                  name="WSO.sxs"
                  version="1.0.0.0" />
          </dependentAssembly>
  </dependency>

  <dependency>
          <dependentAssembly>
              <assemblyIdentity
                  type="win32"
                  name="Microsoft.Windows.Common-Controls"
                  version="6.0.0.0"
                  publicKeyToken="6595b64144ccf1df"
                  language="*"
                  processorArchitecture="x86"/>
          </dependentAssembly>
  </dependency>

</assembly>

Фаил

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

<assemblyIdentity
    type="win32"
    name="dynwrapx.sxs"
    version="1.0.0.0" />

<file name="dynwrapx.dll" hash="1f87eeb37156d64de97d042b9bcfbaf185f8737d" hashalg="SHA1">
     <comClass
        description="DynamicWrapperX Class"
        clsid="{89565275-A714-4a43-912E-978B935EDCCC}"
        threadingModel="Both"
        progid="DynamicWrapperX" />

</file>

</assembly>

(и т.д.)

В принципе можно оставить их в system32.

7

Re: WSH: Использование COM-сервера без его регистрации в системе

Действительно, работает! Спасибо! Кто бы мог подумать. И статью про WSO я уже раньше читал, но как-то пропустил этот момент.

8

Re: WSH: Использование COM-сервера без его регистрации в системе

Замечательно:) Оформим и добавим в коллекцию?

9

Re: WSH: Использование COM-сервера без его регистрации в системе

JSman пишет:

Замечательно:) Оформим и добавим в коллекцию?

Да, прошу Разработчиков это сделать.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

10

Re: WSH: Использование COM-сервера без его регистрации в системе

YMP пишет:

Действительно, работает! Спасибо! Кто бы мог подумать. И статью про WSO я уже раньше читал, но как-то пропустил этот момент.

Хорошо бы поподробнее разжевать, что есть WSO.dll, и как её «готовить».

11

Re: WSH: Использование COM-сервера без его регистрации в системе

alexii пишет:

Хорошо бы поподробнее разжевать, что есть WSO.dll, и как её «готовить».

Наверно хорошо бы, но я в неё толком не вникал, просмотрел бегло, почему и пропустил про трюк с манифестами.

12

Re: WSH: Использование COM-сервера без его регистрации в системе

The gray Cardinal пишет:

Да, прошу Разработчиков это сделать.

Просить всех = просить никого.

Мне лично сложно оценить практическую ценность этого решения. Удобно ли оно реально не для абстрактного клиента, а конкретно для WSH? Надеюсь, kiber_punk не совсем пропал и что-нибудь скажет по этому поводу. Тема-то как-никак его. Попробовал почитать про эту Side-by-Side Assembly. Там этой мути хлебать не выхлебать, пока разберёшься. Ещё это Assembly постоянно сбивает мысли на ассемблер и путает вконец.

13

Re: WSH: Использование COM-сервера без его регистрации в системе

Эта фича была реализована microsoft'ом по сути то для более плавного перехода с архитектуры ActiveX/COM на .NET/Assembly. Работает примерно так. OS для запускаемого экзешника ищет *.manifest в начале в его ресурсах, если не находит смотрит в той же папке, где он лежит, и если не находит то действует как обычно. А если находит, то действует в соответствии с ним: загружает библиотеки, разрешает имена, и т.д. (в том числе и для activex). И только потом смотрит реестр, заголовки экзешника и т.д. Манифест соответственно имеет более высокий приоритет.

Особой значимой пользы я в этом не вижу, но удобно. Разве что для "унаследованного кода", что бы избежать использования реестра, или использовать разные реализаций одного компонента, или подменять компонент, который бы загружался через реестр, на свой. Отпадает необходимость следить за целостностью данных в реестре, и т. д.

Мне этот способ удобен тем, что нет необходимости регистрироваться/дерегистрироваться (либо копировать файлы в system32) на каждом компьютере на котором я запускаю свои скрипты (мне нравится jscript; они все у меня на флешке), проверять уже зарегистрированные, проверять версии, ... Всегда точно известно, что будет загружено. Хотя придётся, как в моём примере, таскать, помимо скриптов, ещё минимум 4 файла; пути запуска при перемещении скорее всего будут разные.

14

Re: WSH: Использование COM-сервера без его регистрации в системе

max7, спасибо. А какой-либо доступный пример приведёте? Можно на своих собственных разработках, хотя бы и той, что выше. Желательно с комментариями, чтобы можно было поместить в Коллекцию; т.е. разжевать, что есть «type="win32"»; почему, например, нужно два манифеста, а нельзя обойтись только одним — только для «dynwrapx.dll»; почему в первом нет «<file=… hash=…», а во втором есть; где брать «publicKeyToken» и т.п.

Осилите? Можно прямо здесь, а то, думаю, вопросы у меня ещё будут.

15

Re: WSH: Использование COM-сервера без его регистрации в системе

Возможно, хотя...
На какие-то вопросы, наверное, смогу ответить. Приведу цитату показывающий "откуда ноги растут", воспринимаем её с юмором, но с долей серьёзности.

Что за новый подкаталог WinSxS с dll-ками появился в каталоге Windows? Для чего он нужен?
WinSxS, или Windows Side by Side (бок о бок), является еще одним новшеством Windows XP. Microsoft, озаботившись криворукостью программистов, создала систему, позволяющую сохранять несколько версий одинаковых библиотек (DLL) и использовать при необходимости именно ту, что требует конкретная программа. Дело в том, что некоторые программы почему-то считают, что только они имеют нужную версию DLL, и перезаписывают при инсталляции даже более новую версию библиотеки, что может привести ко всякого рода неприятностям, поэтому, если какая-нибудь программа вздумает беспричинно заменить уже имеющуюся в системном каталоге DLL, операционная система поместит сомнительную библиотеку в специальную папку (WinSxS), а дурная программа так и останется уверенной, что сделала свое черное дело

В папках %WinDir%\WinSxS\Manifests и %WinDir%\WinSxS\Policies можно, в зависимости от количества установленного софта, любоваться манифестами и различными версиями одних и тех же библиотек.

Разжевать, что есть «type="win32"» я не буду (лень если честно). Об этом прямо и четко написано на сайте microsoft'а (и в google ;-).

Почему, например, нужно два манифеста. У них совершенно разная структура и задачи. В моём примере wscript.exe.manifest привязывается к  wscript.exe и описывает по сути, где брать инфу об указанных компонентах (учитываются все параметры). dynwrapx.sxs.manifest содержит описание непосредственно dynwrapx.dll («<file=… hash=…»), в том числе имена вроде progid="DynamicWrapperX", file name="dynwrapx.dll" и т.д.. Если изменить на progid="ABC", то будет работать код

   
var dx = new ActiveXObject("ABC");
var mystr = dx.Space(20,"x");
WScript.Echo(mystr + " : "+mystr.length);

publicKeyToken  нужен для идентификации и для работы с ключами и сертификатами и в данном контексте не интересен. Приведу цитату

В общедоступной сборке System.Drawing инструкция метаданных publickeytoken = (ВО 3F 5F 7F 11 D5 ОА ЗА) содержит лексему открытого ключа, представляющую собой самые младшие 8 байтов хэш-кода открытого ключа, который соответствует своему секретному ключу, принадлежащему автору сборки System.Drawing. Эта лексема открытого ключа не может фактически непосредственно использоваться для того, чтобы подтвердить подлинность автора сборки System.Drawing. Однако первоначальный открытый ключ, указанный в декларации System.Drawing может использоваться, чтобы математически проверить, что для того, чтобы подписать сборку System.Drawing в цифровой форме на самом деле использовался соответствующий секретный ключ. Поскольку Microsoft создала System.Drawing.dll, лексема открытого ключа, приведенная выше, принадлежит, несомненно, Microsoft.

16

Re: WSH: Использование COM-сервера без его регистрации в системе

Вот ещё для затравки текст 

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

<assemblyIdentity
    type="win32"
    name="WSO.sxs"
    version="1.0.0.0" />

<file name="WSO.dll" hash="1d3220b1032c4e0ab3772aa21399c9db648cbde0" hashalg="SHA1">

    <comClass
        description="WindowSystemControl Class"
        clsid="{8E57EFA4-E91E-44FC-B69E-7A3BC1F5AB8D}"
        threadingModel="Both"
        progid="Scripting.WindowSystemControl"
        tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

    <comClass
        description="WindowSystemObject Class"
        clsid="{4CE85115-9B90-419F-9193-1C10C75E1383}"
        threadingModel="Both"
        progid="Scripting.WindowSystemObject"
        tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

    <typelib tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}"
        version="1.0"
        helpdir="V:\m7.core\jsb\kernel\" />

</file>

<comInterfaceExternalProxyStub
    name="IControlEvents"
    iid="{EE85ACDD-7499-4719-A173-FCC56CE6FA1D}"
    proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

<comInterfaceExternalProxyStub
    name="IFormEvents"
    iid="{E83611E0-B0CD-4087-887B-4A0454176AA9}"
    proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

<comInterfaceExternalProxyStub
    name="IActionEvents"
    iid="{EFCC7766-9D3D-48CE-94B0-F0EAC186B763}"
    proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

<comInterfaceExternalProxyStub
    name="ITimerEvents"
    iid="{E00E8E3D-8933-4679-B250-257A46743389}"
    proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

<comInterfaceExternalProxyStub
    name="IHeaderItemEvents"
    iid="{A71BDEAC-05C9-4594-854D-671071B3C110}"
    proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

<comInterfaceExternalProxyStub
    name="IHeaderEvents"
    iid="{09D9EF1F-9DA1-4E05-9557-B3F692E5775B}"
    proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

<comInterfaceExternalProxyStub
    name="IListViewEvents"
    iid="{A55B1FD3-30D4-479B-8F33-3978EB403A0B}"
    proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

<comInterfaceExternalProxyStub
    name="ITreeViewEvents"
    iid="{FFC21772-F6D8-4AFC-A2F4-362C11DF0019}"
    proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

<comInterfaceExternalProxyStub
    name="IRichEditEvents"
    iid="{B93AF23C-1D4E-48A4-9A5C-BC835FD0F39A}"
    proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

<comInterfaceExternalProxyStub
    name="IFindReplaceDialogEvents"
    iid="{5CD2D30B-5F65-4529-9A7F-9DCAB56B5310}"
    proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

<comInterfaceExternalProxyStub
    name="IFileOpenSaveDialogEvents"
    iid="{BAE2B02E-9BD5-4D6D-824E-197CC72CF040}"
    proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

<comInterfaceExternalProxyStub
    name="ISelectFolderDialogEvents"
    iid="{C5A781AE-2868-4470-972D-39BEAE4721FC}"
    proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

<comInterfaceExternalProxyStub
    name="ITrayIconEvents"
    iid="{0EE395DB-AF4D-4493-861E-B0E1966FD5DB}"
    proxyStubClsid32="{00020420-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

<comInterfaceExternalProxyStub
    name="IRegion"
    iid="{BB9FCB6F-2C14-4568-BADF-E7C0B022A654}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

</assembly>

17

Re: WSH: Использование COM-сервера без его регистрации в системе

Вот ещё если кому интересно для http://www.assembla.com/wiki/show/litex LiteX Automation

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

<assemblyIdentity
    type="win32"
    name="sqlite3.sxs"
    version="1.0.0.0" />

<file name="sqlite3.dll">

    <comClass
        description="LiteConnection Class"
        clsid="{3E22694D-7B92-42A1-89A7-668E2F7AA107}"
        threadingModel="Both" 
        progid="LiteX.LiteConnection"
        tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}" />

    <comClass
        description="LiteStatement Class"
        clsid="{453A51CC-F944-4643-9540-A78253B8019C}"
        threadingModel="Both" 
        progid="LiteX.LiteStatement"
        tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}" />

    <comClass
        description="LargeInteger Class"
        clsid="{25EE8E01-5237-41F1-B29F-6AF441CF0924}"
        threadingModel="Both" 
        progid="LiteX.LargeInteger"
        tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}" />

<!--

    <comClass
        description="LiteRows Class"
        clsid="{5AD25519-5946-420F-B068-BCCC3856363D}"
        threadingModel="Both" 
        progid="LiteX.LiteRows"
        tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}" />

    <comClass
        description="LiteColumns Class"
        clsid="{048DC1D9-E121-481C-8DFF-BC797993F2EC}"
        threadingModel="Both" 
        progid="LiteX.LiteColumns"
        tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}" />

    <comClass
        description="LiteColumn Class"
        clsid="{10338227-2DC2-4A37-AF40-E5BF89FF4F10}"
        threadingModel="Both" 
        progid="LiteX.LiteColumn"
        tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}" />

    <comClass
        description="LiteRow Class"
        clsid="{98FADC8F-1348-4EBD-B104-6D7CA93C8DEC}"
        threadingModel="Both" 
        progid="LiteX.LiteRow"
        tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}" />

    <comClass
        description="LiteParameters Class"
        clsid="{7BAB4761-C1FA-458A-8993-F9667DF51F32}"
        threadingModel="Both" 
        progid="LiteX.LiteParameters"
        tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}" />

    <comClass
        description="LiteParameter Class"
        clsid="{0100C8E3-E467-4944-825D-7089A6EEC1B2}"
        threadingModel="Both" 
        progid="LiteX.LiteParameter"
        tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}" />

-->

    <typelib tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}"
        version="1.0"
        helpdir="V:\m7.core\jsb\bin" />

</file>

<comInterfaceExternalProxyStub
    name="ILiteColumn"
    iid="{56B3DD01-7CE3-4590-BFD4-856DEC9E3E85}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    numMethods="9"
    tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}" />

<comInterfaceExternalProxyStub
    name="ILargeInteger"
    iid="{5E575221-737A-443A-9D64-13B79512D287}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    numMethods="19" />

<comInterfaceExternalProxyStub
    name="ILiteRows"
    iid="{6A33FE52-8122-4494-A74A-9C7A04D637A4}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}"
    numMethods="10" />

<comInterfaceExternalProxyStub
    name="ILiteParameters"
    iid="{08B1A162-3DE5-47D4-9992-964281640F2F}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}"
    numMethods="11" />

<comInterfaceExternalProxyStub
    name="ILiteBusy"
    iid="{E3481F74-CB68-4D47-9F69-99D256089569}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}"
    numMethods="8" />

<comInterfaceExternalProxyStub
    name="ILiteProgress"
    iid="{E3481F74-CB68-4D47-9F69-99D256089570}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}"
    numMethods="8" />

<comInterfaceExternalProxyStub
    name="ILiteRow"
    iid="{7A107497-5F9C-45D6-994B-FB2F8E802E84}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}"
    numMethods="11" />

<comInterfaceExternalProxyStub
    name="ILiteStatement"
    iid="{AD13FFC0-BA5D-4B6C-ACBF-D1C44D0DA9B5}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}"
    numMethods="31" />

<comInterfaceExternalProxyStub
    name="ILiteConnection"
    iid="{7ADFDFCF-8B4E-42A2-B458-3CA6F2DB7FE4}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}"
    numMethods="21" />

<comInterfaceExternalProxyStub
    name="ILiteParameter"
    iid="{820D6CD0-98E2-496B-B01A-D3C4EB3F92C9}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}"
    numMethods="10" />

<comInterfaceExternalProxyStub
    name="ILiteColumns"
    iid="{4D4E89EB-4BCC-4647-8D0B-A6D7F627CA3D}"
    proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
    baseInterface="{00000000-0000-0000-C000-000000000046}"
    tlbid="{10770BEB-5AFA-4851-B68E-EE891F3DEE7F}"
    numMethods="10" />

</assembly>

18

Re: WSH: Использование COM-сервера без его регистрации в системе

max7, Спасибо!
Но что-то я пока не разобрался.

19

Re: WSH: Использование COM-сервера без его регистрации в системе

Что не так?

20

Re: WSH: Использование COM-сервера без его регистрации в системе

Домашняя страница WSO.

21

Re: WSH: Использование COM-сервера без его регистрации в системе

max7, всё не так. Это:

В папках %WinDir%\WinSxS\Manifests и %WinDir%\WinSxS\Policies можно, в зависимости от количества установленного софта, любоваться манифестами и различными версиями одних и тех же библиотек.

Разжевать, что есть «type="win32"» я не буду (лень если честно). Об этом прямо и четко написано на сайте microsoft'а (и в google ;-).

извините, никуда не годится. Я же просил нечто наподобие: WSH: пишем сценарии в формате WSF или VBScript: простейший пример создания COM-сервера.

22

Re: WSH: Использование COM-сервера без его регистрации в системе

Это понятно. Написание полноценных статей - это работа на которую необходимо выделять время. На этом форуме присутствует весь необходимый материал и ссылки для её написания, в том числе в этом треде, в том числе в моих постах в нем. Если никто не хочет оформить это раньше меня - ждите. Вопрос я задал kiber_punk'у а не вам.

23

Re: WSH: Использование COM-сервера без его регистрации в системе

Не то, что никто не хочет — не знает. Коллега YMP упоминал, что касался этой темы. Я же — вообще ни сном, ни духом. Так что, буду благодарен, если Вы, по возможности, слепите подобную тему.

По поводу вопроса — я ответил, поскольку вполне могу подписаться под словами коллеги kiber_punk'а: мне так же непонятно.

24

Re: WSH: Использование COM-сервера без его регистрации в системе

Может быть проще огласить список вопросов? Не может же быть все непонятно? Скомпилированные ответы и будут содержанием темы для Коллекции.

25 (изменено: JSmаn, 2009-08-26 01:26:55)

Re: WSH: Использование COM-сервера без его регистрации в системе

Пользуясь случаем, хотел бы обратиться к собеседникам с просьбой дать рабочую ссылку на ( / прикрепить к теме, что лучше) regsvr42 — генератор манифестов.

26

Re: WSH: Использование COM-сервера без его регистрации в системе

Страничка проекта (на английском)  http://www.codeproject.com/KB/COM/regsv … view=Quick

27

Re: WSH: Использование COM-сервера без его регистрации в системе

Но хочу заметить, что regsvr42 не всегда корректно срабатывает. Он перехватывает вызовы winapi функций работы с реестром (Reg*). И если компонент регистрируется каким-то "нестандартным" способом, результирующий файл приходится поправлять вручную на основе IDL http://msdn.microsoft.com/en-us/library … 85%29.aspx, содержащегося с файле компонента (*.dll, *.ocx). Выглядит это обычно так, пример

sqlite3.dll LiteX Automation
// Generated .IDL/C++ pseudo source equivalent of Win32 type library ..\<Unknown>
[
  uuid({10770BEB-5AFA-4851-B68E-EE891F3DEE7F}),
  version(1.0)
]
library LITEXLib
{
    // Forward references and typedefs
    dispinterface ILiteConnection;
    interface ILiteConnectionPrivate;
    dispinterface ILiteBusy;
    dispinterface ILiteProgress;
    dispinterface ILiteStatement;
    dispinterface ILiteRows;
    dispinterface ILiteColumns;
    dispinterface ILiteColumn;
    dispinterface ILiteRow;
    dispinterface ILiteParameters;
    dispinterface ILiteParameter;
    dispinterface ILargeInteger;

    [
      uuid({3E22694D-7B92-42A1-89A7-668E2F7AA107})
    ]
    coclass LiteConnection
    {
        [default] dispinterface ILiteConnection;
        interface ILiteConnectionPrivate;
        [source] dispinterface ILiteBusy;
        [default, source] dispinterface ILiteProgress;
    };

    [
      uuid({7ADFDFCF-8B4E-42A2-B458-3CA6F2DB7FE4})
    ]
    dispinterface ILiteConnection
    {
        properties:
        methods:
            [id(0), restricted] void QueryInterface(
                            [in] GUID* riid, 
                            [out] void** ppvObj);
            [id(1), restricted] unsigned long AddRef();
            [id(2), restricted] unsigned long Release();
            [id(3), restricted] void GetTypeInfoCount([out] unsigned int* pctinfo);
            [id(4), restricted] void GetTypeInfo(
                            [in] unsigned int itinfo, 
                            [in] unsigned long lcid, 
                            [out] void** pptinfo);
            [id(5), restricted] void GetIDsOfNames(
                            [in] GUID* riid, 
                            [in] char** rgszNames, 
                            [in] unsigned int cNames, 
                            [in] unsigned long lcid, 
                            [out] long* rgdispid);
            [id(6), restricted] void Invoke(
                            [in] long dispidMember, 
                            [in] GUID* riid, 
                            [in] unsigned long lcid, 
                            [in] unsigned short wFlags, 
                            [in] DISPPARAMS* pdispparams, 
                            [out] VARIANT* pvarResult, 
                            [out] EXCEPINFO* pexcepinfo, 
                            [out] unsigned int* puArgErr);
            [id(7), propget] VARIANT Version([in] boolean bString);
            [id(8), propget] BSTR Path();
            [id(9), propput] void Path([in] BSTR rhs);
            [id(10)] void Open([in] BSTR bsPath);
            [id(11)] void Close();
            [id(12)] IDispatch* Prepare([in] BSTR bsCommand);
            [id(13), vararg] VARIANT Execute(
                            [in] BSTR bsCommand, 
                            [in, optional] SAFEARRAY(VARIANT)* params);
            [id(14), propget] long Changes();
            [id(15), propget] VARIANT LastInsertRowid();
            [id(16)] void OpenInMemory();
            [id(17)] void BatchExecute([in] BSTR bsSql);
            [id(18), propget] long ProgressPeriod();
            [id(19), propput] void ProgressPeriod([in] long rhs);
            [id(20)] void Interrupt();
    };

    [
      odl,
      uuid({7ADFDFCF-8B4E-42A2-B458-3CA6F2DB7FE3})
    ]
    interface ILiteConnectionPrivate : IUnknown
    {
        HRESULT _stdcall GetDB([out, retval] void** pDB);
    };

    [
      uuid({E3481F74-CB68-4D47-9F69-99D256089569}),
      helpstring("Return VARIANT_TRUE to continue or VARIANT_FALSE to abort.")
    ]
    dispinterface ILiteBusy
    {
        properties:
        methods:
            [id(0), restricted] void QueryInterface(
                            [in] GUID* riid, 
                            [out] void** ppvObj);
            [id(1), restricted] unsigned long AddRef();
            [id(2), restricted] unsigned long Release();
            [id(3), restricted] void GetTypeInfoCount([out] unsigned int* pctinfo);
            [id(4), restricted] void GetTypeInfo(
                            [in] unsigned int itinfo, 
                            [in] unsigned long lcid, 
                            [out] void** pptinfo);
            [id(5), restricted] void GetIDsOfNames(
                            [in] GUID* riid, 
                            [in] char** rgszNames, 
                            [in] unsigned int cNames, 
                            [in] unsigned long lcid, 
                            [out] long* rgdispid);
            [id(6), restricted] void Invoke(
                            [in] long dispidMember, 
                            [in] GUID* riid, 
                            [in] unsigned long lcid, 
                            [in] unsigned short wFlags, 
                            [in] DISPPARAMS* pdispparams, 
                            [out] VARIANT* pvarResult, 
                            [out] EXCEPINFO* pexcepinfo, 
                            [out] unsigned int* puArgErr);
            [id(7)] boolean Busy([in] long nTimes);
    };

    [
      uuid({E3481F74-CB68-4D47-9F69-99D256089570}),
      helpstring("Return VARIANT_TRUE to continue or VARIANT_FALSE to abort.")
    ]
    dispinterface ILiteProgress
    {
        properties:
        methods:
            [id(0), restricted] void QueryInterface(
                            [in] GUID* riid, 
                            [out] void** ppvObj);
            [id(1), restricted] unsigned long AddRef();
            [id(2), restricted] unsigned long Release();
            [id(3), restricted] void GetTypeInfoCount([out] unsigned int* pctinfo);
            [id(4), restricted] void GetTypeInfo(
                            [in] unsigned int itinfo, 
                            [in] unsigned long lcid, 
                            [out] void** pptinfo);
            [id(5), restricted] void GetIDsOfNames(
                            [in] GUID* riid, 
                            [in] char** rgszNames, 
                            [in] unsigned int cNames, 
                            [in] unsigned long lcid, 
                            [out] long* rgdispid);
            [id(6), restricted] void Invoke(
                            [in] long dispidMember, 
                            [in] GUID* riid, 
                            [in] unsigned long lcid, 
                            [in] unsigned short wFlags, 
                            [in] DISPPARAMS* pdispparams, 
                            [out] VARIANT* pvarResult, 
                            [out] EXCEPINFO* pexcepinfo, 
                            [out] unsigned int* puArgErr);
            [id(7)] boolean Progress();
    };

    [
      uuid({453A51CC-F944-4643-9540-A78253B8019C})
    ]
    coclass LiteStatement
    {
        [default] dispinterface ILiteStatement;
    };

    [
      uuid({AD13FFC0-BA5D-4B6C-ACBF-D1C44D0DA9B5})
    ]
    dispinterface ILiteStatement
    {
        properties:
        methods:
            [id(0), restricted] void QueryInterface(
                            [in] GUID* riid, 
                            [out] void** ppvObj);
            [id(1), restricted] unsigned long AddRef();
            [id(2), restricted] unsigned long Release();
            [id(3), restricted] void GetTypeInfoCount([out] unsigned int* pctinfo);
            [id(4), restricted] void GetTypeInfo(
                            [in] unsigned int itinfo, 
                            [in] unsigned long lcid, 
                            [out] void** pptinfo);
            [id(5), restricted] void GetIDsOfNames(
                            [in] GUID* riid, 
                            [in] char** rgszNames, 
                            [in] unsigned int cNames, 
                            [in] unsigned long lcid, 
                            [out] long* rgdispid);
            [id(6), restricted] void Invoke(
                            [in] long dispidMember, 
                            [in] GUID* riid, 
                            [in] unsigned long lcid, 
                            [in] unsigned short wFlags, 
                            [in] DISPPARAMS* pdispparams, 
                            [out] VARIANT* pvarResult, 
                            [out] EXCEPINFO* pexcepinfo, 
                            [out] unsigned int* puArgErr);
            [id(7), propget] IDispatch* ActiveConnection();
            [id(8), propput] void ActiveConnection([in] IDispatch* rhs);
            [id(9), propget] BSTR CommandText();
            [id(10), propput] void CommandText([in] BSTR rhs);
            [id(11)] void Prepare([in] BSTR bsCommand);
            [id(12)] void BindParameter(
                            [in] VARIANT idx, 
                            [in] VARIANT vValue, 
                            [in] _LxTypeEnum eType);
            [id(13), propget] long ColumnCount();
            [id(14), propget] BSTR ColumnName([in] long nColumn);
            [id(15), propget] _LxTypeEnum ColumnType([in] VARIANT idx);
            [id(16), propget] VARIANT ColumnValue(
                            [in] VARIANT idx, 
                            [in] _LxTypeEnum eType);
            [id(17)] boolean Step([in] long nSteps);
            [id(18)] void Close();
            [id(19)] void Reset();
            [id(20), propget] _LxStateEnum State();
            [id(21), propget] boolean Done();
            [id(22), propget] long ParameterCount();
            [id(23), propget] BSTR ParameterName([in] long nIndex);
            [id(24), propget] VARIANT Row([in] _LxRowEnum eMode);
            [id(25), propget] VARIANT RowCount();
            [id(26), vararg] void BindParameters([in, optional] SAFEARRAY(VARIANT)* params);
            [id(27)] void Execute();
            [id(28), propget] IDispatch* Rows(
                            [in] boolean bStatic, 
                            [in] long nMaxRecords);
            [id(29), propget] IDispatch* Columns();
            [id(30), propget] IDispatch* Parameters();
    };

    typedef enum
    {
        lxUnknown = -1,
        lxNull = 0,
        lxInteger = 1,
        lxLongInteger = 2,
        lxFloat = 3,
        lxString = 4,
        lxBinary = 5,
        lxDate = 6
    } _LxTypeEnum;

    typedef enum
    {
        lxCreated = 0,
        lxPrepared = 1,
        lxExecuted = 2
    } _LxStateEnum;

    typedef enum
    {
        lxDefault = 0,
        lxArray = 1,
        lxCollection = 2
    } _LxRowEnum;

    [
      uuid({5AD25519-5946-420F-B068-BCCC3856363D})
    ]
    coclass LiteRows
    {
        [default] dispinterface ILiteRows;
    };

    [
      uuid({6A33FE52-8122-4494-A74A-9C7A04D637A4})
    ]
    dispinterface ILiteRows
    {
        properties:
        methods:
            [id(0), restricted] void QueryInterface(
                            [in] GUID* riid, 
                            [out] void** ppvObj);
            [id(1), restricted] unsigned long AddRef();
            [id(2), restricted] unsigned long Release();
            [id(3), restricted] void GetTypeInfoCount([out] unsigned int* pctinfo);
            [id(4), restricted] void GetTypeInfo(
                            [in] unsigned int itinfo, 
                            [in] unsigned long lcid, 
                            [out] void** pptinfo);
            [id(5), restricted] void GetIDsOfNames(
                            [in] GUID* riid, 
                            [in] char** rgszNames, 
                            [in] unsigned int cNames, 
                            [in] unsigned long lcid, 
                            [out] long* rgdispid);
            [id(6), restricted] void Invoke(
                            [in] long dispidMember, 
                            [in] GUID* riid, 
                            [in] unsigned long lcid, 
                            [in] unsigned short wFlags, 
                            [in] DISPPARAMS* pdispparams, 
                            [out] VARIANT* pvarResult, 
                            [out] EXCEPINFO* pexcepinfo, 
                            [out] unsigned int* puArgErr);
            [id(7), propget, restricted] IUnknown* _NewEnum();
            [id(8), propget] VARIANT Count();
            [id(9), propget] IDispatch* Item([in] long nIndex);
    };

    [
      uuid({048DC1D9-E121-481C-8DFF-BC797993F2EC})
    ]
    coclass LiteColumns
    {
        [default] dispinterface ILiteColumns;
    };

    [
      uuid({4D4E89EB-4BCC-4647-8D0B-A6D7F627CA3D})
    ]
    dispinterface ILiteColumns
    {
        properties:
        methods:
            [id(0), restricted] void QueryInterface(
                            [in] GUID* riid, 
                            [out] void** ppvObj);
            [id(1), restricted] unsigned long AddRef();
            [id(2), restricted] unsigned long Release();
            [id(3), restricted] void GetTypeInfoCount([out] unsigned int* pctinfo);
            [id(4), restricted] void GetTypeInfo(
                            [in] unsigned int itinfo, 
                            [in] unsigned long lcid, 
                            [out] void** pptinfo);
            [id(5), restricted] void GetIDsOfNames(
                            [in] GUID* riid, 
                            [in] char** rgszNames, 
                            [in] unsigned int cNames, 
                            [in] unsigned long lcid, 
                            [out] long* rgdispid);
            [id(6), restricted] void Invoke(
                            [in] long dispidMember, 
                            [in] GUID* riid, 
                            [in] unsigned long lcid, 
                            [in] unsigned short wFlags, 
                            [in] DISPPARAMS* pdispparams, 
                            [out] VARIANT* pvarResult, 
                            [out] EXCEPINFO* pexcepinfo, 
                            [out] unsigned int* puArgErr);
            [id(7), propget, restricted] IUnknown* _NewEnum();
            [id(8), propget] IDispatch* Item([in] VARIANT vIndex);
            [id(9), propget] long Count();
    };

    [
      uuid({10338227-2DC2-4A37-AF40-E5BF89FF4F10})
    ]
    coclass LiteColumn
    {
        [default] dispinterface ILiteColumn;
    };

    [
      uuid({56B3DD01-7CE3-4590-BFD4-856DEC9E3E85})
    ]
    dispinterface ILiteColumn
    {
        properties:
        methods:
            [id(0), restricted] void QueryInterface(
                            [in] GUID* riid, 
                            [out] void** ppvObj);
            [id(1), restricted] unsigned long AddRef();
            [id(2), restricted] unsigned long Release();
            [id(3), restricted] void GetTypeInfoCount([out] unsigned int* pctinfo);
            [id(4), restricted] void GetTypeInfo(
                            [in] unsigned int itinfo, 
                            [in] unsigned long lcid, 
                            [out] void** pptinfo);
            [id(5), restricted] void GetIDsOfNames(
                            [in] GUID* riid, 
                            [in] char** rgszNames, 
                            [in] unsigned int cNames, 
                            [in] unsigned long lcid, 
                            [out] long* rgdispid);
            [id(6), restricted] void Invoke(
                            [in] long dispidMember, 
                            [in] GUID* riid, 
                            [in] unsigned long lcid, 
                            [in] unsigned short wFlags, 
                            [in] DISPPARAMS* pdispparams, 
                            [out] VARIANT* pvarResult, 
                            [out] EXCEPINFO* pexcepinfo, 
                            [out] unsigned int* puArgErr);
            [id(7), propget] long Index();
            [id(8), propget] BSTR Value();
    };

    [
      uuid({98FADC8F-1348-4EBD-B104-6D7CA93C8DEC})
    ]
    coclass LiteRow
    {
        [default] dispinterface ILiteRow;
    };

    [
      uuid({7A107497-5F9C-45D6-994B-FB2F8E802E84})
    ]
    dispinterface ILiteRow
    {
        properties:
        methods:
            [id(0), restricted] void QueryInterface(
                            [in] GUID* riid, 
                            [out] void** ppvObj);
            [id(1), restricted] unsigned long AddRef();
            [id(2), restricted] unsigned long Release();
            [id(3), restricted] void GetTypeInfoCount([out] unsigned int* pctinfo);
            [id(4), restricted] void GetTypeInfo(
                            [in] unsigned int itinfo, 
                            [in] unsigned long lcid, 
                            [out] void** pptinfo);
            [id(5), restricted] void GetIDsOfNames(
                            [in] GUID* riid, 
                            [in] char** rgszNames, 
                            [in] unsigned int cNames, 
                            [in] unsigned long lcid, 
                            [out] long* rgdispid);
            [id(6), restricted] void Invoke(
                            [in] long dispidMember, 
                            [in] GUID* riid, 
                            [in] unsigned long lcid, 
                            [in] unsigned short wFlags, 
                            [in] DISPPARAMS* pdispparams, 
                            [out] VARIANT* pvarResult, 
                            [out] EXCEPINFO* pexcepinfo, 
                            [out] unsigned int* puArgErr);
            [id(7), propget] VARIANT Value();
            [id(8), propget, restricted] IUnknown* _NewEnum();
            [id(9), propget] VARIANT Item(
                            [in] long nIndex, 
                            [in] _LxTypeEnum eType);
            [id(10), propget] long Count();
    };

    [
      uuid({7BAB4761-C1FA-458A-8993-F9667DF51F32})
    ]
    coclass LiteParameters
    {
        [default] dispinterface ILiteParameters;
    };

    [
      uuid({08B1A162-3DE5-47D4-9992-964281640F2F})
    ]
    dispinterface ILiteParameters
    {
        properties:
        methods:
            [id(0), restricted] void QueryInterface(
                            [in] GUID* riid, 
                            [out] void** ppvObj);
            [id(1), restricted] unsigned long AddRef();
            [id(2), restricted] unsigned long Release();
            [id(3), restricted] void GetTypeInfoCount([out] unsigned int* pctinfo);
            [id(4), restricted] void GetTypeInfo(
                            [in] unsigned int itinfo, 
                            [in] unsigned long lcid, 
                            [out] void** pptinfo);
            [id(5), restricted] void GetIDsOfNames(
                            [in] GUID* riid, 
                            [in] char** rgszNames, 
                            [in] unsigned int cNames, 
                            [in] unsigned long lcid, 
                            [out] long* rgdispid);
            [id(6), restricted] void Invoke(
                            [in] long dispidMember, 
                            [in] GUID* riid, 
                            [in] unsigned long lcid, 
                            [in] unsigned short wFlags, 
                            [in] DISPPARAMS* pdispparams, 
                            [out] VARIANT* pvarResult, 
                            [out] EXCEPINFO* pexcepinfo, 
                            [out] unsigned int* puArgErr);
            [id(7), propget, restricted] IUnknown* _NewEnum();
            [id(8), propget] IDispatch* Item(VARIANT vIndex);
            [id(9), propget] long Count();
            [id(10)] void Bind([in] SAFEARRAY(VARIANT)* params);
    };

    [
      uuid({0100C8E3-E467-4944-825D-7089A6EEC1B2})
    ]
    coclass LiteParameter
    {
        [default] dispinterface ILiteParameter;
    };

    [
      uuid({820D6CD0-98E2-496B-B01A-D3C4EB3F92C9})
    ]
    dispinterface ILiteParameter
    {
        properties:
        methods:
            [id(0), restricted] void QueryInterface(
                            [in] GUID* riid, 
                            [out] void** ppvObj);
            [id(1), restricted] unsigned long AddRef();
            [id(2), restricted] unsigned long Release();
            [id(3), restricted] void GetTypeInfoCount([out] unsigned int* pctinfo);
            [id(4), restricted] void GetTypeInfo(
                            [in] unsigned int itinfo, 
                            [in] unsigned long lcid, 
                            [out] void** pptinfo);
            [id(5), restricted] void GetIDsOfNames(
                            [in] GUID* riid, 
                            [in] char** rgszNames, 
                            [in] unsigned int cNames, 
                            [in] unsigned long lcid, 
                            [out] long* rgdispid);
            [id(6), restricted] void Invoke(
                            [in] long dispidMember, 
                            [in] GUID* riid, 
                            [in] unsigned long lcid, 
                            [in] unsigned short wFlags, 
                            [in] DISPPARAMS* pdispparams, 
                            [out] VARIANT* pvarResult, 
                            [out] EXCEPINFO* pexcepinfo, 
                            [out] unsigned int* puArgErr);
            [id(7), propget] long Index();
            [id(8), propget] BSTR Name();
            [id(9)] void Bind(
                            [in] VARIANT vValue, 
                            [in] _LxTypeEnum eType);
    };

    [
      uuid({25EE8E01-5237-41F1-B29F-6AF441CF0924}),
      helpstring("LargeInteger Class")
    ]
    coclass LargeInteger
    {
        [default] dispinterface ILargeInteger;
    };

    [
      uuid({5E575221-737A-443A-9D64-13B79512D287})
    ]
    dispinterface ILargeInteger
    {
        properties:
        methods:
            [id(0), restricted] void QueryInterface(
                            [in] GUID* riid, 
                            [out] void** ppvObj);
            [id(1), restricted] unsigned long AddRef();
            [id(2), restricted] unsigned long Release();
            [id(3), restricted] void GetTypeInfoCount([out] unsigned int* pctinfo);
            [id(4), restricted] void GetTypeInfo(
                            [in] unsigned int itinfo, 
                            [in] unsigned long lcid, 
                            [out] void** pptinfo);
            [id(5), restricted] void GetIDsOfNames(
                            [in] GUID* riid, 
                            [in] char** rgszNames, 
                            [in] unsigned int cNames, 
                            [in] unsigned long lcid, 
                            [out] long* rgdispid);
            [id(6), restricted] void Invoke(
                            [in] long dispidMember, 
                            [in] GUID* riid, 
                            [in] unsigned long lcid, 
                            [in] unsigned short wFlags, 
                            [in] DISPPARAMS* pdispparams, 
                            [out] VARIANT* pvarResult, 
                            [out] EXCEPINFO* pexcepinfo, 
                            [out] unsigned int* puArgErr);
            [id(7), propget] long LowPart();
            [id(8), propput] void LowPart([in] long rhs);
            [id(9), propget] long HighPart();
            [id(10), propput] void HighPart([in] long rhs);
            [id(11), propget] wchar_t QuadPart();
            [id(12), propput] void QuadPart([in] wchar_t rhs);
            [id(13), propget] CURRENCY QuadPartCy();
            [id(14), propput] void QuadPartCy([in] CURRENCY rhs);
            [id(15), propget] wchar_t MAX_VALUE();
            [id(16), propget] wchar_t MIN_VALUE();
            [id(17), propget] CURRENCY MIN_VALUE_CY();
            [id(18), propget] CURRENCY MAX_VALUE_CY();
    };
};

28

Re: WSH: Использование COM-сервера без его регистрации в системе

JSman пишет:

Может быть проще огласить список вопросов? Не может же быть все непонятно? Скомпилированные ответы и будут содержанием темы для Коллекции.

Увы. У нас это уже обсуждалось: чтобы получить правильный ответ — нужно правильно задать вопрос, чтобы правильно задать вопрос — нужно знать большую часть ответа.

Нужны не просто ответы на вопросы, а описание самой технологии, как в ссылках, что я приводил выше в качестве примера.

29

Re: WSH: Использование COM-сервера без его регистрации в системе

SxS

Side-by-Side регистрация - это когда COM-сервер предоставляет доступ к своим объектам не регистрируя никакой информации о себе в реестре.

Начать, я думаю, можно с этих ссылок:

Статья про "Windows Side-by-Side" (на английском)
http://www.mazecomputer.com/sxs.htm
http://www.mazecomputer.com/sxs/help/inside1.htm
http://www.mazecomputer.com/sxs/help/inside2.htm

Эта тема на MSDN
http://msdn.microsoft.com/en-us/library … S.85).aspx и http://msdn.microsoft.com/en-us/library … S.85).aspx
Reference http://msdn.microsoft.com/en-us/library … S.85).aspx
"Описание работы" http://msdn.microsoft.com/en-us/library … S.85).aspx
"Для exe'шников" http://msdn.microsoft.com/en-us/library … S.85).aspx
"Для dll'ок" http://msdn.microsoft.com/en-us/library … S.85).aspx

Википедия
http://en.wikipedia.org/wiki/Side-by-side_assembly

Интересная заметка http://support.microsoft.com/kb/830033/ru

30

Re: WSH: Использование COM-сервера без его регистрации в системе

max7, ссылка на закачку regsvr42 не работает.

31

Re: WSH: Использование COM-сервера без его регистрации в системе

У меня всё нормально скачалось. Только зарегиться там пришлось.

32 (изменено: JSmаn, 2009-08-26 14:26:24)

Re: WSH: Использование COM-сервера без его регистрации в системе

Зарисовка.

SxS. Введение.

Технология DLL (англ. Dynamic-link library — динамически подключаемая библиотека) предназначалась для эффективной организации памяти и дискового пространства путем использования одного экземпляра библиотечного модуля для различных приложений. Это было особенно важно для ранних версий Microsoft Windows с жёсткими ограничениями по памяти.

Далее, предполагалось улучшить эффективность разработок и использования системных средств за счёт модульности. Замена DLL-программ с одной версии на другую должна была позволить независимо наращивать систему, не затрагивая приложений. Кроме того, библиотеки DLL могли использоваться разнотипными приложениями — например, Microsoft Office, Microsoft Visual Studio и т. п.

В дальнейшем идея модульности выросла в концепцию COM.
Фактически, полных преимуществ от внедрения DLL получить не удалось по причине явления, называемого DLL hell («ад DLL»). DLL Hell возникает, когда несколько приложений требуют одновременно различные, не полностью совместимые, версии DLL-библиотек, что приводит к сбоям в этих приложениях. Когда система выросла до определённых размеров, количество DLL стало превышать многие тысячи, не все из них обладали полной надёжностью и совместимостью, и конфликты типа DLL Hell стали возникать очень часто, резко понижая общую надёжность системы.

Для стабилизации работы операционной системы Microsoft ввели протективные меры. Системные файлы более не нуждались в замене. Операционная система использовала «встроенные» стабильные версии файлов. Одной из мер стало изменение работы функции LoadLibrary. В список адресных путей поиска библиотеки добавили директорию размещения приложения. Проблема с COM-компонентами не была решена из-за того, что система регистрации изначально предполагала единственную версию.

В Windows XP была включена новая технология Win32 Side-by-Side (SxS, «Бок-о-бок»). Файлы динамически подключаемых библиотек (DLL), буферов ассоциативной трансляции (TLB) и прочие можно группировать в сборки (assemblies), описываемые Win32-манифестом (manifest) — файлом формата xml. Регистрация COM компонента больше не требуется, как и размещение нужных файлов в системных директориях. Каждое приложение может использовать свой файл манифеста, решая таким образом проблему совместимости используемых компонентов («DLL Hell»).
Понятие «манифест» также существует в среде .Net. Сборки и манифесты Win32 (о которых идет речь) и .Net являются различными технологиями, поэтому не следует их путать.

С появлением SxS в системный загрузчик Windows XP и COM-компонентов были внесены изменения. Обращения к файлам, свойствам COM-компонентов и классам окон проводятся с учетом специального контекста подключения (activation context), который может быть задан в манифесте приложения. Кроме того, манифест приложения способен подключать другие манифесты. Таким образом, из списка директорий поиска функция LoadLibrary отдаст предпочтение той директории, которая указана контекстом подключения.

33

Re: WSH: Использование COM-сервера без его регистрации в системе

YMP пишет:

У меня всё нормально скачалось. Только зарегиться там пришлось.

Да, точно. Все получилось.

34

Re: WSH: Использование COM-сервера без его регистрации в системе

JSman
Нормально. Продолжение будет?

35

Re: WSH: Использование COM-сервера без его регистрации в системе

Да, я уже начал писать «SxS. Часть 1».

36

Re: WSH: Использование COM-сервера без его регистрации в системе

JSman, именно такого в итоге и ожидалось.

37 (изменено: JSmаn, 2009-08-27 11:49:12)

Re: WSH: Использование COM-сервера без его регистрации в системе

Манифест приложения [Application Manifest]. Общее описание структуры документа.

Манифест приложения представляет собой XML-файл, который описывает и идентифицирует нужные приложению общие и локальные сборки (shared and private side-by-side assemblies).

Синтаксис имени файла манифеста

Имя файла манифеста состоит из названия приложения и «.manifest». Этот файл может являться как ресурсом приложения, так и располагаться в директории программы или библиотеки.

1. example.exe.manifest
2. example.dll.manifest
3. example.exe.<resource ID>.manifest
4. example.dll.<resource ID>.manifest

Если идентификатор ресурса равен 1, то можно его не указывать в имени.

Элементы манифеста приложения

Имена элементов и их атрибутов, как и в любом XML-файле, регистрозависимы, исключая значения атрибутов.


Элемент <assembly> Является корневым элементом XML-документа. Обязательными первыми дочерними элементами должны быть <noInherit> или <assemblyIdentity>.

Атрибут xmlns задает пространство имен "urn:schemas-microsoft-com:asm.v1". Остальные элементы сборки также должны быть в указанном пространстве имен. Принадлежность пространству имен определяется путем наследования или прямым указанием в имени тега.

Атрибут manifsetVersion должен быть установлен в «1.0»


Элемент <noInherit /> Необязателен. Выступает в роли флага запрета наследования контекста подключения (activation context). Не рекомендуется к использованию.


Элемент <assemblyIdentity />.

1) Является первым по порядку дочерним элементом <assembly>. Элемент <assemblyIdentity> описывает и однозначно идентифицирует приложение, работающее с текущим манифестом.
2) Является первым по порядку дочерним элементом <dependentAssembly>. Элемент <assemblyIdentity> описывает связанные сборки (side-by-side assembly), требуемые приложением. Каждая сборка, упоминаемая в манифесте приложения, требует наличия элемента <assemblyIdentity>.

Атрибут type (определяет тип приложения или сборки) должен быть установлен в «Win32» или «win32».

Атрибут name задает имя сборки или приложения. Microsoft советует применять следующее форматирование для именования:  Organization.Division.Name. Например, Microsoft.Windows.mysampleApp.

Атрибут language указывает язык приложения или сборки. Необязателен. Значение по умолчанию «*». Если приложение или сборка являются языкозависимыми, задаёт DHTML-код языка.

Атрибут processorArchitecture определяет процессор. Значение «x86» используется для 32-битных приложений, «ia64» — для 64-битных.

Атрибут version определяет версию приложения или сборки. Обязателен. Форматирование значения подобно написанию IP  (делится на четыре части  тремя точками). Каждая часть — это число в диапазоне 0-65535.

Атрибут publicKeyToken требуется только для описания общих (shared) сборок. Представляет собой 16-символьное значение-идентификатор, зарегистрированных сборок в системе.


Элемент <dependency> содержит как минимум один элемент <dependentAssembly>. Не имеет атрибутов. Необязателен.


Элемент <dependentAssembly>. Не имеет атрибутов. Первым дочерним элементом <dependentAssembly> является элемент <assemblyIdentity>, который описывает связанные (Side-by-Side) сборки. Содержится в одном экземпляре в элементе <dependency>. Не имеет атрибутов.


Элемент <file>. Определяет подключаемый файл. Необязателен.

Атрибут name задает имя файла.

Атрибут hashlang задает название алгоритма хеша файла. Значение равно «SHA1».

Атрибут hash представляет собой хеш файла.

В качестве примера манифеста приложения приведу код файла «Manifest XP» — средство стилизации элементов окна.

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

<assemblyIdentity
    name="CiaoSoftware.Ciao.Shell.Contacts"
    processorArchitecture="x86"
    version="5.1.0.0"
    type="win32"/>

<description>Windows Shell</description>

<dependency>
    <dependentAssembly>

        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="x86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />

    </dependentAssembly>
</dependency>

</assembly>

В примере указана указана ссылка на общую сборку (shared assambly). Речь о манифестах сборок пойдет в следующей части.

38

Re: WSH: Использование COM-сервера без его регистрации в системе

JSman пишет:

Атрибут language указывает язык приложения или сборки. Необязателен. Значение по умолчанию «*». Он применяется в случае использования приложений и сборок, написанных на специфичных языках, например DHTML.

Это место мне что-то подозрительно. Думаю, там речь идёт о человеческих языках, а не программирования. А DHTML упоминается в связи с кодами языков — ru, en, en-us и т.п. Можно ссылку на оригинал, чтобы точно убедиться?

И почему assemblyIdentity — пустой элемент??

39

Re: WSH: Использование COM-сервера без его регистрации в системе

Оригинал:

Identifies the language of the application or assembly. Optional. If the application or assembly is language-specific, specify the DHTML language code.

Перевод:

указывает язык приложения или сборки. Необязателен. Он применяется в случае использования приложений и сборок, написанных на специфичных языках, например DHTML.

И почему assemblyIdentity — пустой элемент??

<assemblyIdentity>
As the first subelement of an <assembly> element, <assemblyIdentity> describes and uniquely identifies the application owning this application manifest. As the first subelement of a <dependentAssembly> element, <assemblyIdentity> describes a side-by-side assembly required by the application. Note that every assembly referenced in the application manifest requires an <assemblyIdentity> that exactly matches the <assemblyIdentity> in the referenced assembly's own assembly manifest.

The <assemblyIdentity> element has the following attributes. It has no subelements.

Сейчас дополню статью примерами. Начну писать следующую часть о манифесте сборки.

40

Re: WSH: Использование COM-сервера без его регистрации в системе

Я бы перевёл

If the application or assembly is language-specific, specify the DHTML language code.

как

Если приложение или сборка является языко-зывисимыми, задаёт dhtml-код языка.

(т.е., мне кажется, имеются в виду всё-таки человеческие языки).

41

Re: WSH: Использование COM-сервера без его регистрации в системе

Исправил.

42

Re: WSH: Использование COM-сервера без его регистрации в системе

Языко-зАвисимыми. Дефис лучше убрать, наверно. Про крайней мере вариант без дефиса гораздо чаще встречается, судя по Яндексу. И не "является", наверно, а "являются".

43

Re: WSH: Использование COM-сервера без его регистрации в системе

«Языкозависимый» написал слитно.

44 (изменено: JSmаn, 2009-09-08 14:54:59)

Re: WSH: Использование COM-сервера без его регистрации в системе

Манифест сборки [Assembly Manifest]. Общее описание структуры документа.

Манифест сборки представляет собой XML файл, который описывает подключаемые SxS сборки. В нем указываются имена и версии сборок, файлы, ресурсы сборок, а также связи с другими сборками. Корректная установка, подключение и запуск SxS сборок обеспечивается наличием данного манифеста, который распространяется вместе с ними.


Размещение файла

Манифест сборки размещается тремя способами:
1. Размещение в качестве отдельного файла в папке общих сборок (shared assemblies) (в так называемом кэше SxS сборок) (по умолчанию в «%Windir%\WinSxS»).
2. Размещение в качестве отдельного файла в папке частных сборок (private assemblies) (обычно там же, где и само приложение).
3. Размещение в качестве ресурса Dll. Манифест сборки не может быть ресурсом Exe, так как Exe-файл может включать (касаемо манифестов) в качестве ресурса только манифест приложения.


Синтаксис имени файла манифеста

Имя файла манифеста оканчивается на «.manifest». Например, манифест сборки, который ссылается на сборку myassembly использует следующее правило именования myassembly.<resourceID>.manifest. ResourceID можно не указывать в том случае, когда resourceID равен 1 или манифест размещается в качестве отдельного файла.

Примечание.
Существуют ограничения именования манифестов, если сборка представляет собой Dll. В этом случае разместите манифест сборки в качестве ресурса Dll. Идентификатор ресурса должен быть равен 1 и название ресурса соответствует имени Dll. Например, если имя dll будет «Microsoft.Windows.mysample.dll», то значение атрибута элемента <assemblyIdentity> должно быть «Microsoft.Windows.mysample».
Другим способом является представление манифеста сборки в качестве отдельного файла. В этом случае имена сборки и ее манифеста должны отличаться. Например, Microsoft.Windows.mysampleAsm, Microsoft.Windows.mysampleAsm.manifest и Microsoft.Windows.Mysample.dll.


Элементы манифеста сборки

Имена элементов и их атрибутов, как и в любом XML-файле, регистрозависимы, исключая значения атрибутов.

Элемент <assembly> Является корневым элементом XML-документа. Обязательными первыми дочерними элементами должны быть <noInherit> или <assemblyIdentity>.

Атрибут xmlns задает пространство имен "urn:schemas-microsoft-com:asm.v1". Остальные элементы сборки также должны быть в указанном пространстве имен. Принадлежность пространству имен определяется путем наследования или прямым указанием в имени тега.

Атрибут manifsetVersion должен быть установлен в «1.0»


Элемент <noInherit /> Необязателен. Выступает в роли флага запрета наследования контекста подключения (activation context). Наличие noInherit в манифесте приложения не влияет на текущий манифест.


Элемент <assemblyIdentity />. Описывает и идентифицирует SxS сборки.

1) Является первым по порядку дочерним элементом <assembly>. Элемент <assemblyIdentity> описывает и однозначно идентифицирует сборку, работающую с текущим манифестом. Это так называемый DEF-контекст манифеста сборки.
2) Является первым по порядку дочерним элементом <dependentAssembly>. Элемент <assemblyIdentity> описывает связанные сборки (side-by-side assembly), используемые в DEF-контексте элемента <assemblyIdentity>, — это REF-контекст элемента <assemblyIdentity> манифеста сборки. Для корректной работы манифеста должны быть указаны и DEF, и REF -контексты.

Атрибут type (определяет тип сборки) должен быть установлен в «win32».

Атрибут name задает имя сборки. Microsoft советует применять следующее форматирование для именования: Organization.Division.Name. Например, Microsoft.Windows.mysampleApp. Примечание: в случае размещения манифеста сборки в отдельном файле и сборке Dll. следует помнить, что имена фалов сборки и манифеста должны отличаться.

Атрибут language указывает язык сборки. Необязателен. Если сборка являются языкозависимой, задаёт DHTML-код языка. В DEF-контексте для установки языка по умолчанию, Вы можете пропустить этот атрибут. Что касается REF-контекста, то укажите «*».

Атрибут processorArchitecture определяет процессор. Значение «x86» используется для 32-битных приложений, «ia64» — для 64-битных.

Атрибут version определяет версию сборки. Обязателен. Форматирование значения подобно написанию IP (делится на четыре части тремя точками). Каждая часть — это число в диапазоне 0-65535.

Атрибут publicKeyToken требуется только для описания общих (shared) сборок. Представляет собой 16-символьное значение-идентификатор, зарегистрированной сборки в системе.


Элемент <dependency> содержит как минимум один элемент <dependentAssembly>. Не имеет атрибутов. Необязателен.


Элемент <dependentAssembly>. Не имеет атрибутов. Первым дочерним элементом <dependentAssembly> является элемент <assemblyIdentity>, который описывает связанные (Side-by-Side) сборки. Содержится в одном экземпляре в элементе <dependency>. Не имеет атрибутов.
<file>


Элемент <file>. Определяет подключаемый файл. Необязателен. Включает элементы <comClass>, <typelib>, <windowClass>, <comInterfaceProxyStub>.

Атрибут Name. Имя файла, например Conctl32.dll.

Атрибут hashlang задает название алгоритма хеша файла. Значение равно «SHA1».

Атрибут hash представляет собой хеш файла.


Элемент <comClass>. Дочерний элемент <file>. Необязателен.

Атрибут description задает имя класса.

Атрибут clsid описывает GUID, который однозначно идентифицирует класс.

Атрибут threadingModel задает тип потоковой модели в COM. Необязателен. Доступные значения "Apartment", "Free", "Both", and "Neutral".

Атрибут tlbid представляет собой GUID библиотеки типов описываемого COM компонента. Необязателен.

Атрибут progid.

Также доступны атрибуты miscStatus, miscStatusIcon, miscStatusContent, miscStatusDocprint, miscStatusThumbnail. Их подробное описание доступно в справке.


Возможно наличие элементов <progid> внутри <comClass>. Таким образом можно организовать список зависимых progid от версии.


Пример использования элемента <file>:

<file name="sampleu.dll">
  <comClass description="Font Property Page"
    clsid="{0BE35200-8F91-11CE-9DE3-00AA004BB851}"
    threadingModel = "Both" 
    tlbid = "{44EC0535-400F-11D0-9DCD-00A0C90391D3}"/>
  <comClass description="Color Property Page"
    clsid="{0BE35201-8F91-11CE-9DE3-00AA004BB851}" 
    progid="ABC.Registrar"/>
 </file>

Элемент <typelib>. Дочерний элемент <file>. Необязателен.

Атрибут tlbid указывает идентификатор типизированной библиотеки. Обязателен.

Сегодня постараюсь завершить перевод этой статьи, а также добавить пример манифеста сборки.

45

Re: WSH: Использование COM-сервера без его регистрации в системе

Что-то эта тема маленько запылилась . Нужно бы слить в Коллекцию из неё всё, что можно, и открепить.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

46

Re: WSH: Использование COM-сервера без его регистрации в системе

Подождём, коллега JSman, думаю, рано или поздно закончит. А когда тема висит на первой странице, это очень настойчиво напоминает — сужу по собственному опыту .

47

Re: WSH: Использование COM-сервера без его регистрации в системе

Еще немного терпения и все будет готово ;-)

48

Re: WSH: Использование COM-сервера без его регистрации в системе

Открепляю, т.к. тема не развивается.
Вообще, в этой теме и сейчас есть, что перенести в Коллекцию. Работающий пример в посте #6, даже без подробных пояснений — гораздо лучше, чем ничего, и частичный перевод документации тоже очень полезен.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

49

Re: WSH: Использование COM-сервера без его регистрации в системе

Надо бы постучать коллеге JSman'у в личку, дабы он свёл в Коллекцию уже то, что есть.

50 (изменено: Flasher, 2012-02-14 06:13:39)

Re: WSH: Использование COM-сервера без его регистрации в системе

Приветствую всех!
Вопрос портабельности стоит остро, использовать разные костыли (вызов консольных утилит через Run/Exec) в скриптах уже поднадоело, компоненты предпочтительней.
Я старался внимательно изучить вопрос по информации отсюда и ещё пары сайтов (1, 2), но пока как следует отфильтровать имеющееся получается не очень. Попытки запустить скрипт после написания манифеста заканчиваются сообщениями "Невозможно создание объекта контейнером ActiveX".
Просьба отозваться тех, кто разобрался в теме как следует и на практике умеет создавать рабочий манифест для любого ActiveX-компонента.

Что именно требуется (при наличии некой dll/ocx):
1. Алгоритм получения информации по атрибутам в связке с необходимыми для этого утилитами (regsvr42, RegDllView, oleview, TLViewer и т.п.), определения их необходимости в конкретном случае. (В описаниях выше статус (не)обязательности некоторых атрибутов несколько сомнителен).
2. Алгоритм правки/редактирования манифеста, полученного с пом. regsvr42.

Предложение: было бы здорово собрать коллекцию манифестов для представленных на сайте (и не только) компонентов. Если сам научусь, то готов посодействовать.

51

Re: WSH: Использование COM-сервера без его регистрации в системе

Хотел бы в качестве некоторого офтопа повторить вопрос The gray Cardinal'a заданный на первой странице: в чём проблема регистрации компонента, если это можно сделать для текущего пользователя, т.е. права админа вроде как не требуются? Мне действительно это неясно.

Насчёт портабельности с манифестами. В варианте max7 нужно иметь при себе wscript.exe. От какой Windows? Ведь они разные должны быть, например, на ХР и на 7. Если же использовать наличный wscript.exe, то нужно манифест для него класть рядом с ним, т.е. в system32. На это разве права не нужны? И что если там уже есть какой-то манифест? Своим перезаписывать? Сливать воедино?

52 (изменено: Flasher, 2012-02-14 08:11:08)

Re: WSH: Использование COM-сервера без его регистрации в системе

YMP, эти вопросы все мне адресованы?
Цель любой портабельности - не нагадить в реестр и системную папку чужой машины, а также запускать скрипты/приложения без необходимости ручной регистрации из консоли или дописи методов с вызовом команд регистрирации/дерегистрации (я уже писал про костыли). К тому же скриптов, создающих объект одного компонента, может быть несколько. Писать для каждого регистрацию, мягко говоря, нерационально.
Ещё, вероятно, предлагаемый способ позволяет обойти чужой файрвол, запрещающий/проверяющий регистрации и записи в системные папки.

В варианте max7 не сказано, что перенос wscript.exe и написание для него манифеста является необходимостью. Нужно бы этот момент прояснить. Версия WSH со времён XP SP3 вроде бы не обновлялась.

53

Re: WSH: Использование COM-сервера без его регистрации в системе

Flasher
Вопросы ко всем, кому есть что сказать, т.к. для меня не совсем ясно, в чём здесь проблема.

Запись данных в реестр вы называете "гадить"? Но ведь реестр для того и предназначен, чтобы программы в него писали и читали из него. Конечно, любое дело можно сделать нормально и через попу, но процедура регистрации ActiveX в реестре довольно проста и неясно, что там можно испортить. По-моему, манифесты сложнее.

Манифест нужен в первую очередь для приложения, т.е. в данном случае wscript.exe. Именно в его манифесте система смотрит, что необходимо для его работы. Так что либо нужно класть для него манифест в system32, либо носить wscript.exe с собой. Насколько взаимозаменяемы его версии, не знаю. Изначально на ХР была версия 5.6, а сейчас у себя вижу такие версии продукта в свойствах:
W7 SP1 5.8.7600.16385
XP SP3 5.7.0.18066

max7 пишет:

Работает примерно так. OS для запускаемого экзешника ищет *.manifest в начале в его ресурсах, если не находит смотрит в той же папке, где он лежит, и если не находит то действует как обычно. А если находит, то действует в соответствии с ним: загружает библиотеки, разрешает имена, и т.д. (в том числе и для activex).

54

Re: WSH: Использование COM-сервера без его регистрации в системе

YMP пишет:

Запись данных в реестр вы называете "гадить"?

Да. У меня на основной работе попытка зарегистрировать ActiveX приводит к полной (часа на полтора) проверке компа Симантеком. То же - при попытке записи в системные папки. Такая корпоративная политика информационной безопасности (блин!). Попытка изменения своих прав или обхода ограничений - к эскалации инцидента до руководителя подразделения с копией руководителю службы безопасности. Поэтому к портабельности, о которой, собственно, и говорил уважаемый Flasher, я отношусь более чем серьёзно.

55 (изменено: Flasher, 2012-02-16 00:03:00)

Re: WSH: Использование COM-сервера без его регистрации в системе

YMP, откровенно говоря, желания вступать в споры, считать это гажением или нет, не было. Каждый сам это для себя решает по обстоятельстам. Я для себя это решил давно. Остальные аргументы приведены (вкл. пояснение Serge Yolkin). Поэтому и обратился к людям, знающим как решать задачу (выделено курсивом). О плюсах портабельности можно поговорить в отдельной теме. Есть уйма пользователей, которые к данной задаче относятся скрупулёзно (я в их числе).
"Сложность" манифестов нисколько не пугает.

YMP пишет:

Так что либо нужно класть для него манифест в system32, либо носить wscript.exe с собой.

Это проверенное утверждение?
Впрочем, даже если так, то пока эта информация ничего не меняет. Я пробовал и совместное использование. Мне (да  не только) всё равно нужны алгоритмы.

56

Re: WSH: Использование COM-сервера без его регистрации в системе

Serge Yolkin
Ничего себе порядки. Спасибо, теперь понятнее.

Flasher
Wscript.exe, ActiveX и манифесты для обоих должны находиться в одной папке.
Каюсь, на 7 до этого не проверял. Оказалось, что системная папка (пробовал SysWOW64, где у меня лежит 32-битный wscript.exe) для этого не годится. Какие-то дополнительные заморочки. В обычной папке работает. Если убрать wscript.exe.manifest — не работает.

57

Re: WSH: Использование COM-сервера без его регистрации в системе

YMP, ясно. А скрипты тоже обязательно должны лежать рядом, или их можно класть в родительскую папку?
И по существу запроса есть что сказать? Или ждём знатоков?

58 (изменено: YMP, 2012-02-15 07:25:43)

Re: WSH: Использование COM-сервера без его регистрации в системе

Скрипты могут лежать где угодно, при условии что запускаются через правильный wscript.exe. ActiveX со своим манифестом может лежать как рядом с wscript.exe, так и в подпапке рядом с wscript.exe, названной именем сборки, как оно указано в манифесте wscript.exe.

Алгоритмы на все случаи жизни я дать не могу, так что ждём знатоков, видимо.

Если будете сами экспериментировать, учтите, что система (по кр. мере 7) где-то кэширует информацию о сборках, что может привести к озадачивающим результатам. Когда я создал подпапку с именем сборки и перенёс туда dll и её манифест, скрипт работать перестал — "не найден указанный модуль". Вторая странность случилась, когда я удалил манифест dll и скрипт продолжал нормально работать, при том что CLSID объекта взять уже было неоткуда. После перелогина всё пришло в норму.

59

Re: WSH: Использование COM-сервера без его регистрации в системе

Насчёт местоположения скриптов я не уточнил. Речь о вызове скрипта не в качестве параметра wscript, а напрямую.

За информацию по кешу спасибо, буду иметь в виду.

60

Re: WSH: Использование COM-сервера без его регистрации в системе

Если напрямую значит двойным кликом, то информацию об исполняющей программе система ищет в реестре по расширению файла скрипта, так что я не вижу, как это можно осуществить.

Разве что такой трюк: скрипт запускается двойным щелчком на системном wscript.exe и потом запускает сам себя на переносимом wscript.exe и завершается.

61

Re: WSH: Использование COM-сервера без его регистрации в системе

Двойной щелчок у нас давно - Enter или кнопка на тулбаре.
Значит, всё-таки сразу в реестр лезет. Ясно. Насчёт запуска скрипта по запуску wscript не понял. Впрочем, не суть, могу прописывать и с параметром, главное, чтобы работало.
Такой вопрос: wscript.exe вне папки system32 запускается? Диалог выводит?

И не очень понятно, как программа будет взаимодействовать с зарегистрированными компонентами, не отражёнными в манифесте?

62

Re: WSH: Использование COM-сервера без его регистрации в системе

Flasher, да, WScript запускается вполне нормально вне системной папки.
Все на самом деле очень просто. Если необходимые компоненты подключены (указанные в манифесте), то при вызове их в скриптах они запустятся без проблем (что вполне логично). Если же часть компонентов отсутствует в манифесте, то их поиск будет начинаться с реестра, затем через апишный LoadLibrary.

Что касается того, как работать с незарегистрированными компонентами из скриптов, пока решение такое:
1) При запуске скрипта идет проверка нет ли рядом программы-хоста (WScript.exe). В случае отсутствия требуется сгенерировать этот файл (неважно каким путем: копирование из системной папки, закачка с вашего сервера, генерация из тела скрипта).
2) Проверяем, имеется ли рядом с появившимся WScript файл манифеста приложения.
3) В случае если скрипт был запущен из систмной папки, перегружаем его из нашего хоста.
4) Не забываем рядом положить файл ActiveX компонента.

63

Re: WSH: Использование COM-сервера без его регистрации в системе

Flasher
Не понял, о каком диалоге речь? В остальном JSman уже ответил.

Про запуск я вот что имел в виду: при двойном щелчке или Enter на файле скрипта будет запущен wscript.exe, который прописан в реестре, т.е. находящийся в system32. Скрипт может это определить. После этого он запускает wscript.exe, который вы носите с собой, передав ему в качестве параметра путь к самому себе, а сам после этого завершается.

Определить, как именно он запущен, скрипт может по наличию или отсутствию собственных параметров. При прямом запуске никаких параметров скрипту не передаётся, а когда он потом сам себя запустит на "своём" wscript.exe, он может сам себе передать какой-то параметр, сигнализирующий об этом.

Т.е. скрипт при запуске проверяет, переданы ли ему параметры. Если нет, значит, он запущен двойным кликом. Если да, значит, он запущен своей предыдущей копией уже на своём wscript.exe.

64

Re: WSH: Использование COM-сервера без его регистрации в системе

YMP пишет:

Определить, как именно он запущен, скрипт может по наличию или отсутствию собственных параметров. При прямом запуске никаких параметров скрипту не передаётся, а когда он потом сам себя запустит на "своём" wscript.exe, он может сам себе передать какой-то параметр, сигнализирующий об этом.

Передавать какой-то параметр - избыточно и нерационально. Достаточно а проверять способ своего запуска, например:


if ( WScript.FullName.match(/system32/i) ) {

	// получить полный путь до самого себя
	var path = WScript.ScriptFullName.replace(/[^\\]+$/, '');

	// получить список аргументов, переданных скрипту в момент запуска
	var args = <...>

	// запустить собственную копию wscript, который находится рядом со скриптом
	// аргументы командной строки передаются аналогично
	<...> .Run(path + 'wscript.exe ' + WScript.ScriptFullName + args);
	WScript.Quit();
}
( 2 * b ) || ! ( 2 * b )

65 (изменено: Flasher, 2012-02-16 00:43:15)

Re: WSH: Использование COM-сервера без его регистрации в системе

JSman пишет:

Flasher, да, WScript запускается вполне нормально вне системной папки.

Я пытаюсь запустить из другой папки, выдаёт:

Не удалось запустить приложение, поскольку его параллельная конфигурация неправильна. Дополнительные сведения содержатся в журнале событий приложений или используйте программу командной строки sxstrace.exe для получения дополнительных сведений.

JSman пишет:

Все на самом деле очень просто. Если необходимые компоненты подключены (указанные в манифесте), то при вызове их в скриптах они запустятся без проблем (что вполне логично).

Да, если манифест составлен правильно, что я и ставлю на повестку. Можете написать рабочий манифест с пояснениями нюансов (хотя бы не отражённых в топике) для WSHExtra, например?

JSman пишет:

Если же часть компонентов отсутствует в манифесте, то их поиск будет начинаться с реестра, затем через апишный LoadLibrary.

Так ли это? Ведь мы запускаем wscript с другим манифестом, скрипт же ему передаётся в качестве параметра.

JSman пишет:

Что касается того, как работать с незарегистрированными компонентами из скриптов, пока решение такое:
1) При запуске скрипта идет проверка нет ли рядом программы-хоста (WScript.exe).

Так, стоп, тут пишут, что ничего рядом не проверяется и сразу сопоставляются данные с реестром (HKCR\VBSFile\Shell\Open\Command). Так проверяет рядом или нет?

JSman пишет:

2) Проверяем, имеется ли рядом с появившимся WScript файл манифеста приложения.
3) В случае если скрипт был запущен из систмной папки, перегружаем его из нашего хоста.

Всё это видится лишним. Проще передавать через параметр.


YMP пишет:

Flasher
Не понял, о каком диалоге речь?

О таком.

YMP пишет:

После этого он запускает wscript.exe, который вы носите с собой, передав ему в качестве параметра путь к самому себе, а сам после этого завершается.

Понял.

66

Re: WSH: Использование COM-сервера без его регистрации в системе

Flasher
WshExtra я не смог зарегистрировать у себя на W7 — какая-то ошибка в DllRegisterServer.
Но с манифестами запустить удалось.

WshExtraAsm.manifest

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

<assemblyIdentity
    type="win32"
    name="WshExtraAsm"
    version="1.0.0.1" />

<file name="WshExtra.dll" hash="bbf52114179d1f3d871674198abaac69ec61c4ff" hashalg="SHA1">
    <typelib
        tlbid="{CD1572B0-0C22-490C-B12C-F053986EFE69}"
        version="1.0"
        helpdir="" />
    <comClass
        clsid="{CB65F84A-BA77-4AD6-9882-B5FD20471CBF}"
        progid="WshExtra.Clipboard"
        threadingModel="Apartment" />
    <comClass
        clsid="{D199C0CE-78E8-4DE2-B863-CCDC022A2FCA}"
        progid="WshExtra.FileChooser"
        threadingModel="Apartment" />
    <comClass
        clsid="{AA35C1FF-4FE4-4357-83A2-488AC609DC1B}"
        progid="WshExtra.FileQuery"
        threadingModel="Apartment" />
 </file>

</assembly>

wscript.exe.manifest

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

<assemblyIdentity
    type="win32"
    name="wscript.exe"
    version="1.0.0.0" /> 

<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="WshExtraAsm"
            version="1.0.0.1" />
    </dependentAssembly>
</dependency>

 </assembly>

67

Re: WSH: Использование COM-сервера без его регистрации в системе

YMP
Это всё здорово, конечно. Но меня, как я уже писал, интересует не конечный результат, а алгоритм получения данных и правки. Сейчас, например, проверил SHA1 у WshExtra.dll через ТС, так он другой показывает, нежели тут написан. CRC вообще обязательно указывать? Вроде бы без них работает. Я ещё обратил внимание, что если в wscript.exe.manifest есть лишняя зависимость, или в её теле допущена ошибка, то exe-шник не будет работать вне зависимости от выбранного компонента в скрипте.
Также я пока не понял, почему tlbid у comClass опущены, хотя генерируются? Откуда взялся элемент <typelib/>? И я так понял из названия, что написание WshExtra.sxs необязательно, хотя в описании написано.
Поймал момент с кешированием. нужно делать вынужденную ошибку в манифесте wscript, чтобы по новой перечитывалось.
В общем, нужен какой-то внятный пересказ действий.
И ещё интересно, как быть с компонентапи в виде exe.

68

Re: WSH: Использование COM-сервера без его регистрации в системе

Flasher
Это всё понятно, но я в этой области не знаток. Знатоков мы пока что ждём, а тем временем можно и самим поэкспериментировать. Может, они вообще не появятся.

hash — необязательный атрибут. Я его получил через mt.exe — это консольная программка из Windows 7 SDK, предназначенная для работы с манифестами. Вообще от неё толку мало, использовал только для hash. Почему через ТС он другой, не знаю. Я WshExtra скачивал отсюда.

tlbid у comClass — необязательный атрибут. Поскольку без них работает, то зачем они? typelib я вписал, потому что без него не работало. Взял его в реестре, как и clsid и progid. На 7 у меня dll не хотела регистрироваться, поэтому я её зарегил на виртуалке в ХР и посмотрел в реестр.

Если манифест не встроен в саму dll в виде ресурса, а лежит рядом отдельным файлом, то название сборки и манифеста должно отличаться от имени dll, по крайней мере так написано у майкрософта. Поэтому я добавил Asm, а у max7, видимо, по той же причине добавлено .sxs.

Вы первоисточник-то читали? Там указано, какие атрибуты обязательны, а какие нет.

69

Re: WSH: Использование COM-сервера без его регистрации в системе

WshExtra я, что логично, тоже отсюда скачивал. Без tlbid работает ровно как и без hash, в то время как последний был заействован. Первое экспериментальным путём выявлено?
А в реестре какой куст? Я просто утилитами пользуюсь, не в курсе. Regsvr42 не сгенерировал typelib.

Первоисточник не видел, с английским не очень (особенно, когда речь о подобных заморочках). За наводку спасибо, таблица уже больше проясняет. Посмотрим, что кто ещё полезного скажет вдовесок.

70

Re: WSH: Использование COM-сервера без его регистрации в системе

Flasher пишет:

Без tlbid работает ровно как и без hash, в то время как последний был заействован. Первое экспериментальным путём выявлено?

Необязательность tlbid? В той же таблице видно. Я пробовал их вставлять, когда не работало даже с typelib. Но это опять из-за кэша оказалось, так что потом убрал.

А в реестре какой куст?

Если речь о TypeLib, то путь такой: в HKEY_CLASSES_ROOT ищем ProgID компонента, например, WshExtra.Clipboard. Там узнаём его CLSID — {CB65F84A-BA77-4AD6-9882-B5FD20471CBF}. Потом ищем раздел с именем этого CLSID — HKEY_CLASSES_ROOT\CLSID\{CB65F84A-BA77-4AD6-9882-B5FD20471CBF}. Там есть подраздел TypeLib, из которого и узнаём её CLSID. Потом ищем раздел уже с именем её CLSID и там узнаём её версию, т.к. это обязательный атрибут. helpdir тоже обязателен, но разрешается поставить пустую строку.

71

Re: WSH: Использование COM-сервера без его регистрации в системе

YMP пишет:

Там есть подраздел TypeLib

А если нет этого подраздела при регистрации какой-то библиотеки, как tlbid генерировать?

Mt.exe, Pktextract.exe и Manifestchk.vbs без SDK будут работать? Можете выложить?

72

Re: WSH: Использование COM-сервера без его регистрации в системе

Если подраздела нет, значит и библиотеки типов у ActiveX нет, он без неё работает. Соответственно и в манифесте ничего писать не надо.

Работать будут, наверно. Лучше напишите мне на почту (из профиля), я вышлю. Но manifestchk.vbs у меня отсутствует — возможно, он больше не нужен, т.к. mt.exe имеет ключ -validate_manifest.

73 (изменено: Flasher, 2012-02-17 08:45:08)

Re: WSH: Использование COM-сервера без его регистрации в системе

Не знаю. Беру dsofile (нет typelib). Пишу dsofile.sxs.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="dsofile.sxs" version=" 2.1.0.0" />
  <file name="dsofile.dll">
    <comClass
        clsid="{58968145-CF05-4341-995F-2EE093F6ABA3}"
        progid="DSOFile.OleDocumentProperties"
        threadingModel="Apartment" />
  </file>
</assembly>

Пишу wscript.exe.manifest:

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

<assemblyIdentity
  type="win32"
  name="wscript.exe"
  version="1.0.0.0" /> 

  <dependency>
          <dependentAssembly>
              <assemblyIdentity
                  type="win32"
                  name="dsofile.sxs"
                  version="2.1.0.0" />
          </dependentAssembly>
  </dependency>

</assembly>

Вызываю скрипт по wscript.exe Path

Set DSO = CreateObject("DSOFile.OleDocumentProperties")

Ругается.

А что мне писать на почту? Сразу мне и пишите ссылки через профиль.

74

Re: WSH: Использование COM-сервера без его регистрации в системе

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

В ResHacker'e однако видно ресурс TYPELIB.
В хексредакторе видно строчку TypeLib\{58968145-CF00-4341-995F-2EE093F6ABA3}. Может, всё-таки есть? Да и как именно ругается, тоже лучше процитировать.

75

Re: WSH: Использование COM-сервера без его регистрации в системе

А разве при написании отсюда нельзя сразу отправить ссылки мне на почту? Я же тоже почты не знаю. Тут форма отправки для всех едина.

Ругается так же, как в #65. Редакторы ресурсов-то показывают, но регистрация ничего не даёт. В Hex тоже
ничего не вижу.

76

Re: WSH: Использование COM-сервера без его регистрации в системе

Через форму я не могу вам файлы послать. Пустое сообщение просто отправьте.

В реестре раздел с именем CLSID библиотеки типов появляется, версия там указана 2.1. Но вставка этого всего в манифест вроде бы ничего не даёт, действительно. Не знаю пока, в чём тут дело может быть.

77

Re: WSH: Использование COM-сервера без его регистрации в системе

Вообще я уже это сделал. Вы можете послать ссылку с файлообменника.

А у typelib какая версия?

78

Re: WSH: Использование COM-сервера без его регистрации в системе

А зачем ссылка? Я сами файлы вам отправил.

Нашёл ошибку. Вот в этой строке:

<assemblyIdentity type="win32" name="dsofile.sxs1" version=" 2.1.0.0" />

уберите пробел перед 2.1.0.0. После этого работает без указания TypeLib.

Помогло вот это

Дополнительные сведения содержатся в журнале событий приложений

79

Re: WSH: Использование COM-сервера без его регистрации в системе

Вот спасибо! Сам бы не увидел.
А откуда сообщение?

80

Re: WSH: Использование COM-сервера без его регистрации в системе

Ну так это часть сообщения об ошибке из поста №65. Посмотрел в "Журналы Windows\Приложение" и нашёл подробности.

Ошибка создания контекста архивации для "...\wscript.exe.Manifest". Ошибка в файле манифеста или политики "...\dsofile.sxs2.MANIFEST" в строке 3. Значение " 2.1.0.0" атрибута "version" в элементе "assemblyIdentity" недопустимо.

Думаю, имеется в виду всё-таки контекст аКТивации, а не архивации.

81

Re: WSH: Использование COM-сервера без его регистрации в системе

Странно, сам посмотрел на него сперва, а нужное не поймал.)
Да, журнал посмотрел, буду использовать, спасибо за подсказку.
Теперь надо бы с exe-компонентами (типа JSMail, TCWSHelp и т.п.) разобраться. Можно с ними это проворачивать или нет. До этого пока не получалось.
И ещё интересно как будут себя вести триал-версии.

82

Re: WSH: Использование COM-сервера без его регистрации в системе

Для exe я примеров не видел, не знаю. В этой статье на msdn, Registration-Free Activation of COM Components: A Walkthrough, тоже примеры с dll.

Там, кстати, объяснено, почему имя сборки должно отличаться от имени dll. Это связано с особенностями поиска сборок на Windows XP. Если сборку назвать WshExtra, то сначала ищется WshExtra.dll и проверяется, есть ли в ней встроенный манифест. Если его нет, то поиск, как ни странно, не идёт дальше, а прекращается. Так что до WshExtra.manifest он просто не дойдёт.

83

Re: WSH: Использование COM-сервера без его регистрации в системе

YMP пишет:

Для exe я примеров не видел, не знаю.

Допустим, JSProgBr. Там прилагается progbar.reg, в котором можно посмотреть все данные. Пытаюсь создать по указанной схеме. Запускаю прилагаемый progbar.vbs. Пишет: Ошибка в бмблиотеке dll.
Смотрю в журнал, а он какую-то ерунду пишет:
Ошибка при создании контекста активации для "<Путь>\wscript.exe.Manifest". Не найдена зависимая сборка "sqlite3.sxs,type="win32",version="1.0.0.0"".
Где <Путь> не соответсвует тому, по которому я запускаю exe. После этой папки я уже много откуда запускал (забыл про неё уже). Но даже если удалить оттуда wscript.exe и манифест к нему, то ошибка повторяется с тем же путём. Куда он там кешируется и почему - не понимаю...

84

Re: WSH: Использование COM-сервера без его регистрации в системе

Судя по этой статье, это невозможно: Simplify App Deployment with ClickOnce and Registration-Free COM.

Not every component is a suitable candidate for use under Reg-Free COM. A component is not considered suitable if any of the following are true:

The component is an out-of-process (ActiveX EXE) server. Only DLLs are supported.

The component is a system component or part of the operating system, such as XML, Data Access, Internet Explorer, or DirectX® components. For example, you should not attempt to isolate components such as Microsoft XML (MSXml.dll) or Microsoft Internet Controls (SHDocVw.dll). These components are either part of the operating system, or can be installed with a separate redistributable package.

The component is part of an application, such as Microsoft Office. For example, you should not attempt to isolate components such as the Microsoft Word Object Model or Microsoft Excel Object Model. These two components are part of Office and can only be used on a machine that has the full Office product installed on it.

The component is intended for use as an add-in or a snap-in, such as an Office add-in or a control in a Web browser. Such components typically require some kind of registration scheme defined by the hosting environment that is beyond the scope of the manifest itself. The other problem is an arbitrary application may not be designed to recognize isolated components, as it probably doesn't have a way to reference your component through a manifest.

The component manages a shared physical or virtual system resource. For example, it could manage some kind of data connection shared between multiple applications or a device driver for a print spooler.

85

Re: WSH: Использование COM-сервера без его регистрации в системе

Что ж, очень жаль. Несколько полезных exe-шников отпадают.
Думаю, надо бы скрипт написать для формирования манифестов для dll. Только вот с именами кустов не всё так гладко. Помозгую.
Если надо, я после сбора коллекции рабочих манифестов выложу их тут. Жаль только спойлера нет для такого кол-ва..

86

Re: WSH: Использование COM-сервера без его регистрации в системе

2All: Для начала хотелось бы всё-таки развёрнутую обзорную статью-инструкцию, которой, вполне возможно, место будет на сайте.

Flasher пишет:

Если надо, я после сбора коллекции рабочих манифестов выложу их тут. Жаль только спойлера нет для такого кол-ва..

Один манифест — один пост.

87 (изменено: Shocker.Pro, 2012-09-07 13:57:27)

Re: WSH: Использование COM-сервера без его регистрации в системе

Доброе время суток всем.
У меня есть проект на VB6, слишком объемный, чтобы запросто менять архитектуру. Проект многопользовательский, работает с централизованной БД. В проекте реализовано обновление клиентской части пользователем. Возникла необходимость разрешить пользователю обновляться в условиях ограниченных прав. Проект включает в себя ocx-библиотеку с набором контролов и классов.

C помощью данной ветки я разобрался (хоть и не сразу) с манифестами - заработало за исключением одной вещи: когда в проекте встречается динамическое создание контрола на форме с помощью:
Me.Controls.Add(....
Получаю ошибку:
Invalid class string.
Looking for object with ProgID:
(причем после ProgID: именно пусто, то есть не как в случае неверного указания имени класса)

Подскажите, можно как-то решить эту проблему?
Исходники тестовых проектов и исполняемые файлы с манифестами тут http://www.sql.ru/forum/actualfile.aspx?id=13126151
__________________________
UPD:  Ответили здесь: http://www.sql.ru/forum/actualutils.asp … g=13127765, ковыряюсь дальше.

UPD2: Проблема теперь в другом виде - контрол создать получилось, но при попытке обратиться к его свойству вылетает. Тестовый проект здесь: http://www.sql.ru/forum/actualfile.aspx?id=13129080. Так что вопрос остался открытым

88

Re: WSH: Использование COM-сервера без его регистрации в системе

Доброе время суток всем.
Попробовал использовать файлы внешних манифестов для расширения приложения

termw.exe.manifest - файл

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
          <dependentAssembly>
              <assemblyIdentity
                  type="win32"
                  name="wso.sxs"
                  version="1.0.0.0" />
          </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
      <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>

</assembly>

wso.sxs.manifest - файл

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

<assemblyIdentity
    type="win32"
    name="wso.sxs"
    version="1.0.0.0" />

<file name="wso.dll">

    <comClass
        description="WindowSystemObject Class"
        clsid="{4CE85115-9B90-419F-9193-1C10C75E1383}"
        threadingModel="Both"
        progid="Scripting.WindowSystemObject"
        tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

    <comClass
        description="WindowSystemControl Class"
        clsid="{8E57EFA4-E91E-44FC-B69E-7A3BC1F5AB8D}"
        threadingModel="Both"
        progid="Scripting.WindowSystemControl"
        tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

    <comClass
        description="WindowSystemObjectExtensions Class"
        clsid="{5D2DE0FD-53BC-4E93-8EB3-9EDC90E17DB6}"
        threadingModel="Both"
        progid="Scripting.WindowSystemObjectExtensions"
        tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}" />

    <typelib tlbid="{40CC9252-A25A-4D28-A906-9BD3F752934A}"
        version="1.0"
        helpdir="D:\DISK_RSTYLE_V6\PATH_61\TERM" />

</file>

</assembly>

На WinXP - работает без регистрации
На других системах с WIN7 и выше не хочет. Если зарегистрировать принудительно через rgsvr32 то работает.
В чем может быть проблема.

89

Re: WSH: Использование COM-сервера без его регистрации в системе

dburg, используйте для оформления кода тег code.

90

Re: WSH: Использование COM-сервера без его регистрации в системе

У кого-нибудь есть опыт создания манифестов для дот нет сборок с ком-интерфейсом?

Я так понял, что только mt.exe может помочь в этом вопросе.

91 (изменено: /dev/null, 2016-10-24 18:05:00)

Re: WSH: Использование COM-сервера без его регистрации в системе

Пытаюсь перенести scriptpw.dll из ХР в семерку, создала следующий манифест scriptpw.sxs.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <assemblyIdentity type="win32"
                     name="scriptpw.sxs"
                     version="1.0.0.1" />
   <file name="scriptpw.dll"
         hash="1c5afc560045d0b9b074bca734cb12b7a5eda086"
         hashalg="SHA1">
      <comClass description="Password Class"
                clsid="{834C5A62-E0BB-4FB4-87B9-F37C869C976B}"
                threadingModel="Apartment"
                progid="ScriptPW.Password.1"
                tlbid="{6E3EC78A-6CE7-4298-815B-21BEF4967112}" />
   </file>
</assembly>

Пытаюсь вызвать из JScript'а:

var pass = GetObject('F:\\libs\\scriptpw.dll', 'ScriptPW.Password.1');

Но получаю в итоге ошибку: "Не найдено имя файла или класса при операции программирования объектов". Вопрос очевиден - что нужно поправить, чтобы все заработало?

92

Re: WSH: Использование COM-сервера без его регистрации в системе

/dev/null
Так?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity type="win32" name="scriptpw.sxs" version="1.0.0.1" />
  <file name="scriptpw.dll">
    <typelib
        tlbid="{6E3EC78A-6CE7-4298-815B-21BEF4967112}"
        version="1.0"
        helpdir="" />
     <comClass
        clsid="{834C5A62-E0BB-4FB4-87B9-F37C869C976B}"
        progid="ScriptPW.Password" />
  </file>
  <comInterfaceExternalProxyStub
      name="IPassword"
      iid="{3D3664FB-A3FB-41F3-9D54-7F99D2FF152F}"
      proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
      tlbid="{6E3EC78A-6CE7-4298-815B-21BEF4967112}" />
</assembly>

<папка с манифестами>\cscript.exe test.js:

var pass = New ActiveXObject('ScriptPW.Password');

93 (изменено: /dev/null, 2016-10-24 22:38:34)

Re: WSH: Использование COM-сервера без его регистрации в системе

Flasher, прежде спасибо, что не оставили без внимания мою проблему, однако Ваш вариант почему-то также не срабатывает. Я также прописала в cscript.exe.manifest зависимости, положила манифесты и библиотеку в системную папку, а в итоге по-прежнему пишет: "Невозможно создание объекта сервером программирования объектов".

94

Re: WSH: Использование COM-сервера без его регистрации в системе

/dev/null пишет:

также прописала в cscript.exe.manifest зависимости

А зачем Вам cscript? Консоль нужна? Впрочем, вся разница в одной букве на выбор w/cscript.exe.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity type="win32" name="w/cscript.exe" version="1.0.0.0" />

  <dependency>
     <dependentAssembly>
        <assemblyIdentity type="win32" name="scriptpw.sxs" version="1.0.0.1" />
     </dependentAssembly>
  </dependency>

</assembly>

95

Re: WSH: Использование COM-сервера без его регистрации в системе

Flasher, у меня в манефесте для cscript.exe точто так и прописано, но суть одна и та же. Я все статьи перечитала как на форуме, так и на сайте Майкрасофт, но нужного эффекта так и не добилась. Целый день впустую, можно сказать, прошел.

96

Re: WSH: Использование COM-сервера без его регистрации в системе

/dev/null
Если у Вас Win7 x64, то w/cscript.exe нужно было тащить из SysWOW64, а не system32.
И ещё после правки библиотечного манифеста, нужно высвободишь кэш ложной (с ошибкой) правкой w/cscript.exe.manifest, потом вернуть как было - и снова к тестам.
И, надеюсь, понятно, что при запуске от wscript.exe, манифест рядом с ним должен быть его, т.е. wscript.exe.manifest, а не сscript.exe.manifest.

97

Re: WSH: Использование COM-сервера без его регистрации в системе

Flasher, система x86, а на счет кэша не поняла. Что нужно сделать, чтобы его высвободить?

98

Re: WSH: Использование COM-сервера без его регистрации в системе

Flasher пишет:

И, надеюсь, понятно, что при запуске от wscript.exe, манифест рядом с ним должен быть его, т.е. wscript.exe.manifest, а не сscript.exe.manifest.

Это просто очевидно и само собой разумеется.

99

Re: WSH: Использование COM-сервера без его регистрации в системе

/dev/null
У меня в данный момент такая же. Допишите любой символ в начале или конце текста внутри w/cscript.exe.manifest и сохраните, после попытки вызова должно вывалиться окно "Нет доступа". Точнее:

Не удалось запустить приложение, поскольку его параллельная конфигурация неправильна. Дополнительные сведения содержатся в журнале событий приложений или используйте программу командной строки sxstrace.exe для получения дополнительных сведений.

Потом уберите символ и тестируйте заново.

100

Re: WSH: Использование COM-сервера без его регистрации в системе

Flasher, теперь пишет "Ошибка выполнения Microsoft JScript: Разрешение отклонено"