BSTR分配混乱 我试图从C++调用一个C语言库。下面是进行第一次调用的函数: CapsReport::CapsReport(const CCOMString& reportFileName, CCDatabase* pDatabase) : m_pDatabase(pDatabase), m_pReportServer(__uuidof(ReportServer)) { ::CoInitialize(NULL); SetReportName(reportFileName); // public void Load(string DSNname, string userName, string password, string reportFileName) BSTR dsnBstr = pDatabase->DataSource().GetManagedBstr(); BSTR userBstr = pDatabase->UserName().GetManagedBstr(); BSTR passwordBstr = pDatabase->Password().GetManagedBstr(); BSTR reportNameBstr = ::SysAllocString(reportFileName); m_pReportServer->Load(dsnBstr, userBstr, passwordBstr, reportNameBstr); ::SysFreeString(reportNameBstr); }

BSTR分配混乱 我试图从C++调用一个C语言库。下面是进行第一次调用的函数: CapsReport::CapsReport(const CCOMString& reportFileName, CCDatabase* pDatabase) : m_pDatabase(pDatabase), m_pReportServer(__uuidof(ReportServer)) { ::CoInitialize(NULL); SetReportName(reportFileName); // public void Load(string DSNname, string userName, string password, string reportFileName) BSTR dsnBstr = pDatabase->DataSource().GetManagedBstr(); BSTR userBstr = pDatabase->UserName().GetManagedBstr(); BSTR passwordBstr = pDatabase->Password().GetManagedBstr(); BSTR reportNameBstr = ::SysAllocString(reportFileName); m_pReportServer->Load(dsnBstr, userBstr, passwordBstr, reportNameBstr); ::SysFreeString(reportNameBstr); },c++,pointers,com,bstr,C++,Pointers,Com,Bstr,调用Load()方法时,GetManagedBstr()返回的所有三个BSTR都包含密码。我在想原因 DataSource()、UserName()和Password()都返回CCOMString类型的对象: CCOMString UserName() { return m_User; }; CCOMString Password() { return m_Pwd; }; CCOMString DataSource() { return m_DSN; }; 我不想每次想将CCOMString传

调用Load()方法时,GetManagedBstr()返回的所有三个BSTR都包含密码。我在想原因

DataSource()、UserName()和Password()都返回CCOMString类型的对象:

CCOMString UserName() { return m_User; };
CCOMString Password() { return m_Pwd; };
CCOMString DataSource() { return m_DSN; };
我不想每次想将CCOMString传递到C#库时都必须调用::SysAllocString()和::SysFreeString(),因此我向初始化为NULL的CCOMString类添加了一个私有BSTR成员。在析构函数中,我检查该成员是否为null。如果不是,则调用::SysFreeString()并将其设置为NULL

GetManagedBstr()方法使用名为AllocSysString()的CCOMString的现有成员函数。首先,这里是GetManagedBstr():

现在,这里是AllocSysString():

MyPSZString只是CCONString封装的普通普通C++字符串。
BSTR对象是指针。不知何故,所有三个BSTR对象都指向同一个内存位置,即使它们应该来自不同的CCOMString对象。这是怎么发生的?

什么是
m_用户
m_Pwd
m_DSN
?它们是如何构造/初始化的?“MyPSZString只是普通的普通C++字符串”,所以,<代码> STD::String < /代码>?如果是这样的话,
(LPCSTR)mu pszString
就没有意义了。请提供,所以我们不应该猜测任何细节。如果我将Database()、UserName()和Password()的结果存储到CapsReport构造函数中的局部变量中,我没有问题。但是我仍然想知道我的错误在哪里,这样我就不会在其他地方重复了。
CCOMString
destructor是否有可能解除BSTR的分配?谁实际管理由
GetManagedBstr
返回的字符串?我的猜测是,
DataSource()
返回一个临时值,它在分号处被销毁,并将
BSTR
带到坟墓,留下一个悬空指针。从前面的问题来看,您似乎正在使用Visual Studio。为什么不使用_bstr\u t或CComBSTR?此外,在CapsReport()的构造函数中还有CoInitialize()。我可能不会那样做。将其放在程序/线程的开头,并在程序/线程的末尾使用匹配的coninitialize()。什么是
m_User
m_Pwd
m_DSN
?它们是如何构造/初始化的?“MyPSZString只是普通的普通C++字符串”,所以,<代码> STD::String < /代码>?如果是这样的话,
(LPCSTR)mu pszString
就没有意义了。请提供,所以我们不应该猜测任何细节。如果我将Database()、UserName()和Password()的结果存储到CapsReport构造函数中的局部变量中,我没有问题。但是我仍然想知道我的错误在哪里,这样我就不会在其他地方重复了。
CCOMString
destructor是否有可能解除BSTR的分配?谁实际管理由
GetManagedBstr
返回的字符串?我的猜测是,
DataSource()
返回一个临时值,它在分号处被销毁,并将
BSTR
带到坟墓,留下一个悬空指针。从前面的问题来看,您似乎正在使用Visual Studio。为什么不使用_bstr\u t或CComBSTR?此外,在CapsReport()的构造函数中还有CoInitialize()。我可能不会那样做。将其放在程序/线程的开头,并在程序/线程的末尾使用匹配的coninitialize()。
BSTR CCOMString::GetManagedBstr()
{
    m_bstr = AllocSysString();
    return m_bstr;
}
BSTR CCOMString::AllocSysString() const
{

#ifndef _UNICODE
    int nLen = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)m_pszString, GetLength(), NULL, NULL);
    BSTR bstr = ::SysAllocString(NULL, nLen+1);
    MultiByteToWideChar(CP_ACP, 0, (LPCSTR)m_pszString, GetLength(), bstr, nLen);
#else
    int nLen = _tcslen(m_pszString);
    //BSTR bstr = ::SysAllocStringLen(NULL, nLen);
    BSTR bstr = ::SysAllocString(m_pszString);
//  _tcscpy_s(bstr, nLen, m_pszString);
#endif

    return bstr;
}