混淆了在c++中传递给函数的形参值

Confused the parameters value in passing to function in c++

本文关键字:函数 形参 c++      更新时间:2023-10-16

我有这样的代码:

 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