<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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)  編輯  收藏


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


    網站導航:
     
    主站蜘蛛池模板: 久久亚洲精品国产精品婷婷| 亚洲日韩中文字幕| 亚洲AV无码一区二区三区网址| 免费看片在线观看| 亚洲av不卡一区二区三区| 日韩精品无码免费专区午夜| 亚洲中文字幕无码久久2017 | 33333在线亚洲| 亚洲熟妇无码AV| 黄页网址大全免费观看12网站| 四虎成人免费观看在线网址| 中文字幕亚洲专区| 亚洲无码一区二区三区| 好男人看视频免费2019中文| 伊人久久亚洲综合影院首页| 永久久久免费浮力影院| 男女猛烈无遮掩视频免费软件| 日本妇人成熟免费中文字幕 | 亚洲永久永久永久永久永久精品| 免费国产黄网站在线观看视频| 亚洲综合免费视频| 成人免费无遮挡无码黄漫视频| 亚洲精品国偷自产在线| 久久免费观看国产精品| 亚洲欧洲日本在线观看 | 亚洲成a人片在线观看中文动漫| 99在线热视频只有精品免费| 亚洲AV综合色区无码二区爱AV| 三年在线观看免费观看完整版中文| 啦啦啦www免费视频| 人人爽人人爽人人片av免费| 日本免费网址大全在线观看| 国产精品日本亚洲777| 亚洲伊人色欲综合网| 99在线精品视频观看免费| 伊人久久综在合线亚洲91| 精品无码国产污污污免费网站 | 久久精品国产亚洲77777| AV片在线观看免费| 亚洲欧洲日本精品| 免费人成网站在线播放|