为方便网友,300分求问com组件的支持参数与mfc的支持的参数相互转换的方法?! 在网上多了,发现很大一部分网友的问题都是关于参数的转换和传入传出的问题。为方便网友,200分求问com组件的支持参数与mfc的支持的参数相互转换的方法?!请给一份详细的总结!这样大家以后都比较清楚! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 除了BSTR和VARIANT型,COM支持的参数其它基本与C所支持的参数完全一样。BSTR的转换最简单的方法,可以使用MFC的CString类,然后再转为其它值。CString::AllocSysString() // CString -> BSTRCString 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函数实现。 dispatchwengqun(≡≡★★郁闷★★≡≡) 你在原理上说的很清楚了,现在谢谢!能不能给一些详细的代码!方便大家查阅! Converts a BSTR value to a char *.char* __stdcall ConvertBSTRToString( BSTR pSrc) throw( _com_error );ParameterpSrc 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;}OutputBSTR text: Testchar * text: TestEND Microsoft SpecificRequirementsHeader: comutil.h. Microsoft SpecificConverts a char * value to a BSTR.BSTR __stdcall ConvertStringToBSTR( const char* pSrc) throw( _com_error );ParameterpSrc 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);}Outputchar * text: TestBSTR text: TestEND Microsoft Specific USES_CONVERSION macro包括一系列的转换,如OLE2A等.见MSDN.net 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 BSTRbstrVal = SysAllocString(L"This is BSTR string"); // use API to initalize BSTRstrVal = bstrVal; // BSTR -> CStringSysFreeString(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_tbsVal = lpChar; // char* -> _bstr_tbsVal = "This is BSTR"; // Directed initalizing _bstr_tlpChar = bsVal; // _bstr_t -> char*lpszVal = bsVal; // _bstr_t -> LPCTSTR使用VARIANT:VARIANT var; //VariantInit(&var); // Initalize VARIANT var.vt = VT_I4; // Give long valuevar.lVal = 123456789;...VariantClear(&var); // Clear VARIANTvar.vt = VT_BSTR; // Give BSTR valuevar.bstrVal = SysAllocString(L"This is BSTR used by VARIANT");...VariantClear(&var);var.vt = VT_BSTR | VT_BYREF; // Using reference parameterBSTR 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 VARIANTvt.vt = VT_ARRAY;sa.Copy(&vt.parray);...vt.Clear(); // Not necessary 抱歉,上面的例子中一个关于SafeArray的操作错了,更正如下:// copy array data to VARIANTvt.vt = VT_ARRAY | sa.vt;sa.Copy(&vt.parray); 请教个问题,VC中怎么用代码实现来设置窗口的Caption属性?请指教!! 指针 高手救命 c++ mssql事务操作 基于listctrl的 treelist(vc/exe)改写为 ACTIVEX 新手问题:mfc 多文档问题 这个问题怎么消除? 怎么样使read-only的EDITBOX能写啊? 求助:Delphi和VC哪个编写可乐吧更合适? 谁知道Grid控件怎么将屏幕上的值传给变量? 如何讓DWORD類型的變量轉換成LPCTSTR類型變量. 请问如何在CListCtrl中实现多个item的拖放,在线等待!急 高精度计时器
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函数实现。
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.
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
包括一系列的转换,如OLE2A等.
见MSDN.net
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
// copy array data to VARIANT
vt.vt = VT_ARRAY | sa.vt;
sa.Copy(&vt.parray);