1.我用ATL生成一個組件對象,我在COM中使用IDD_IEncrypt,這個在哪里寫義,是啥?GUID?
答:IDD_IEncrypt是GUID,也稱作CLSID,放到該項目的對象的xxx_i.c文件中。
2.S_OK,NOERROR等常量中定義在哪些文件上(偷一下懶)(VC6.0)。
答:winerror.h中
3.我在一個ASP組件對象中有構(gòu)造函數(shù)使用SysAllocString()分配內(nèi)存在該對象的類變量,在DLL Release memory的時候,我要調(diào)用SysFreeString(),可是好像該對象沒有析構(gòu)函數(shù),我在哪兒處理。
答:可以自己添個析構(gòu)函數(shù),在里面調(diào)用SysFreeString。或可以使用_bstr_t或CComBSTR,就省得釋放內(nèi)存了。
4.BSTR指針的內(nèi)容如何拷貝到LPOLESTR指針上?
答:BSTR是COM使用的特殊字符串類型,它的開頭是BSTR所包含的字符串的字節(jié)長度,然后才是字符串,該字符串以null
結(jié)束,不過普通的字符串中間是不允許包含null的,但是BSTR允許,因為它前面已經(jīng)有該字符串的長度了。如果要在BSTR和我們
所常見的字符串類型轉(zhuǎn)換,一般不必自己轉(zhuǎn)換,用_bstr_t類就可以。這也是微軟所推薦的。比如要從BSTR m_bstrA 轉(zhuǎn)為 char*
可以這樣:
char* pStr;
pStr = (char*)_bstr_t(m_bstrA);
很簡單吧。
如果要從char* pStr轉(zhuǎn)為BSTR,這樣作:
BSTR m_bstrA;
m_bstrA = _bstr_t(pStr).copy();
其它類型轉(zhuǎn)換我沒試過,不過從char*轉(zhuǎn)為
LPCTSRT之類應(yīng)該就不會太難了。
(注:看一看第9條,唉!,自已夠笨的)
5.在COM方法中能不能使用try...catch?
答:在COM中可以用try,catch塊,但在Project->Settings->C/C++->C++ Language下要選中Enable Exception Handling。如果你用try,catch塊,可在catch塊中可以這樣寫:Error((BSTR)e.Description, IID_*, e.Error())(e是_com_error)。
6.我的組件有一個方法Encrypt,需要傳入一個加密字符串,加密后將字符串返回給VB,在VB中我使用 s=jj.Encrypt(數(shù)據(jù)),那么我在COM中該如何定義該方法?
答:返回值要是[out]屬性,要想用以上方法使用,最后一個參數(shù)用[out,retval]BSTR* pEncryptString,這將作為返回字符串。
完整定義如下:
[id(2), helpstring(加密)] HRESULT Encrypt(BSTR EncryptString,[out,retval]BSTR *pEncryptString);]
7.我的屬性為什么不能進行賦值?
我在組件里加一個屬性Key,可以get與put,在組件源程序中有g(shù)et_Key()與put_Key(),get_Key工作正常,可我的put_Key不正常呀!,源程序如下:
STDMETHODIMP CEncrypt::put_Key(BSTR newVal)
{
m_pKey=newVal;//m_pKey為類變量,如下定義:BSTR m_pKey;
return S_OK;
}
答:m_pKey=SysAllocString(newVal);
8.如何更改控件或組件的在注冊時存放在注冊表中的名稱?

