Класс-оболочка
Например, для нашего случая правильным будет такое тело метода GetClsid:
CLSID const& GetClsid() { // Следующая строка взята из файла ATLGL.IDL // 519D9ED8-BC46-4367-9CCO-498140F39416 static CLSID const clsid = { //======== Эти цифры взяты из файла ATLGL.IDL 0x519d9ed8, 0xbc46, 0x4367, { 0х9с, 0xc0, 0x49, 0x81, 0x40, 0xf3, 0x94, 0x16 }); return clsid; }
Кроме этого важного фрагмента в новом классе объявлены два совмещенных метода Create, каждый из которых умеет создавать окно внедренного элемента ActiveX с учетом особенностей стиля окна (см. справку по CWnd::CreateControl). Затем в классе-оболочке должны быть представлены суррогаты всех методов, экспонируемых классом OpenGL COM DLL-сервера ATLGL.DLL. В том, что вы не полностью приводите тела методов сервера, иначе это был бы абсурд, хотя и так близко к этому, можно убедиться, просмотрев на редкость унылые коды реализации класса-оболочки, которые необходимо вставить в файл OpenGLcpp. Утешает мысль, что в исправной Studio .NET эти коды не придется создавать и редактировать вручную:
#include "stdafx.h" #include "opengl.h" IMPLEMENT_DYNCREATE(COpenGL, CWnd) //====== Стандартное свойство реализовано //====== в виде пары методов Get/Set void COpenGL::SetFillColor(unsigned long newValue) { static BYTE parms[] = VTS_I4; InvokeHelper(0xfffffe02, DISPATCH_PROPERTYPUT,VT_EMPTY, NULL, parms, newValue); } //====== Стандартное свойство unsigned long COpenGL::GetFillColor0 { unsigned long result; InvokeHelper (Oxfffffe02, DISPATCH_PROPERTYGET, VT_I4, (void4) &result, NULL); return result; } //====== Наши методы сервера void COpenGL::GetLightParams(long* pPos) { static BYTE parms[] = VTS_PI4; InvokeHelper (Oxl, DISPATCH_METHOD, VT_EMPTY, NULL, parms, pPos); } void COpenGL:: SetLightParam (short lp, long nPos) { static BYTE parms [ ] = VTS 12 VTS 14; InvokeHelper{0x2, DISPATCH_METHOD, VT_EMPTY, NULL, parms, lp, nPos); } void COpenGL::ReadData() InvokeHelper(0x3, DISPATCH_METHOD, VT_EMPTY, 0, 0); void COpenGL::GetFillMode(DWORD* pMode) static BYTE jparms[] = VTS_PI4; InvokeHelper (0x4, DISPATCH_METHOD, VT_EMPTY, NULL, parms, pMode); } void COpenGL::SetFillMode(DWORD nMode) static BYTE parms[] = VTS_I4; InvokeHelper(0x5, DISPATCH_METHOD, VT_EMPTY, NULL, parms, nMode); void COpenGL::GetQuad(BOOL* bQuad) static BYTE parms[] = VTS_PI4; InvokeHelper(0x6, DISPATCH_METHOD, VT_EMPTY, NULL, parms, bQuad); void COpenGL::SetQuad(BOOL bQuad) static BYTE parms[] = VTS_I4; InvokeHelper (0x7, DISPATCH_METHOD, VT_EMPTY, NULL, parms, bQuad); }
Затем подключите оба новых файла к проекту Project › Add Existing Item.