Ошибка AxImp: не найден зарегистрированный элемент управления ActiveX в - PullRequest
0 голосов
/ 22 октября 2019

У меня есть элемент управления MFC ActiveX, который я построил с использованием конфигурации отладки x64.

Ниже приведено командное окно Visual Studio 2019 (запускается от имени администратора), все из одного окна / сеанса:

Зарегистрируйте OCX:

Затем я запустил aximp.exe, что привело к вышеприведенному сообщению об ошибке.

Как вы видите, инструмент вернул "Ошибка AxImp: не найден зарегистрированный ActiveXв 'C: \ TempAximp \ DriveOps.ocx'.

Я даже добавил опцию /verbose. Без этой опции и без /nologo выдает точно такое же сообщение об ошибке.

Добавление ActiveX control непосредственно к проекту приводит к получению:

Partially added ocx control to my WinForms project in Visual Studio 2019

Как видите, DriveOpsLib.dll есть, но AxDriveOpsLib.dll является AWOL.

Я должен добавить, что tlbimp.exe отлично работает. Я могу использовать ildasm.exe для файла.

Successful output of TlbImp.exe and ILDasm.exe

ЭтоПроект изначально был написан для Visual Studio 2010. Конфигурация x64 отлично импортируется в проект. Aximp.exe также работаетicely.

Командная строка Visual Studio 2010, импортирующая x64 (64-битный) файл OCX, работает нормально.

Вот снимок экрана ActiveX в VS2010. Все импортированные из файла IDL отлично, x64.

Import of OCX into Visual Studio 2010 and what I need to see in Visual Studio 2019

Вот 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 иЯ хочу, чтобы эта утилита работала.

Empty namespace of DLL from OCX using tlbimp.exe

Что касается исследований: один , два , три ,

Говорят о сохранении битности. У меня есть 64-битный OCX с различными компонентами. Я попытался запустить regsvr32.exe из каталога DLL и снова из C:\Windows\System32. Оба регистрируются нормально и выдают aximp.exe с одинаковой ошибкой. Да, я знаю, что 32-битные (x86) библиотеки DLL должны вызываться из папки C:\Windows\SysWow64, но это здесь не применимо.

Во второй статье говорится о вызове всего из того же командного окна, а затемадминистратор. Я сделал это, как вы можете видеть ранее в этом посте.

Если Visual Studio 2019 прочитает третью статью и согласится с тем, что для aximp.dll нет никаких оснований, то я бы тоже искренне согласился, нок сожалению, это не работает, и я должен быть в состоянии позвонить aximp.exe. Одна проблема, скорее всего, такая же, как и другая.

Мысли?

...