Как создать 64-битный класс из 32-битного процесса Excel - PullRequest
3 голосов
/ 13 апреля 2019

Я зарегистрировал несколько DLL, специфичных для программного обеспечения Unicom Dimensions / IBM SPSS Data Collection Desktop 7 (x64), и проверяю, что классы отображаются в HKCR / Classes, а также в HKLM.

enter image description here

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.

1 Ответ

1 голос
/ 15 апреля 2019
Windows Registry Editor Version 5.00
;reg_script.reg
[HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}]
"AppID"="{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}"

[HKEY_CURRENT_USER\SOFTWARE\Classes\Wow6432Node\CLSID\{AE2E32FA-FB29-4C42-BFF9-7ACFA1AB0A1B}]
"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 верен .

...