在wxWidgets中使用ActiveX

一 創建控件的多種方法


1.以ProgID方式創建

wxAutomationObject sp;
if (!sp.CreateInstance(_T("FPUSpreadADO.fpSpread.6")))
{
    wxMessageBox(_T("Could not create object."));
    return;
}

IDispatch* pObj = (IDispatch *)sp.GetDispatchPtr();
wxActiveXContainer* grid = new wxActiveXContainer(this,IID_IDispatch,pObj);


wxActiveXContainer就是一個窗體,通過wxSizer加進父窗體即可。

wxAutomationObject的GetInstance函數使用的參數名爲ProgID,ProgID可通過VC6.0自帶的工具OLEVIEW.EXE進行查看,
打開OLEVIEW.EXE,在左側點Object Classes \ Grouped by Component Category \ Control \ 控件名稱,右側會顯示相關信息。
如下圖:



2.通過CLSID進行創建

控件的CLSID也可通過OLEVIEW.EXE獲取,如上圖所示。

 CLSID clsId = {0xDE52502E, 0xF837, 0x492B, { 0xAE, 0x14, 0xA1, 0x82, 0x53, 0x1A, 0xFA, 0xF4}};//Spread COM
 IDispatch* pDispatch;
 if (SUCCEEDED(CoCreateInstance(clsId, NULL, CLSCTX_SERVER, IID_IDispatch,(void**)&pDispatch)))
 {
   wxAutomationObject *sp = new wxAutomationObject;
   sp->SetDispatchPtr(pDispatch); 
   wxActiveXContainer* grid = new wxActiveXContainer(this,IID_IDispatch,pDispatch);
 }

3.用類工廠相關函數創建,不帶授權信息


HRESULT hr;	
IDispatch* pObj;
CLSID clsid	= { 0xDE52502E, 0xF837, 0x492B, { 0xAE, 0x14, 0xA1, 0x82, 0x53, 0x1A, 0xFA, 0xF4}};
LPCLASSFACTORY pClassFactory = NULL;
if (SUCCEEDED(hr = CoGetClassObject(clsid, CLSCTX_SERVER, NULL,IID_IClassFactory, (void**)&pClassFactory)))
{
   hr = pClassFactory->CreateInstance(NULL, IID_IOleObject, (void**) &pObj);
   pClassFactory->Release();
   if(FAILED(hr))
     return;

   wxAutomationObject *sp = new wxAutomationObject;
   sp->SetDispatchPtr(pObj); 
   wxActiveXContainer* grid = new wxActiveXContainer(this,IID_IDispatch,pObj);
}

4.用類工廠相關函數創建,帶授權信息

爲什麼要帶授權信息,是因爲帶授權信息的控件在開者的電腦上可以正常運行,但分發到其它電腦上就無法運行,所以在創建控件時必須帶上授權信息。
wxAutomationObject僅提供以ProgID方式創建控件,此種方式卻無法傳入授權信息。筆者琢磨良久,此文由來也正基於此。

WCHAR pwchLicenseKey[] =
{
	0x0043,  0x006F,  0x0070,  0x0079,  0x0072,  0x0069,
	0x0067,  0x0068,  0x0074,  0x0020,  0x0028,  0x0063,
	0x0029,  0x0020,  0x0031,  0x0039,  0x0039,  0x0034,
	0x0020
};

HRESULT hr;    
IDispatch* pObj;
CLSID clsid    = { 0xDE52502E, 0xF837, 0x492B, { 0xAE, 0x14, 0xA1, 0x82, 0x53, 0x1A, 0xFA, 0xF4}};
BSTR bstrLicense = ::SysAllocStringLen(pwchLicenseKey,  sizeof(pwchLicenseKey)/sizeof(WCHAR));
LPCLASSFACTORY2 pClassFactory2;
if (SUCCEEDED(hr = CoGetClassObject(clsid, CLSCTX_SERVER, NULL,    IID_IClassFactory2, (void**)&pClassFactory2)))
{
  hr = pClassFactory2->CreateInstanceLic(NULL, NULL, IID_IDispatch,    bstrLicense, (void**) &pObj);
  pClassFactory2->Release();
  if(FAILED(hr))
    return;

  wxAutomationObject *sp = new wxAutomationObject;
  sp->SetDispatchPtr(pObj); 
  wxActiveXContainer* grid = new wxActiveXContainer(this,IID_IDispatch,pObj);
}
::SysFreeString(bstrLicense);


如何取得一個控件的license key呢?可去微軟網站下載一個工具(licreqst.exe)來查看。地址:http://support.microsoft.com/kb/151771/zh-cn


二  控件的使用

控件創建後,接下來就是通過獲取屬性,設置其屬性,調用其方法來操作控件了。
VC中在對話框上添加控件時,爲其關聯控件類時,會自動將控件的屬性和方法導出來,並生成一個類,非常方便。
但wxWidgets卻無法如此,也沒有提供一個工具通過ocx來導出一個類,只提供簡單的操作接口。或許wxWidgets初衷就是跨平臺的,而ActiveX卻是MS專屬,所以wxWidgets未提供較多操作,僅簡單提供三類操作。

操作示例如下:
獲取屬性:wxVariant var = sp->GetProperty(wxT("Text")); //Text就是屬性的名稱
設置屬性:sp->PutProperty(wxT("Col"), wxVariant((long)1));
調用方法:sp->CallMethod(wxT("SetText"), wxVariant((long)1),wxVariant((long)2),wxVariant((double)1));

如果只有一個ocx文件,如何知道它提供了哪些接口,以及該接口有哪些屬性和方法。同樣使用OLEVIEW.EXE來查看,這正是wxWidgets下使用COM比較繁瑣之處。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章