codefans

          導航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統計

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          程序設計鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          COM初學者必看

          1.我用ATL生成一個組件對象,我在COM中使用IDD_IEncrypt,這個在哪里寫義,是啥?GUID?
          答:IDD_IEncrypt是GUID,也稱作CLSID,放到該項目的對象的xxx_i.c文件中。

          2.S_OK,NOERROR等常量中定義在哪些文件上(偷一下懶)(VC6.0)。
          答:winerror.h中

          3.我在一個ASP組件對象中有構造函數使用SysAllocString()分配內存在該對象的類變量,在DLL Release memory的時候,我要調用SysFreeString(),可是好像該對象沒有析構函數,我在哪兒處理。
          答:可以自己添個析構函數,在里面調用SysFreeString。或可以使用_bstr_t或CComBSTR,就省得釋放內存了。

          4.BSTR指針的內容如何拷貝到LPOLESTR指針上?
          答:BSTR是COM使用的特殊字符串類型,它的開頭是BSTR所包含的字符串的字節長度,然后才是字符串,該字符串以null
          結束,不過普通的字符串中間是不允許包含null的,但是BSTR允許,因為它前面已經有該字符串的長度了。如果要在BSTR和我們
          所常見的字符串類型轉換,一般不必自己轉換,用_bstr_t類就可以。這也是微軟所推薦的。比如要從BSTR m_bstrA 轉為 char*
          可以這樣:
          char* pStr;
          pStr = (char*)_bstr_t(m_bstrA);
          很簡單吧。
          如果要從char* pStr轉為BSTR,這樣作:
          BSTR m_bstrA;
          m_bstrA = _bstr_t(pStr).copy();
          其它類型轉換我沒試過,不過從char*轉為
          LPCTSRT之類應該就不會太難了。
          (注:看一看第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(數據),那么我在COM中該如何定義該方法?
          答:返回值要是[out]屬性,要想用以上方法使用,最后一個參數用[out,retval]BSTR* pEncryptString,這將作為返回字符串。
          完整定義如下:
          [id(2), helpstring(加密)] HRESULT Encrypt(BSTR EncryptString,[out,retval]BSTR *pEncryptString);]

          7.我的屬性為什么不能進行賦值?
          我在組件里加一個屬性Key,可以get與put,在組件源程序中有get_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文件中,全改了,是不是已經...,嘿嘿~~.

          9.ATL中CComBSTR與_bstr_t的區別?嘿嘿~~,我現在才明白一點,高手莫笑。
          答:
             共同點:對于BSTR到BSTR,BSTR到對象(CComBSTR/_bstr_t),對象到BSTR,兩者之間沒有什么區別,CComBSTR與_bstr_t都能很好地管理處理BSTR.
            異同點:_bstr_t提供了BSTR到char,wchar_t指針的處理,也就是說能把BSTR的內容拷貝成char*,而CComBSTR就沒有這種功能。

          10.OLE_COLOR與COLORREF,VARIANT_BOOL與BOOL有何區別?
          答:我是不知道,不過可以直接進行賦值。嘿嘿..,是不是太土吧!
          以下是陸大蝦的進課:
          OLE_COLOR與COLORREF之間是有一定區別的。OLE_COLOR和COLORREF都是DWORD類型,但對于COLORREF來說,它的最高一個字節永遠是0x00。即如果是紅色,對于COLORREF來說是0x000000FF。而OLE_COLOR的最高一個字節有兩種情況:0x80(也就是10000000,最高位是1)或0x00(也就是00000000,最高位是0)。當OLE_COLOR的最高位是0時,它與COLORREF是相同的,最后三個字節代表RGB,可以相互賦值。例如紅色用OLE_COLOR來表示同樣是0x000000FF。但當OLE_COLOR的最高位是1時,它的中間兩個字節一定都是0x00,最后一個字節表示的是系統顏色索引值。例如系統定義菜單的顏色索引值是4,所以用OLE_COLOR來表示就是0x80000004。在VB中,如果你選中一個FORM,在它的屬性頁中你可以看到它的BackColor屬性,你點擊下拉框,就可以選擇是使用調色板色還是系統色,調色板色就是對應了OLE_COLOR的高位為0的情況,系統色對應的是OLE_COLOR高位為1的情況。你試一下就知道是怎么回事了。

          VARIANT_BOOL和BOOL之間也有區別。BOOL為long,在BOOL中,TURE為1,FALSE為0。VAIRNAT_BOOL為short,在VARIANT_BOOL中,VARIANT_TRUE為-1(0xFFFF),VARIANT_FALSE為0(0x0000)。并且VARIANT_BOOL是和VB中的Boolean相同的,就像BSTR和String的關系一樣。所以,在自動化組件及控件中應該使用VARIANT_BOOL。

          11.如何知道該Activex是在VB的設計時還是運行時?
          答:判斷run-mode和design-mode的方法是CComControl::GetAmbientUserMode,你可以在MSDN中找到這個函數的用法。

          12.我的ActiveX控件有一個屬性Algin,我想在VB中列出其屬性值出現一個ComboBox來列出我定義的幾個值?,有的枚舉出來左邊有圖像,右邊有文字說明,這是如何實現的?
          答:簡單的靜態枚舉直接在 IDL 文件中定義枚舉類型,把屬性的類型定為枚舉類型即可。動態枚舉比較麻煩,主要涉及到 IPerPropertyBrowsingImpl<CATLControlWin> 的下列方法:MapPropertyToPage, GetPredfinedStrings, GetPredefinedValue, GetDisplayString。具體實現方法請參考《Visual C++ 5 ActiveX 編程指南》,Jerry Anderson 著,清華大學出版社。
          以下簡單的靜態枚舉的代碼片段(以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時,屬性的數據類型就填FontAlign,其它操作照常。編譯完以后,你就應該在VB Project中的Object Browser中看到有這么一個枚舉類型。在控件屬性中選中Align時,就會有個Combo Box讓你選擇FontAlign中的一個值。

          13.如何創建一個容器,像VB中的Tabbed Dialog容器,控件在它范圍內移動?
          答:這要靠控件容器實現 ISimpleFrameSite 接口,在 MSDN 中搜索 Extending ATL 3.0 Control Containment to Help You Write Real-world Containers。

          14.在ATL中使用其默認的Font屬性的話,會產生以下錯誤:
          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天,也不知道白了多少根頭發,這是一個BUG,在Microsoft的KnowLedge的有這一個BUG報告:
              “BUG: MIDL2039 Warning with IFontDisp/IPictureDisp Parameter Type”

          15.在ATL中產生的Active X中使用默認的Font屬性的話,在VB中的對象屬性頁中對其屬性進行賦值,會產生一個錯誤:
          “Invalid Properties Value”.
          答:該屬性在ATL產生后需要在作些設置才能用,在Microsoft的KnowLedge的有一篇文章:
          《Using Fonts in ATL Controls with NiceText.exe》

          16.在ATL中產生的Active X中使用默認的Font屬性,在.IDL中產生默認接口定義,該如何使用該接口定義呢?
          答:#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的小貢獻
          在程序中調用要動態分配內存或實例的COM時要注意要用指針的地址來進行參數傳遞:
          ... Sample(int **pInput)
          {
              *pInput = ...;
            ....
          }
          ... Sample1( BSTR *pbstr)
          {
            *pbstr = (BSTR) malloc (.....);
            ....
          }

          如何打算學習ActiveX開發的話,這本書一定要看《Visual C++ 5 Active X編程指南》,學習COM一定要看《Inside COM》,《COM原理與應用》;還可參雨考我在CSDN的文檔中心上發表的《COM錯誤處理》,嘿嘿~~,初學者看之有大補呀!,^_^.....

          posted on 2005-07-27 10:19 春雷的博客 閱讀(315) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 惠来县| 楚雄市| 安泽县| 澄城县| 佳木斯市| 裕民县| 项城市| 勐海县| 中山市| 孝昌县| 浦北县| 福贡县| 会东县| 普定县| 正宁县| 卢龙县| 花莲市| 咸阳市| 博乐市| 孟村| 潮州市| 建始县| 汉沽区| 吉隆县| 博罗县| 万年县| 中西区| 石渠县| 昌宁县| 象山县| 镇巴县| 稷山县| 蓬溪县| 双江| 浦东新区| 昭觉县| 弥勒县| 新河县| 嵊泗县| 东山县| 漳浦县|