Я хочу знать, как использовать 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"
Как позвонить: Маршал