为方便网友,300分求问com组件的支持参数与mfc的支持的参数相互转换的方法?!

林仪明 2003-02-21 06:04:16
在网上多了,发现很大一部分网友的问题都是关于参数的转换和传入传出的问题。
为方便网友,200分求问com组件的支持参数与mfc的支持的参数相互转换的方法?!
请给一份详细的总结!这样大家以后都比较清楚!
...全文
56 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qsfsea 2003-03-07
  • 打赏
  • 举报
回复
gz
林仪明 2003-02-27
  • 打赏
  • 举报
回复
谢谢大家!
这个帖子,我本来想起个大讨论的,不过看来不是很热闹!
我会在两天内结贴!
两个主要回答者一人100。
coader 2003-02-27
  • 打赏
  • 举报
回复
留名
Login78 2003-02-27
  • 打赏
  • 举报
回复
up
alidiedie 2003-02-26
  • 打赏
  • 举报
回复
真的是太重要了,我就老搞不清楚
dispatchwengqun 2003-02-25
  • 打赏
  • 举报
回复
抱歉,上面的例子中一个关于SafeArray的操作错了,更正如下:
// copy array data to VARIANT
vt.vt = VT_ARRAY | sa.vt;
sa.Copy(&vt.parray);
dispatchwengqun 2003-02-25
  • 打赏
  • 举报
回复
CString和BSTR相互转换的代码:
USES_CONVERSION; // Not necessary if not use T2OLE

BSTR bstrVal;
CString strVal;

strVal = _T("This is CString string.");
bstrVal = strVal.AllocSysString(); // CString -> BSTR

SysFreeString(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 VARIANT

var.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
breezycloud 2003-02-23
  • 打赏
  • 举报
回复
USES_CONVERSION macro
包括一系列的转换,如OLE2A等.
见MSDN.net
dispatchwengqun 2003-02-22
  • 打赏
  • 举报
回复
除了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函数实现。
flyycyu 2003-02-22
  • 打赏
  • 举报
回复
up
林仪明 2003-02-22
  • 打赏
  • 举报
回复
up!
WQ 2003-02-22
  • 打赏
  • 举报
回复
Microsoft Specific

Converts 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

WQ 2003-02-22
  • 打赏
  • 举报
回复
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 Specific

Requirements
Header: comutil.h.

林仪明 2003-02-22
  • 打赏
  • 举报
回复
dispatchwengqun(≡≡★★郁闷★★≡≡) 你在原理上说的很清楚了,现在谢谢!能不能给一些详细的代码!方便大家查阅!
林仪明 2003-02-21
  • 打赏
  • 举报
回复
up!
请大家多多参与啊!

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