Форум программистов, компьютерный форум CyberForum.ru

как в VC++ создать ActiveX и использовать его методом позднего связывания? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
x-mailer
0 / 0 / 0
Регистрация: 03.10.2007
Сообщений: 129
15.10.2007, 11:26     как в VC++ создать ActiveX и использовать его методом позднего связывания? #1
Уважаемые знатоки!
Подскажите, пожалуйста, как в VC++ создать ActiveX и использовать его методом позднего связывания?
То есть, подобие тому, что в VB делается так:
Set MyCtrl=CreateObject('MyClass')
MyCtrl.DoSomething('Hello world!')
Set MyCtrl=Nothing
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2007, 11:26     как в VC++ создать ActiveX и использовать его методом позднего связывания?
Посмотрите здесь:

метод класса,как использовать его C++
C++ Указатель this - как и когда его использовать
C++ Надо создать ActiveX control (+)
Как использовать данные из цикла вне его C++
Создать динамический целочисленный массив, и отсортировать его методом вставок C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ioka
0 / 0 / 0
Регистрация: 17.10.2007
Сообщений: 16
17.10.2007, 23:25     как в VC++ создать ActiveX и использовать его методом позднего связывания? #2
Как я понимаю вопрос касается только позднего связывания,
с ранним связыванием в VC++ всё ясно?

Для позднего связывания я немножко расширил MFC класс COleDispatchDriver.
если делать без MFC, то смотри исходники и вызывай API функции сам.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
///------------Header.file 
class CMyOleDispatchDriver : public  COleDispatchDriver
{
public:
// Constructors
public:
    CMyOleDispatchDriver() : COleDispatchDriver() {};
    CMyOleDispatchDriver(LPDISPATCH lpDispatch, BOOL bAutoRelease = TRUE)
                           : COleDispatchDriver(lpDispatch,bAutoRelease) {};
    CMyOleDispatchDriver(const CMyOleDispatchDriver& dispatchSrc)
                           : COleDispatchDriver(dispatchSrc) {};
// Operations
public:
void AFX_CDECL InvokeHelper
 (LPCTSTR ptName, WORD wFlags, VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ...);
 
void AFX_CDECL SetProperty(LPCTSTR ptName, VARTYPE vtProp, ...);
void GetProperty(LPCTSTR ptName, VARTYPE vtProp, void* pvProp) const;
void AFX_CDECL GetProperty(LPCTSTR ptName, VARTYPE vtProp, void* pvProp, const BYTE* pbParamInfo,...);
 
// Implementation
DISPID GetDISPID(LPCTSTR pchData) const ;
};
 
///------------ Implementation.file 
 
static LPOLESTR LPCTSTRToLPOLESTR(LPCTSTR pchData )
{
   LPOLESTR bstr = NULL;
 
#if defined(_UNICODE)
   bstr = ::SysAllocStringLen(pchData, wcslen( pchData ) );
 
#else
   int nLen = MultiByteToWideChar(CP_ACP, 0, pchData,-1, NULL, NULL);
 
   if ((bstr = ::SysAllocStringLen(NULL, nLen)) != NULL) {
 
      if(MultiByteToWideChar(CP_ACP, 0, pchData, -1, bstr, nLen) == 0) {
         ::SysFreeString(bstr);
         bstr = NULL;
      }
   }
#endif
 
   return bstr;
}
 
DISPID CMyOleDispatchDriver::GetDISPID(LPCTSTR pchData ) const
{
  DISPID dwDispID = NULL;
  
 
  if (m_lpDispatch == NULL) {
    
    TRACE0(_T('Error in CMyOleDispatchDriver::GetDISPID: attempt to call Invoke with NULL m_lpDispatch!
'));
    AfxThrowOleException(E_FAIL);
  }
  else {
 
   LPOLESTR bstrCopy = LPCTSTRToLPOLESTR(pchData);
   if (bstrCopy == NULL) {
 
#if defined(_UNICODE)
         TRACE0(_T('Error in CMyOleDispatchDriver::GetDISPID: convert from LPCTSTRT to LPOLESTR failed!
'));
         AfxThrowOleException(E_OUTOFMEMORY);
#else
         TRACE1(_T('Error in CMyOleDispatchDriver::GetDISPID: convert from LPCTSTRT to LPOLESTR failed w/err %d!
'),::GetLastError());
         AfxThrowOleException(E_FAIL);
#endif
   }
   else {
 
    HRESULT hr = E_FAIL;
    hr = m_lpDispatch->GetIDsOfNames(IID_NULL, &bstrCopy, 1, LOCALE_USER_DEFAULT, &dwDispID);      
 
    ::SysFreeString(bstrCopy);
 
    if (FAILED(hr)) {
        
      TRACE2(_T('Error in CMyOleDispatchDriver::GetDISPID: GetIDsOfNames( '%s ') failed w/err0x%08lx
'),pchData,hr);
      AfxThrowOleException(hr);
    } 
   }
  }
 
  return dwDispID;
}
 
void AFX_CDECL CMyOleDispatchDriver::InvokeHelper
(LPCTSTR ptName, WORD wFlags, VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ...)
{
 
    DISPID dwDispID;
 
    dwDispID = GetDISPID(ptName);
    
    va_list argList;
    va_start(argList, pbParamInfo);
 
          
    InvokeHelperV(dwDispID, wFlags, vtRet, pvRet, pbParamInfo, argList);
 
    va_end(argList);
 
}
 
void CMyOleDispatchDriver::GetProperty(LPCTSTR ptName, VARTYPE vtProp, void* pvProp) const
{
    ((CMyOleDispatchDriver*)this)->
         InvokeHelper(ptName,DISPATCH_PROPERTYGET, vtProp, pvProp, NULL);
}
 
void AFX_CDECL CMyOleDispatchDriver::GetProperty(LPCTSTR ptName, VARTYPE vtProp,void* pvProp,const BYTE* pbParamInfo, ...)
{
    DISPID dwDispID;
 
    dwDispID = GetDISPID(ptN
x-mailer
0 / 0 / 0
Регистрация: 03.10.2007
Сообщений: 129
18.10.2007, 11:04  [ТС]     как в VC++ создать ActiveX и использовать его методом позднего связывания? #3
ioka, огромное спасибо еще раз за помощь, очень помог!
boombastik
6 / 6 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
22.10.2007, 11:35     как в VC++ создать ActiveX и использовать его методом позднего связывания? #4
Была одна интересная статейка по этому поводу на http://www.dykbits.com/, но теперь этот сайт сдох
Так что я тебе ее письмом вышлю.
Посмотри, может тоже что интересное найдешь...
Владимир.
Terra
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 10
11.05.2014, 14:15     как в VC++ создать ActiveX и использовать его методом позднего связывания? #5
Еще бы комментарии к коду.
Yandex
Объявления
11.05.2014, 14:15     как в VC++ создать ActiveX и использовать его методом позднего связывания?
Ответ Создать тему
Опции темы

Текущее время: 23:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru