Есть COM-интерфейс ISourceDB
interface ISourseDB : IUnknown{
[propget, helpstring("Название источника данных"), helpcontext(11)] HRESULT DataSourse([out, retval] BSTR* pVal);
[propput, helpstring("Название источника данных"), helpcontext(11)] HRESULT DataSourse([in] BSTR newVal);
[propget, helpstring("Тип идентифинации"), helpcontext(12)] HRESULT IdentificationDB([out, retval] ULONG* pVal);
[propput, helpstring("Тип идентифинации"), helpcontext(12)] HRESULT IdentificationDB([in] ULONG newVal);
[, helpstring("Обновление данных"), helpcontext(13)] HRESULT Update_Dlg(void);
[, helpstring("Сохранение результата"), helpcontext(14)] HRESULT Resulting(void);
};
Наследует его C# ActiveX компонент
public partial class AcceptedClientsDataGrid : UserControl, ISourseDB
{
#region ISourseDB Members
string ISourseDB.DataSourse
{
get
{
return m_DataSourse;
}
set
{
m_DataSourse = value;
}
}
uint ISourseDB.IdentificationDB
{
get
{
return _IdentificationDB;
}
set
{
_IdentificationDB = value;
}
}
void ISourseDB.Resulting()
{
MessageBox.Show("Resulting stub");
}
void ISourseDB.Update_Dlg()
{
MessageBox.Show("Data Source=" + m_DataSourse + ");
}
}
Вызывает компонент MFC-приложение, которое отдает ему параметры подключения.
Ax.Create(L"", wStyle, rect, this, IDD_MAP);
IUnknown * pUn = Ax.GetControlUnknown();
ISourseDB * pElem = NULL;
pUn->QueryInterface(IID_ISourseDB, (void**)&pElem );
Names_Sourse_DB * pDB =((CMainFrame *)GetParentFrame())->GetSourse_DB();
pElem->put_IdentificationDB(pDB->mType);
pElem->put_DataSourse(pDB->DBName);
pElem->Update_Dlg();
pElem->Release();
IdentificationDB получается на ура. А DataSourse приходит пустой.
Не подскажете в чем проблема?
Здравствуйте, vdoscorp, Вы писали:
V>Здравствуйте, k.o., Вы писали:
KO>>Здравствуйте, vdoscorp, Вы писали:
V>>>Есть COM-интерфейс ISourceDB
V>>>IdentificationDB получается на ура. А DataSourse приходит пустой.
V>>>Не подскажете в чем проблема?
KO>>А какой тип у pDB->DBName?
V>TCHAR
"Я знал, что ты скажешь это."

Вообще, наверно, даже не TCHAR, а TCHAR*? Между BSTR и TCHAR* есть большая разница, дело в том, что для BSTR хранится длина строки, например, для BSTR со значением "test" память будет выглядеть так:
[0x04000000|test\0]
сама переменная при этом будет указывать на начало строки "test", т.е. сразу на область памяти после размера. (хотя, всё это, по идее, implementation defined)
в любом случае, правильный код должен быть таким:
BSTR dbName = SysAllocString(pDB->DBName);
pElem->put_DataSourse(dbName);
SysFreeString(dbName);
Без этого возможны различные спецэффекты, пустой DataSource, пожалуй, самый безобидный результат.
Disclaimer: проверка ошибок, использование _bstr_t/CComBSTR и т.д. и т.п. оставляются читателю, в качестве упражнения.
Большое спасибо за помощь.
Где об этом можно почитать?