在网上多了,发现很大一部分网友的问题都是关于参数的转换和传入传出的问题。
为方便网友,200分求问com组件的支持参数与mfc的支持的参数相互转换的方法?!
请给一份详细的总结!这样大家以后都比较清楚!

解决方案 »

  1.   

    除了BSTR和VARIANT型,COM支持的参数其它基本与C所支持的参数完全一样。BSTR的转换最简单的方法,可以使用MFC的CString类,然后再转为其它值。
    CString::AllocSysString() // CString -> BSTR
    CString strVal = (BSTR) bstrVar // BSTR -> CString
    另外还可以通过_bstr_t, CComBSTR等类实现转换。直接调用API的SysAllocString()等也可以,但由于输入的参数是OLECHAR*,所以还需要把普通的char*或LPCTSTR等通过T2OLE等转换,所以使用比较复杂。VARIANT是最复杂的,它支持byte, word, long, BSTR, SafeArray等各种类型的型/实参的调用。一般情况下可以用_variant_,CComVariant,COleVariant等类实现转换,如果直接使用API则相对复杂些。另外说明的是,VARIANT中的SAFEARRAY在MFC也有COleSafeArray所支持,所以没有必要直接使用API函数实现。
      

  2.   

    dispatchwengqun(≡≡★★郁闷★★≡≡) 你在原理上说的很清楚了,现在谢谢!能不能给一些详细的代码!方便大家查阅!
      

  3.   

    Converts a BSTR value to a char *.char* __stdcall ConvertBSTRToString(
       BSTR pSrc
    ) throw( _com_error );
    Parameter
    pSrc 
    A BSTR variable. 
    Example
    // ConvertBSTRToString.cpp
    #include <comutil.h>
    #include <stdio.h>
    #pragma comment(lib, "comsupp.lib")
    int main()
    {
       BSTR bstrText = ::SysAllocString(L"Test");
       wprintf(L"BSTR text: %s\n", bstrText);
       char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
       printf("char * text: %s\n", lpszText2);
       SysFreeString(bstrText);
       delete[] lpszText2;
    }
    Output
    BSTR text: Test
    char * text: Test
    END Microsoft SpecificRequirements
    Header: comutil.h.
      

  4.   

    Microsoft SpecificConverts a char * value to a BSTR.BSTR __stdcall ConvertStringToBSTR(
       const char* pSrc
    ) throw( _com_error );
    Parameter
    pSrc 
    A char * variable. 
    Example
    // ConvertStringToBSTR.cpp
    #include <comutil.h>
    #include <stdio.h>
    #pragma comment(lib, "comsupp.lib")
    #pragma comment(lib, "kernel32.lib")
    int main()
    {
       char* lpszText = "Test";
       printf("char * text: %s\n", lpszText);
       BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);
       wprintf(L"BSTR text: %s\n", bstrText);
       SysFreeString(bstrText);
    }
    Output
    char * text: Test
    BSTR text: Test
    END Microsoft Specific
      

  5.   

    USES_CONVERSION macro
    包括一系列的转换,如OLE2A等.
    见MSDN.net
      

  6.   

    CString和BSTR相互转换的代码:
    USES_CONVERSION;                    // Not necessary if not use T2OLEBSTR bstrVal;
    CString strVal;strVal = _T("This is CString string.");
    bstrVal = strVal.AllocSysString();  // CString -> BSTRSysFreeString(bstrVal);             // use API to Free BSTR
    bstrVal = SysAllocString(L"This is BSTR string"); // use API to initalize BSTR
    strVal = bstrVal;                   // BSTR -> CString
    SysFreeString(bstrVal);             // use API to Free BSTR使用_bstr_t类处理BSTR;
    _bstr_t bsVal;
    LPCTSTR lpszVal = _T("This is LPCTSTR");
    char* lpChar = "This is char*";bsVal = lpszVal;                    // LPCTSTR -> _bstr_t
    bsVal = lpChar;                     // char* -> _bstr_t
    bsVal = "This is BSTR";             // Directed initalizing _bstr_t
    lpChar = bsVal;                     // _bstr_t -> char*
    lpszVal = bsVal;                    // _bstr_t -> LPCTSTR使用VARIANT:
    VARIANT var;                        //
    VariantInit(&var);                  // Initalize VARIANT

    var.vt = VT_I4;                     // Give long value
    var.lVal = 123456789;
    ...
    VariantClear(&var);                 // Clear VARIANTvar.vt = VT_BSTR;                   // Give BSTR value
    var.bstrVal = SysAllocString(L"This is BSTR used by VARIANT");
    ...
    VariantClear(&var);var.vt = VT_BSTR | VT_BYREF;        // Using reference parameter
    BSTR bstrParam = SysAllocString(L"This is BSTR used by VARIANT");
    var.pbstrVal = &bstrParam;
    ...
    SysFreeString(bstrVal);
    VariantClear(&var);使用_variant_t类:
    _variant_t vt;vt = "Give BSTR value";             // BSTR  -> VAIRNAT (VT_BSTR)
    vt = (short) 12345;                 // short -> VARIANT (VT_I2)
    vt = (long) 12345;                  // long  -> VARIANT (VT_I4)使用VARIANT中的SafeArray:
    _variant_t vt;
    COleSafeArray sa;sa.CreateOneDim(VT_I4, 23);
    for (long lIndex = 0; lIndex < 20; lIndex++)
    {
        // put value
        long lVal = lIndex + 100;
        sa.PutElement(&lIndex, &lVal);
    }for (lIndex = 0; lIndex < 20; lIndex++)
    {
        // get value
        long lVal = -1;
        sa.GetElement(&lIndex, &lVal);
        TRACE1("%d", lVal);
    }
    // copy array data to VARIANT
    vt.vt = VT_ARRAY;
    sa.Copy(&vt.parray);
    ...
    vt.Clear();                         // Not necessary 
      

  7.   

    抱歉,上面的例子中一个关于SafeArray的操作错了,更正如下:
    // copy array data to VARIANT
    vt.vt = VT_ARRAY | sa.vt;
    sa.Copy(&vt.parray);