Я зарегистрировал несколько DLL, специфичных для программного обеспечения Unicom Dimensions / IBM SPSS Data Collection Desktop 7 (x64), и проверяю, что классы отображаются в HKCR / Classes, а также в HKLM.
Dumpbin.exe указывает на следующие зависимости, я не вижу здесь ничего, что выглядит некачественно, то есть ничего специфического для программного обеспечения Unicom, которое могло бы не быть зарегистрировано и т. Д.
Изображение имеет следующие зависимости
KERNEL32.dll
USER32.dll
GDI32.dll
COMDLG32.dll
ADVAPI32.dll
ole32.dll
OLEAUT32.dll
ATL100.DLL
SHLWAPI.dll
MSVCP100.dll
MSVCR100.dll
Но при попытке создать экземпляр из VBA (Excel 2016, 32b) происходит сбой с 429, ActiveX не может создать объект :
Dim exp as Object
Set exp = CreateObject("ExportExcel.Export")
Я могу создать экземпляр из Python (64b 3.7):
from win32com import client
exp = client.Dispatch("ExportExcel.Export")
Это так же просто, как иметь 32b Excel и 64b Dimensions? Могу ли я решить эту проблему с помощью установки Excel 64b?
Документация Unicom указывает, что это правильный способ создания экземпляра класса (в примере используется раннее связывание, я пробовал оба варианта безрезультатно).
' ---- Export the Tables ----
Dim MYEXPORT As ExportExcelLib.Export
Set MYEXPORT = New ExportExcelLib.Export
Export MYEXPORT, TableXml, PropertyXml
Кроме того, Unicom предоставляет свой собственный язык "mrScriptBasic", который основан на Visual Basic. Как и следовало ожидать, они также используют функцию CreateObject
для создания экземпляров классов. В их скриптовом программном обеспечении эта функция работает как положено и возвращает правильный экземпляр класса.
Обновление
Я пытался протолкнуть его через dllhost, как Лапша упоминает в комментариях. Я запустил .bat от имени администратора:
REM _Enable.bat
REM This file merges reg_script.reg using the Reg.exe command.
REM This allows 32b program to call a 64b dll via surrogate
REM It is a per user setting but Regedit doesn't allow non admins to run it
reg import "reg_script.reg"
Pause
И это импортирует файл reg_script.reg следующим образом:
Windows Registry Editor Version 5.00
;reg_script.reg
[HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}]
@="ExportExcel"
"AppID"="{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}"
[HKEY_CURRENT_USER\SOFTWARE\Classes\Wow6432Node\AppID\{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}]
"DllSurrogate"=""
[HKEY_CURRENT_USER\SOFTWARE\Classes\AppID\{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}]
"DllSurrogate"=""
Ошибка сохраняется, пытаюсь ли я использовать имя класса или GUID.