Как реализовать Reg-Free COM в VB6 на Windows 7 64bit [дубликат]

Быстрый и простой ответ: Нет.

Javascript - довольно высокий уровень языка и не имеет доступа к этой информации.

76
задан GSerg 20 March 2013 в 12:39
поделиться

5 ответов

Похоже, что идеальное решение еще не существует. Чтобы обобщить некоторые исследования:

Make My Manifest ( link )

Этот инструмент сканирует проект VB6 для поиска зависимостей COM, но также поддерживает объявление вручную зависимых COM-зависимостей (т. е. используемых через CreateObject).

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

Выглядит как очень хороший инструмент, но с версии 0.6.6 он имеет следующие ограничения:

  • только для VB6 приложений, начинается с файла проекта VB6. Позор, потому что многое из того, что он делает, действительно не имеет ничего общего с приложением VB6.
  • , не подходящим для интеграции в процесс сборки. Это не является большой проблемой, если ваши зависимости не сильно меняются.
  • бесплатное ПО без источника, рискованное полагаться на него, потому что оно может стать отказом в любой момент.

Я не тестировал, поддерживает ли он библиотеки .NET com.

regsvr42 ( codeproject link )

Этот инструмент командной строки генерирует файлы манифеста для собственного COM-модуля библиотеки. Он вызывает DllRegisterServer, а затем шпионит за самостоятельной регистрацией, поскольку он добавляет информацию в реестр. Он также может генерировать манифест клиента для приложений.

Эта утилита не поддерживает .NET COM-библиотеки, поскольку они не выставляют подпрограмму DllRegisterServer.

Утилита написана на C ++ , Исходный код доступен.

mt.exe

Часть окна SDK (может быть загружена из MSDN ), которую вы уже имеете, если у вас есть визуальная студия. Здесь зарегистрировано . Вы можете генерировать файлы манифеста для собственных COM-библиотек следующим образом:

mt.exe -tlb:mycomlib.ocx -dll:mycomlib.ocx -out:mycomlib.ocx.manifest

Вы можете создавать файлы манифеста для .NET COM-библиотек следующим образом:

mt.exe -managedassemblyname:netlib.dll -nodependency -out:netlib.dll.manifest

Однако , есть некоторые проблемы с этим инструментом:

  • Первый фрагмент не будет генерировать атрибуты progid, разбивая клиенты, которые используют CreateObject с progids.
  • Второй фрагмент сгенерирует <runtime> и <mvid>, которые необходимо удалить до того, как манифесты действительно будут работать.
  • Генерация клиентских манифестов для приложений не поддерживается.

Возможно, будущие версии SDK улучшит этот инструмент, я протестировал его в Windows SDK 6.0a (vista).

56
ответ дан Wim Coenen 22 August 2018 в 02:47
поделиться
  • 1
    Я думаю, вы пропустили один вариант: mazecomputer.com , но я ничего не знаю об этом, о котором не говорится в веб-сайте. – Bob 17 May 2009 в 03:59
  • 2
    MMM также перенаправляет не COM (стандартные) DLL. Я не уверен, что другие инструменты делают это. – Bob 17 May 2009 в 04:04
  • 3
  • 4
    Сайт для MMM больше не работает, но место, где был поставлен исходный код, по-прежнему доступно для v0.9 и v0.12 . – Scott Chamberlain 17 March 2015 в 21:06
  • 5
    – bzuillsmith 11 July 2016 в 17:34

Чтобы заполнить ProgID, которые mt.exe не включает, вы можете вызвать ProgIDFromCLSID, чтобы просмотреть их из реестра. Это требует традиционной регистрации COM до завершения файла манифеста, но впоследствии файл манифеста будет самодостаточным.

Этот код C # добавляет ProgID ко всем классам COM в манифесте:

var manifest = XDocument.Load(fileName);
var namespaceManager = new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace("s", "urn:schemas-microsoft-com:asm.v1");
foreach (var classElement in manifest.XPathSelectElements("s:assembly/s:file/s:comClass", namespaceManager)) {
    var clsid = Guid.Parse(classElement.Attribute("clsid").Value);
    int result = ProgIDFromCLSID(ref clsid, out string progId); if (result != S_OK) throw new COMException($"ProgID lookup failed for {clsid}.", result);
    classElement.SetAttributeValue("progid", progId);
}
manifest.Save(fileName);

Код основан на этих определениях взаимодействия:

[DllImport("ole32.dll")] static extern int ProgIDFromCLSID([In] ref Guid clsid, [MarshalAs(UnmanagedType.LPWStr)] out string lplpszProgID);
const int S_OK = 0;
0
ответ дан Edward Brey 22 August 2018 в 02:47
поделиться

