1、通过 HRESULT;COM 的标准不允许跨越组件的异常;参考 MAKE_HRESULT 宏;
2、在用法上 BSTR 和 LPOLESTR 一样;参看http://www.devx.com/free/archives/default.asp?pubid=9
3、不知道,没查过,能用就行。
2、在用法上 BSTR 和 LPOLESTR 一样;参看http://www.devx.com/free/archives/default.asp?pubid=9
3、不知道,没查过,能用就行。
BSTR bs;
_bstr_t bt;
LPOLESTR lpos;
bs = L"song";
bt = bs;
lpos = bt.copy();S_OK定义在:winerror.h中。
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之类应该就不会太难了。关于BSTR和OLESTR
可以继续查看MSDN,回答满意吗,欢迎交流,如果那位
路过的高手发现了我的错误,也请一定指出,以免错误
流传,成为我的过错,谢谢。
对了,songyl:
bt.copy是返回BSTR,我如果想把BSTR内容拷贝到LPOLESTR指针上了呢?CComBSTR类与_bstr_t在使用上有何区别?,它放在MSDN哪里?,每次都要用查指,我想看所有的_bstr_t之类的帮助。
再问1:我在方法中调用WIN API,如果API产生错误,我在程序中是不是需要把错误取出来,再通过COM传给客户,还是在程序中直接返回,客户端会自动去取?对了,《Inside COM》中是使用SupportErrorInfo等,我该如何用呢?
char* pStr;
pStr = (char*)m_bstrA;
1.在COM中有一个方法中,如何某处出错,程序中如何返回错误告诉客户端?
2.不用_bstr_t与CComBSTR类的话,如何把BSTR拷贝到OLECHAR *上::
char* pStr;
pStr = (char*)m_bstrA;这样对吗?
3.在我在COM中使用IDD_IEncrypt,这个在哪里写义,是啥?GUID?
2.BSTR 被定义为 OLECHAR*; OLECHAR被定义为WCHAR;WCHAR被定义为wchar_t;所以请用
wcscpy
3.IDD_IEncrypt没听说过.
4.FormatMessage有两个版本FormatMessageA,FormatMessageW.如果你定义了_UNICODE,那
返回的就是UNICODE
问题1:我希望我的ASP组件给错的话,可以让VB或ASP网页检测到,就像VB那样能检测到ADO的COM组件的错误一样,使用属性VB知道吗?
问题2:BSTR在书上说的是一种VB的字符串,应该不是OLECHAR*,它与C的字符串是有点不同,它是由两部分组成,有一个头,记录这个字符串的数量,第二部分是与C的字符串是一样的。
问题3:IDD_IEncrypt是输错了,应为IID_IEncrypt,我的组件名是Encrypt.
问题4:在MSDN找不到FormatMessagW的定义呀!
2 如果是copy,用wstrcpy就可以。
如果BSTR中包含L'\0',可以用wstrncpy,BSTR的长度通过SysStringLen获得。
1.在COM中有一个方法中,如何某处出错,程序中如何返回错误告诉客户端?
2.在我在COM中使用IDD_IEncrypt,这个在哪里写义,是啥?GUID?
3.在COM中调用WIN API,产生错误,使用FormatMessage()返回字符是Ansi还是UNICODE,也就是说所有WIN API调用有返回字符串的字符串是ANSI还是UNICODE?
ICreateErrorInfo *pErrorInfo;
pErrorInfo->SetGUID(IID_IEncrypt);
pErrorInfo->SetSource(L"ASPEncrypt.Encrypt");
pErrorInfo->SetDescription(szErrorText);
IErrorInfo *pErrInfo;
pErrorInfo->QueryInterface(IID_IEncrypt,(void**)&pErrInfo);
SetErrorInfo(::GetLastError(),pErrInfo);//其中第一个参数在Client能得到吗?,放到哪里好呢?
pErrInfo->Release();
pErrorInfo->Release();
return E_ABORT;//该处该返回啥值比较好!
BSTR bstr;
LPCSTR lpStr;
USES_CONVERTION; //表明要使用字符转换功能的宏
lpStr = A2T(bstr); //好象是这样,A和T分别代表不同的字符串类型
对于1,不太明白问题问的是什么,呵呵
对于2,IID_IEncrypt就是你的接口别称,最好也看看DirectX的编程(里面要大量应用COM接口)
对于3,我想返回的是UNICODE,因为在COM中用的都是UNICODE
应该是 lpStr = OLE2A(bstr) 或 lpStr = W2A(bstr)
A=ANSI, T=TCHAR, W=wide char(wchar_t), OLE=OLECHARto vcmfc:
可以使用异常处理
http://expert.csdn.net/TopicView.asp?id=46400 标题:COM高手位!,请你们顺手帮俺解决几个小问题呀!
http://expert.csdn.net/TopicView.asp?id=46567 标题:凡是跟COM沾边的都来看一看。