自已答:告訴你,不在.idl,在你的xxx.rgs文件中,全改了,是不是已經(jīng)...,嘿嘿~~.
9.ATL中CComBSTR與_bstr_t的區(qū)別?嘿嘿~~,我現(xiàn)在才明白一點,高手莫笑。
答:
共同點:對于BSTR到BSTR,BSTR到對象(CComBSTR/_bstr_t),對象到BSTR,兩者之間沒有什么區(qū)別,CComBSTR與_bstr_t都能很好地管理處理BSTR.
異同點:_bstr_t提供了BSTR到char,wchar_t指針的處理,也就是說能把BSTR的內(nèi)容拷貝成char*,而CComBSTR就沒有這種功能。
10.OLE_COLOR與COLORREF,VARIANT_BOOL與BOOL有何區(qū)別?
答:我是不知道,不過可以直接進行賦值。嘿嘿..,是不是太土吧!
以下是陸大蝦的進課:
OLE_COLOR與COLORREF之間是有一定區(qū)別的。OLE_COLOR和COLORREF都是DWORD類型,但對于COLORREF來說,它的最高一個字節(jié)永遠是0x00。即如果是紅色,對于COLORREF來說是0x000000FF。而OLE_COLOR的最高一個字節(jié)有兩種情況:0x80(也就是10000000,最高位是1)或0x00(也就是00000000,最高位是0)。當OLE_COLOR的最高位是0時,它與COLORREF是相同的,最后三個字節(jié)代表RGB,可以相互賦值。例如紅色用OLE_COLOR來表示同樣是0x000000FF。但當OLE_COLOR的最高位是1時,它的中間兩個字節(jié)一定都是0x00,最后一個字節(jié)表示的是系統(tǒng)顏色索引值。例如系統(tǒng)定義菜單的顏色索引值是4,所以用OLE_COLOR來表示就是0x80000004。在VB中,如果你選中一個FORM,在它的屬性頁中你可以看到它的BackColor屬性,你點擊下拉框,就可以選擇是使用調(diào)色板色還是系統(tǒng)色,調(diào)色板色就是對應(yīng)了OLE_COLOR的高位為0的情況,系統(tǒng)色對應(yīng)的是OLE_COLOR高位為1的情況。你試一下就知道是怎么回事了。
VARIANT_BOOL和BOOL之間也有區(qū)別。BOOL為long,在BOOL中,TURE為1,F(xiàn)ALSE為0。VAIRNAT_BOOL為short,在VARIANT_BOOL中,VARIANT_TRUE為-1(0xFFFF),VARIANT_FALSE為0(0x0000)。并且VARIANT_BOOL是和VB中的Boolean相同的,就像BSTR和String的關(guān)系一樣。所以,在自動化組件及控件中應(yīng)該使用VARIANT_BOOL。
11.如何知道該Activex是在VB的設(shè)計時還是運行時?
答:判斷run-mode和design-mode的方法是CComControl::GetAmbientUserMode,你可以在MSDN中找到這個函數(shù)的用法。
12.我的ActiveX控件有一個屬性Algin,我想在VB中列出其屬性值出現(xiàn)一個ComboBox來列出我定義的幾個值?,有的枚舉出來左邊有圖像,右邊有文字說明,這是如何實現(xiàn)的?
答:簡單的靜態(tài)枚舉直接在 IDL 文件中定義枚舉類型,把屬性的類型定為枚舉類型即可。動態(tài)枚舉比較麻煩,主要涉及到 IPerPropertyBrowsingImpl<CATLControlWin> 的下列方法:MapPropertyToPage, GetPredfinedStrings, GetPredefinedValue, GetDisplayString。具體實現(xiàn)方法請參考《Visual C++ 5 ActiveX 編程指南》,Jerry Anderson 著,清華大學(xué)出版社。
以下簡單的靜態(tài)枚舉的代碼片段(以Align屬性說明):
//typedef enum tagFontAlign{Left=0,Center=1,Right=2}FontAlign;(比較完整的如下)
typedef enum tagFontAlign
{
[helpstring(Left)]Left=0,
[helpstring(Center)]Center=1,
[helpstring(Right)]Right=2,
}FontAlign;
[propget, id(2), helpstring(對齊方式)] HRESULT Align([out, retval] FontAlign *pVal);
[propput, id(2), helpstring(對齊方式)] HRESULT Align([in] FontAlign newVal);
在接下來的接口定義中添加屬性Align時,屬性的數(shù)據(jù)類型就填FontAlign,其它操作照常。編譯完以后,你就應(yīng)該在VB Project中的Object Browser中看到有這么一個枚舉類型。在控件屬性中選中Align時,就會有個Combo Box讓你選擇FontAlign中的一個值。
13.如何創(chuàng)建一個容器,像VB中的Tabbed Dialog容器,控件在它范圍內(nèi)移動?
答:這要靠控件容器實現(xiàn) ISimpleFrameSite 接口,在 MSDN 中搜索 Extending ATL 3.0 Control Containment to Help You Write Real-world Containers。
14.在ATL中使用其默認的Font屬性的話,會產(chǎn)生以下錯誤:
warning MIDL2039 : interface does not conform to [oleautomation] attribute
warning MIDL2039 : interface does not conform to [oleautomation] attribute
warning MIDL2039 : interface does not conform to [oleautomation] attribute
答:這可是困惑我N天,也不知道白了多少根頭發(fā),這是一個BUG,在Microsoft的KnowLedge的有這一個BUG報告:
“BUG: MIDL2039 Warning with IFontDisp/IPictureDisp Parameter Type”
15.在ATL中產(chǎn)生的Active X中使用默認的Font屬性的話,在VB中的對象屬性頁中對其屬性進行賦值,會產(chǎn)生一個錯誤:
“Invalid Properties Value”.
答:該屬性在ATL產(chǎn)生后需要在作些設(shè)置才能用,在Microsoft的KnowLedge的有一篇文章:
《Using Fonts in ATL Controls with NiceText.exe》
16.在ATL中產(chǎn)生的Active X中使用默認的Font屬性,在.IDL中產(chǎn)生默認接口定義,該如何使用該接口定義呢?
答:#include <ocidl.h>
IFont *piFont;
HRESULT hr;
HFONT hfont;
hr = m_pFont->QueryInterface(IID_IFont, (void **)&piFont);
if(SUCCEEDED(hr))
{
hr = piFont->get_hFont(&hfont);
}
lhxx的小貢獻
在程序中調(diào)用要動態(tài)分配內(nèi)存或?qū)嵗腃OM時要注意要用指針的地址來進行參數(shù)傳遞:
... Sample(int **pInput)
{
*pInput = ...;
....
}
... Sample1( BSTR *pbstr)
{
*pbstr = (BSTR) malloc (.....);
....
}
如何打算學(xué)習ActiveX開發(fā)的話,這本書一定要看《Visual C++ 5 Active X編程指南》,學(xué)習COM一定要看《Inside COM》,《COM原理與應(yīng)用》;還可參雨考我在CSDN的文檔中心上發(fā)表的《COM錯誤處理》,嘿嘿~~,初學(xué)者看之有大補呀!,^_^.....