Make My Manifest (MMM) - отличный инструмент для этого. Также можно написать скрипт для обработки всех ваших файлов DLL / OCX с помощью mt.exe , чтобы сгенерировать манифест для каждого из них, а затем объединить их все вместе. MMM обычно лучше / проще, потому что он также обрабатывает множество особых / странных случаев.

9
ответ дан jdve 22 August 2018 в 02:47
поделиться
  • 1
    Я немного нервничаю по поводу этой вещи МММ; это всего лишь блог, бесплатный, но не доступный исходный код, только ссылка на «самораспаковывающийся exe». и я вижу комментарии об утилите, приводящей к сбою XP. ммм ... – Wim Coenen 21 January 2009 в 23:21
  • 2
    Эти "аварии" была сама утилита MMM. Это было исправлено в версии 0.6.5, но вы все равно захотите 0,6.6, так как в то время как бета-версия больше не заканчивается. Вы всегда можете использовать MT.EXE, хотя, как уже было предложено. – Bob 22 January 2009 в 00:19
  • 3
    mt.exe не генерирует progid, когда я использую его на серверах native com, таких как dbgrid32.ocx – Wim Coenen 23 January 2009 в 02:21
  • 4
    Использование reg free COM с .NET-компонентами может, по-видимому, привести к сбою XP - см. Этот stackoverflow.com/questions/617253/… – MarkJ 17 March 2009 в 23:23
23
ответ дан mcdon 22 August 2018 в 02:47
поделиться

Вы можете использовать Unattended Make My Manifest , чтобы генерировать манифесты непосредственно в автоматических сборках. Он использует файл сценария для добавления зависимых компонентов COM. Это выдержка из образца ini с доступными командами:

# Unattended MMM script
#
# Command names are case-insensitive. Reference of supported commands:
#
# Command: Identity
#
#   Appends assemblyIdentity and description tags.
#
#   Parameters       <exe_file> [name] [description]
#      exe_file      file name can be quoted if containing spaces. The containing folder 
#                    of the executable sets base path for relative file names
#      name          (optional) assembly name. Defaults to MyAssembly
#      description   (optional) description of assembly
#
# Command: Dependency
#
#   Appends dependency tag for referencing dependent assemblies like Common Controls 6.0, 
#     VC run-time or MFC
#
#   Parameters       {<lib_name>|<assembly_file>} [version] [/update]
#     lib_name       one of { comctl, vc90crt, vc90mfc }
#     assembly_file  file name of .NET DLL exporting COM classes
#     version        (optional) required assembly version. Multiple version of vc90crt can
#                    be required by a single manifest
#     /update        (optional) updates assembly_file assembly manifest. Spawns mt.exe
#
# Command: File
#
#   Appends file tag and collects information about coclasses and interfaces exposed by 
#     the referenced COM component typelib.
#
#   Parameters       <file_name> [interfaces]
#     file_name      file containing typelib. Can be relative to base path
#     interfaces     (optional) pipe (|) separated interfaces with or w/o leading 
#                    underscore
#
# Command: Interface
#
#   Appends comInterfaceExternalProxyStub tag for inter-thread marshaling of interfaces
#
#   Parameters       <file_name> <interfaces>
#     file_name      file containing typelib. Can be relative to base path
#     interfaces     pipe (|) separated interfaces with or w/o leading underscore
#
# Command: TrustInfo
#
#   Appends trustInfo tag for UAC user-rights elevation on Vista and above
#
#   Parameters       [level] [uiaccess]
#     level          (optional) one of { 1, 2, 3 } corresponding to { asInvoker, 
#                    highestAvailable, requireAdministrator }. Default is 1
#     uiaccess       (optional) true/false or 0/1. Allows application to gain access to 
#                    the protected system UI. Default is 0
#
# Command: DpiAware
#
#   Appends dpiAware tag for custom DPI aware applications
#
#   Parameters       [on_off]
#     on_off         (optional) true/false or 0/1. Default is 0
#
# Command: SupportedOS
#
#   Appends supportedOS tag
#
#   Parameters       <os_type>
#     os_type        one of { vista, win7 }. Multiple OSes can be supported by a single 
#                    manifest
#
7
ответ дан wqw 22 August 2018 в 02:47
поделиться
  • 1
    +1 Интересно, тем более, что исходный код доступен. Я немного смущен сходством имени, очевидно, «сделаю мой манифест». и "unattended make my manifest" являются разными инструментами разных авторов. – Wim Coenen 20 November 2009 в 14:15
  • 2
    Примечание. По состоянию на 2017 год (8 лет на ...) этот проект по-прежнему активен при периодических обновлениях обслуживания. github.com/wqweto/UMMM/commits/master . Он работает хорошо, и я использую его регулярно. – DaveInCaz 29 June 2017 в 19:58
  • 3
  • 4