C++ 在传递给c+中的函数时混淆了参数值+;
我有以下代码:C++ 在传递给c+中的函数时混淆了参数值+;,c++,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=
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>
BSTR xmlst1=SysAllocString(L“****”);
BSTR xmlst2=SysAllocString(L“****”);
MakeXML(CMD\u CMD、CMD\u AUTHENTICATE和xmlst1);
//应该是xmlst1=Authen
MakeXML(XPassword、密码、(&xmlst2));
//应为xmlst2=1234
当我使用showmessage检查结果时:
ShowMessage(xmlst1);//this is the result <Pass>1234</Pass>
ShowMessage(xmlst2);// strange character.
ShowMessage(xmlst1)//这是结果1234
ShowMessage(xmlst2);//奇怪的性格。
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;
}
STDMETHODIMP tvinimpl::MakeXML(BSTR XMLCodec、BSTR XMLVal、BSTR*res)
{
尝试
{
wcscpy(*res,L“”);
wcscat(*res,XMLVal);
wcscat(*res,L“);
}
捕获(例外和e)
{
返回错误(e.Message.c_str(),IID_IVina);
}
返回S_OK;
}
ABSTR
是一头讨厌的野兽。它本质上是一个带有隐藏前缀的unicode字符串,该前缀产生字符串长度。您的错误基本上在*res=wcs1代码>。不能以这种方式分配BSTR。进一步删除[]wcs1代码>也不会有好的结局。不要尝试删除具有自动存储持续时间的变量
最好使用\u bstr\t
类型,该类型包含用于赋值的重载运算符和用于复制的特定函数。否则使用“较重的”CComBSTR
。看
如果您无法使用这些函数,那么您始终可以直接访问字符串API:请参阅,您正在传递的是地址,而不是ny引用。除非您告诉我们什么是MakeXML
,以及您传递给它的变量的值,否则无法回答此问题。您正在对局部变量使用delete[]
。那太糟糕了。只有delete
您的new
。通过执行*res=wcs1
操作,您实际上返回了局部变量的地址。函数一返回,指针就失效了。因此我应该在c++中将wchar\u t
更改为BSTR
,builer不知道哪个仍然错误。如果不能使用\u bstr\t
,则直接使用api。我已经添加了到answser的链接。