BSTR, как сделать самостоятельно?

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

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

Спасибо

1 ответ

Решение

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

Полное руководство Эрика по семантике 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 и т. Д. Вместо этого кода.

Другие вопросы по тегам