混淆了在c++中传递给函数的形参值
Confused the parameters value in passing to function in c++
我有这样的代码:
BSTR xmlst1=SysAllocString(L"*****");
BSTR xmlst2=SysAllocString(L"*****");
MakeXML(CMD_CMD,CMD_AUTHENTICATE,&xmlst1);
//should be xmlst1=<CMD>Authen</CMD>
MakeXML(XPassword,Password,(&xmlst2));
//should be xmlst2=<Pass>1234</Pass>
当我用showmessage:
检查结果时ShowMessage(xmlst1);//this is the result <Pass>1234</Pass>
ShowMessage(xmlst2);// strange character.
xmlst2的值在xmlst1中。但是为什么呢?
为什么xmlst2的值是一个奇怪的字符?
更新:
STDMETHODIMP TVinaImpl::MakeXML(BSTR XMLCodec, BSTR XMLVal, BSTR* res)
{
try
{
wcscpy(*res,L"<");wcscat(*res,XMLCodec); wcscat (*res,L">");
wcscat(*res,XMLVal);
wcscat(*res,L"</");wcscat(*res,XMLCodec); wcscat (*res,L">");
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IVina);
}
return S_OK;
}
BSTR
是一只讨厌的野兽。它本质上是一个unicode字符串,带有一个隐藏的前缀,用于生成字符串长度。你的误差在*res = wcs1;
这一行。你不能用这种方式分配BSTR。此外,delete[] wcs1;
也不会有好结果。不要试图删除具有自动存储时间的变量!
最好的选择是使用_bstr_t
类型,它包含用于赋值的重载操作符和用于复制的特定函数。否则使用"较重"的CComBSTR
。见https://msdn.microsoft.com/en-us/library/zthfhkd6.aspx
如果这些对你来说是不可用的,那么你总是可以直接访问字符串API:参见https://msdn.microsoft.com/en-us/library/windows/desktop/ms221105(v=vs.85).aspx
相关文章:
- 使用mem_fun_ref if成员函数需要多个形参
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- 哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
- 包含void*结构的函数的Const正确性和形参
- 将函数形参的实参解包到c++模板类
- c++ const函数形参.有没有一种方法可以只声明函数的单个签名?
- 关于将指向数组的指针作为函数形参的混淆
- 将非const引用使用auto-keyword声明的lambda作为实参传递给std::函数形参类型
- 作为函数形参传递的Vector初始化器列表
- 指向函数形参的指针vs函数形参
- 在模板化类和函数上下文中以默认值作为函数形参的函子:-)
- 带std::函数形参的重载操作符
- 作为Const引用的函数形参
- Const对象作为函数形参
- 函数形参中的指针
- 使用关键字作为C函数形参或c++模板参数
- 在不调用initializer_list构造函数的情况下,将不可复制、不可移动的类型构造为函数形参
- 模板类复制构造函数形参,带或不带模板实参
- c++中函数形参中的右值引用