Member 13934734 Ответов: 1

Я хочу знать, как использовать ocx, написанный на C++, на консоли C#.


Привет. Там.

Я создал простой файл c ++ ocx и создал HTML-файл для проверки ocx.

Я подтвердил, что ocx был успешно зарегистрирован в реестре, и подтвердил, что ocx обычно вызывается в тестовом HTML для запуска AfxMessageBox().

Однако я хотел вызвать ocx непосредственно в C #.

Чтобы реализовать вызов ocx, я посмотрел технику маршалинга в Google и написал код C#, который вызывает ocx через маршалинг.

В результате ocx не был вызван, и нет никакого способа определить, является ли это проблемой кода Ocx C ++ или проблемой кода C#.

Я нашел способ решить эту проблему в течение двух недель, но я не мог решить ее.

Я хотел бы получить помощь в решении этих проблем.

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

Процесс, которому я следовал, чтобы создать ocx, выглядит следующим образом.

1. Создать "МФЦ элемента управления ActiveX" проект в Visual студии 2015.
2. Я изменил Ctrl.cpp нажмите клавишу Ctrl.ч, а .файлов IDL, который генерируется автоматически.

- ActiveXTest4_NonCtrl.cpp
BEGIN_DISPATCH_MAP(CActiveXTest4_NonCtrl, COleControl)
	DISP_FUNCTION_ID(CActiveXTest4_NonCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
	DISP_FUNCTION_ID(CLinkCtrl, "TestFunction", dispidTestFunction,TestFunction, VT_I4, VTS_I4 VTS_I4)
END_DISPATCH_MAP()

.....

void CActiveXTest4_NonCtrl::AboutBox()
{
	CDialogEx dlgAbout(IDD_ABOUTBOX_ACTIVEXTEST4_NON);
	dlgAbout.DoModal();
}

int CActiveXTest4_NonCtrl::TestFunction(int Parameter1, int Parameter2){
	CString str;
	str.Format(_T("%d"), Parameter1 + Parameter2);
	AfxMessageBox(str);
	return 1;
}

- ActiveXTest4_Non.idl
importlib(STDOLE_TLB);

	//  Basic dispatch interface of CActiveXTest4_NonCtrl.
	[ 
		uuid(3C788A60-2A80-45E8-8845-FE460E779EC7)	
	]
	dispinterface _DActiveXTest4_Non
	{
		properties:
			
		methods:
			[id(DISPID_ABOUTBOX)] void AboutBox();
			[id(1)] int TestFunction(int Parameter1, int Parameter2);
	};

- ActiveXTest4_NonCtrl.h
class CActiveXTest4_NonCtrl : public COleControl
{
	DECLARE_DYNCREATE(CActiveXTest4_NonCtrl)

// Creator.
public:
	CActiveXTest4_NonCtrl();

// override.
public:
	virtual void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid);
	virtual void DoPropExchange(CPropExchange* pPX);
	virtual void OnResetState();

// Implementation.
protected:
	~CActiveXTest4_NonCtrl();

	DECLARE_OLECREATE_EX(CActiveXTest4_NonCtrl)    // Class Factory and GUID
	DECLARE_OLETYPELIB(CActiveXTest4_NonCtrl)      // GetTypeInfo
	DECLARE_PROPPAGEIDS(CActiveXTest4_NonCtrl)     // property page ID.
	DECLARE_OLECTLTYPE(CActiveXTest4_NonCtrl)		

// Message Map.
	DECLARE_MESSAGE_MAP()

// Dispatch Map.
	DECLARE_DISPATCH_MAP()
	afx_msg void AboutBox();
	afx_msg int TestFunction(int Parameter1, int Parameter2);
// Event Map.
	DECLARE_EVENT_MAP()

// Dispatch and Event ID.
public:
	enum {
		dispidTestFunction = 1L,
	};
};

3. я создал модифицированный файл.
4. файл ocx был создан и успешно зарегистрирован в реестре.
5. я написал тестовый html-файл.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> Test Document </TITLE>
 </HEAD>
 <BODY>

TEST
<OBJECT ID="Test" CLASSID="clsid:5CDEAFC2-43EE-48BC-8052-3895514CD062" width="0" height="0"></OBJECT>

 <script>
 	var str = document.Test.TestFunction(5, 2);
 </script>
 </BODY>
</HTML>

6. Я подтвердил, что ocx-это, как правило, выполнены в формате HTML.
7. Я создал проект c # консольное, чтобы проверить его в C #.
8. Я маршалинг для загрузки ocx в C #, а код, который используется маршалинг:
 [ComVisible(true), ComImport,
 Guid("5CDEAFC2-43EE-48BC-8052-3895514CD062"),
 InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
 interface IMarshal
 {
     [DispId(1)]
     int TestFunction(int param1, int param2);
 }

private static void MarshalTest()
{
   Type typeofMarshal = Type.GetTypeFromProgID("ACTIVEXTEST4_NON.ActiveXTest4_NonCtrl.1");
   if (typeofMarshal == null) return;

   var objMashal = Activator.CreateInstance(typeofMarshal);
   IMarshal iMarshal = (IMarshal)objMashal;
   if (iMarshal == null) return;

   int retVal = iMarshal.TestFunction(1, 2);
}


Моя среда разработки выглядит следующим образом.

ocx проект для создания: VS2015 C ++
Проект называется ocx: VS2015, .NETFramework 4.5, C #
Сгенерированная информация ocx
- clsId = "5CDEAFC2-43EE-48BC-8052-3895514CD062"
- идентификатор progid = "ACTIVEXTEST4_NON.ActiveXTest4_NonCtrl.1"
Как позвонить: Маршал

1 Ответов

Рейтинг:
6

KarstenK

Вы можете сделать это через Импорт элемента управления ActiveX в Visual Studio.

Или создать OCX в C# с базовой библиотекой dll, которая содержит ваш код ocx. Примечание: он должен быть легким, чтобы добавить библиотеку DLL, цель в ваш существующий проект ОСХ.


Member 13934734

Я благодарен Вам за то, что вы ответили на мой вопрос. Карстенк.
Цель моего проекта-использовать OCX-файл, созданный на C ++ из консоли C#, и, наконец, получить доступ к серверу, встроенному в C # с помощью HTML, чтобы использовать локальный OCX-файл.
Не могли бы вы дать мне какой-нибудь совет?

Member 13934734

Я прогнал его через C# WinForm, Websocket...
Спасибо за ваш ответ...