У меня есть элемент управления MFC ActiveX, который я построил с использованием конфигурации отладки x64.
Ниже приведено командное окно Visual Studio 2019 (запускается от имени администратора), все из одного окна / сеанса:
Зарегистрируйте OCX:
Затем я запустил aximp.exe
, что привело к вышеприведенному сообщению об ошибке.
Как вы видите, инструмент вернул "Ошибка AxImp: не найден зарегистрированный ActiveXв 'C: \ TempAximp \ DriveOps.ocx'.
Я даже добавил опцию /verbose
. Без этой опции и без /nologo
выдает точно такое же сообщение об ошибке.
Добавление ActiveX control
непосредственно к проекту приводит к получению:
Как видите, DriveOpsLib.dll есть, но AxDriveOpsLib.dll является AWOL.
Я должен добавить, что tlbimp.exe
отлично работает. Я могу использовать ildasm.exe
для файла.
ЭтоПроект изначально был написан для Visual Studio 2010
. Конфигурация x64 отлично импортируется в проект. Aximp.exe
также работаетicely.
Командная строка Visual Studio 2010, импортирующая x64 (64-битный) файл OCX, работает нормально.
Вот снимок экрана ActiveX в VS2010. Все импортированные из файла IDL отлично, x64.
Вот IDL, если это что-то значит.
#include <olectl.h>
#include <idispids.h>
[uuid(FE5C7D88-D53C-4977-BA56-4BF3020A5D8A), version(1.0),
helpfile("DriveOps.hlp"),
helpstring("DriveOps ActiveX Control module"),
control]
library DriveOpsLib
{
importlib(STDOLE_TLB);
[uuid(8B910D84-88AB-46AE-90D4-A7FBB2AEB038), helpstring("Dispatch interface for DriveOps Control")]
dispinterface _DDriveOps
{
properties:
[id(21), helpstring("property percentOfDisk")] ULONG percentOfDisk;
[id(22), helpstring("property hashCRC32")] BYTE hashCRC32;
methods:
[id(1), helpstring("method AbortOperation")] void AbortOperation(void);
[id(2), helpstring("method PercentCopy")] SCODE PercentCopy(void);
};
[uuid(17A86791-4A38-4105-B7BA-2246BFB64880), helpstring("Event interface for DriveOps Control")]
dispinterface _DDriveOpsEvents
{
properties:
// Event interface has no properties
methods:
[id(1)] void OperationFinished(void);
[id(2)] void UpdateProgress(void);
[id(3)] void GetLogs(BSTR* LogPath, BSTR* AuditTrailPath, BSTR* Messages);
};
// Class information for CDriveOpsCtrl
[uuid(DD26C2DD-B27E-486E-B21A-7A01724DE549), helpstring("DriveOps Control"), control]
coclass DriveOps
{
[default] dispinterface _DDriveOps;
[default, source] dispinterface _DDriveOpsEvents;
};
};
Я не могу использовать tlbimp.exe
для генерации AxDriveOpsLib.dll
, поскольку это приводит к пустому импорту.
Вот пустое пространство имен, которое tlbimp.exe
создало в среде VS2019, поэтому мне действительно нужно использовать aximp.exe
иЯ хочу, чтобы эта утилита работала.
Что касается исследований: один , два , три ,
Говорят о сохранении битности. У меня есть 64-битный OCX с различными компонентами. Я попытался запустить regsvr32.exe
из каталога DLL и снова из C:\Windows\System32
. Оба регистрируются нормально и выдают aximp.exe
с одинаковой ошибкой. Да, я знаю, что 32-битные (x86) библиотеки DLL должны вызываться из папки C:\Windows\SysWow64
, но это здесь не применимо.
Во второй статье говорится о вызове всего из того же командного окна, а затемадминистратор. Я сделал это, как вы можете видеть ранее в этом посте.
Если Visual Studio 2019 прочитает третью статью и согласится с тем, что для aximp.dll
нет никаких оснований, то я бы тоже искренне согласился, нок сожалению, это не работает, и я должен быть в состоянии позвонить aximp.exe
. Одна проблема, скорее всего, такая же, как и другая.
Мысли?