MyOldAccount Ответов: 2

Использование элемента управления activex в приложении visual studio 2019 MFC GUI


ВСТУПЛЕНИЕ:

Я создал элемент управления ActiveX с помощью мастера управления ActiveX MFC в Visual Studio 2019.
Использование его в приложении C# WinForms работает хорошо, я не сталкиваюсь с проблемами, и контроль работает так, как задумано.

Я попытался протестировать этот элемент управления, используя его в настольном приложении MFC, выполнив следующие действия:
  • Щелкнув правой кнопкой мыши на диалоговом Редакторе в панели инструментов, я выбрал опцию выбрать элементы.
  • Выскочило диалоговое окно, я нажал на вкладку COM Components и проверил элемент с именем моего элемента управления ActiveX.
  • Элемент управления появился в toolbox, и я успешно поместил его в Редактор ресурсов.
  • Щелкнув правой кнопкой мыши на элементе управления, появилось контекстное меню, я выбрал опцию Добавить переменную

ПРОБЛЕМА:

IDE создала код для меня, но он не раскрывает мои методы из элемента управления.
Похоже, что я могу использовать только функциональность, предоставляемую CWnd класс.

ВОПРОС:

Как я могу сгенерировать недостающий код без предыдущих версий Visual Studio?

В этот момент я приму любой совет, потому что у меня нет идей и мне нужно решить эту проблему.
Если требуется дополнительная информация, пожалуйста, оставьте комментарий, и я предоставлю его как можно скорее.

Что я уже пробовал:

  • Я погуглил решение и обнаружил, что опция в Мастере классов для генерации кода для меня удалена в этой версии.
  • Этот[^] советы тоже не помогают, так как у меня нет доступа к Visual Studio 2017.
  • Когда я печатаю это, я ищу способ вручную написать недостающий код, но до сих пор не нашел ничего полезного для меня.

Gerry Schmitz

Что делает этот элемент управления ActiveX? Вы сказали, что это работает в C#. Оберните его в интерфейс, скомпилируйте его на DLL / com-сервер и получите доступ из MFC таким образом. И почему именно ActiveX в первую очередь.

2 Ответов

Рейтинг:
6

MyOldAccount

Мне удалось заставить его работать.
Для тех, кто сталкивается с той же проблемой, вот что я сделал:

Мастер генерирует код, подобный приведенному ниже:

Заголовочный файл:

#pragma once

// Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++

// NOTE: Do not modify the contents of this file.  If this class is regenerated
// by Microsoft Visual C++, your modifications will be overwritten.

/////////////////////////////////////////////////////////////////////////////

#include "afxwin.h"

class YourClassName : public CWnd
{
protected:
	DECLARE_DYNCREATE(YourClassName )
public:
	CLSID const& GetClsid()
	{
		static CLSID const clsid
			= {0x3a614790,0xdc9e,0x4e5e,{0xb1,0xa3,0x91,0x97,0x84,0x57,0xc2,0x0a}};
		return clsid;
	}
	virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle,
						const RECT& rect, CWnd* pParentWnd, UINT nID, 
						CCreateContext* pContext = nullptr)
	{ 
		return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID);
	}

	BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
				UINT nID, CFile* pPersist = nullptr, BOOL bStorage = FALSE,
				BSTR bstrLicKey = nullptr)
	{ 
		return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
		pPersist, bStorage, bstrLicKey); 
	}

// Attributes
public:


// Operations
public:


};


В //Operations часть, определите ваши недостающие функции, как показано ниже:

// Operations
public:
	void Read();
	void Write();


CPP файл:

Реализуйте отсутствующую функцию, как в приведенном ниже примере, и вызовите InvokeHelper.

Шестнадцатеричный аргумент-это порядковый номер вашей отсутствующей функции, вы можете найти его в IDL-файле элемента управления ActiveX.

// Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++

// NOTE: Do not modify the contents of this file.  If this class is regenerated
// by Microsoft Visual C++, your modifications will be overwritten.

#include "pch.h"
#include "YourClassName.h"

/////////////////////////////////////////////////////////////////////////////
// COCX

IMPLEMENT_DYNCREATE(YourClassName, CWnd)

/////////////////////////////////////////////////////////////////////////////
// YourClassName Properties

/////////////////////////////////////////////////////////////////////////////
// YourClassName Operations

void COCX::Read()
{
	InvokeHelper(0x02, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}

void COCX::Write()
{
	InvokeHelper(0x01, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}


Надеюсь, это кому-то поможет, спасибо всем, кто пытается помочь.


Рейтинг:
1

Shao Voon Wong

Microsoft вернула опцию ActiveX в мастер классов в Visual Studio 2019 версии 16.8, которая находится в режиме предварительного просмотра. Последний раз я работал с ActiveX 15 лет назад. Элементы управления ActiveX легко использовать в VB6 и C#, но не в Visual C++. Пожалуйста, загрузите простой проект на Github, чтобы воспроизвести эту проблему. Я посмотрю, как извлечь COM-интерфейс из ActiveX для вас.

Typelib и ActiveX теперь поддерживаются в MFC Wizards | C++ Team Blog[^]


MyOldAccount

Большое вам спасибо!

Я прошу прощения за то, что ответил только сейчас (это было поздно ночью, когда я увидел ваш ответ), вот ссылка на GitHub:

https://github.com/AlwaysLearningNewStuff/CodeProjectQuestion

MyOldAccount

Мне удалось решить эту проблему, но я наградил вас 5 звездами за ссылку VS.
Спасибо.