Проблема с маршалингом BSTR
От: vdoscorp  
Дата: 27.06.11 14:36
Оценка:
Есть 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 приходит пустой.
Не подскажете в чем проблема?
маршалинг bstr com
Re: Проблема с маршалингом BSTR
От: k.o. Россия  
Дата: 27.06.11 15:44
Оценка:
Здравствуйте, vdoscorp, Вы писали:

V>Есть COM-интерфейс ISourceDB


V>IdentificationDB получается на ура. А DataSourse приходит пустой.

V>Не подскажете в чем проблема?

А какой тип у pDB->DBName?
Re[2]: Проблема с маршалингом BSTR
От: vdoscorp  
Дата: 27.06.11 17:08
Оценка:
Здравствуйте, k.o., Вы писали:

KO>Здравствуйте, vdoscorp, Вы писали:


V>>Есть COM-интерфейс ISourceDB


V>>IdentificationDB получается на ура. А DataSourse приходит пустой.

V>>Не подскажете в чем проблема?

KO>А какой тип у pDB->DBName?


TCHAR
Re[3]: Проблема с маршалингом BSTR
От: k.o. Россия  
Дата: 27.06.11 19:17
Оценка:
Здравствуйте, 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 и т.д. и т.п. оставляются читателю, в качестве упражнения.
Re[4]: Проблема с маршалингом BSTR
От: vdoscorp  
Дата: 27.06.11 20:11
Оценка:
Большое спасибо за помощь.
Где об этом можно почитать?
Re[5]: Проблема с маршалингом BSTR
От: Аноним  
Дата: 28.06.11 05:29
Оценка:
Здравствуйте, vdoscorp, Вы писали:

V>Большое спасибо за помощь.

V>Где об этом можно почитать?
В MSDN тип BSTR хорошо описан.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.