BSTR, как сделать самостоятельно? - PullRequest
3 голосов
/ 10 августа 2010

Мне нужно связать приложение Linux с сервером, который использует данные BSTR. Могу ли я «свернуть» свой собственный код, чтобы сделать bstr? Я знаю основы bstr, что у него есть заголовок с байтовым размером минус нулевой терминатор, и из-за заголовка он может содержать нули в середине строки и в основном все остальные правила, следующие за bstr.

Я не уверен в порядке следования байтов в заголовке или в более подробных деталях, например, передаю ли я данные, указывая на заголовок, или 5-й байт, как это делает com? Кто-нибудь знает, где я могу получить эту информацию или кто-то написал класс типа BSTR для Linux? Или вообще, где я могу найти информацию о деталях bstr, а не просто общие обзоры, основанные на библиотеках Microsoft?

Спасибо

1 Ответ

4 голосов
/ 10 августа 2010

Это может быть интересно для вас:

Полное руководство Эрика по семантике BSTR

РЕДАКТИРОВАТЬ: Некоторые дополнительные сведения, как это видно из этой статьи:

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это не в моей голове, и мои содержат серьезные ошибки, вплоть до разрушения причинности и конца известной вселенной, но не ограничиваясь ими.

struct BSTR_data {
    short count;
    wchar_t[] data;
};

typedef wchar BSTR;

BSTR * AllocateBSTR(wchar * str) {
    if(str == 0) return 0;

    short len = wstrlen(str);

    BSTR_data * ret = new char[sizeof(short) + (sizeof(wchar_t) + 1) * len];

    ret->count = len;

    memcpy(ret->data, str, sizeof(wchar_t) * 2 * len);

    ret->data[len] = 0;

    return (BSTR *)(ret + sizeof(short));
}

void DeallocateBSTR(BSTR * str) {
    if(str == 0) return;

    BSTR_data * bstr = (BSTR_data*)(str - sizeof(short));

    delete bstr;
}

Это должно дать вамхорошая идея о том, что происходит.Обратите внимание, что если важна перекрестная сопоставимость с Win32, вам нужно использовать SysAllocString и т. Д. Вместо этого кода.

...