БСТР, как сделать самому?

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

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

Спасибо


person Dixon Steel    schedule 10.08.2010    source источник
comment
Эта ссылка показывает префикс длины BSTR, 4 байта. Я просто смотрю на память, и это правда.   -  person lsalamon    schedule 10.03.2015


Ответы (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 и т. Д. Вместо этого кода.

person Mike Caron    schedule 10.08.2010
comment
Спасибо, на MSDN есть статья, которая отражает это, не знаю, кто кого скопировал. Это помогает, но мне все еще нужны детали нижнего рычага. - person Dixon Steel; 10.08.2010
comment
lol Извините, это та же статья на msdn, сегодня я выгорел. - person Dixon Steel; 10.08.2010
comment
Хорошо, я вытащил код из ниоткуда и добавил его к своему ответу. Однако я не даю никаких гарантий, что это правильно. - person Mike Caron; 10.08.2010
comment
Спасибо, я посмотрю, это деталь, которую я ищу, спасибо! - person Dixon Steel; 10.08.2010
comment
Почему счет короткий? Я думал, заголовок 4 байта? - person Dixon Steel; 10.08.2010
comment
Спасибо, пока кажется, что это работает, мне нужно подождать, пока мой сервер не заработает, чтобы провести настоящий тест, но параллельное тестирование рядом с настоящим BSTR, похоже, работает. - person Dixon Steel; 11.08.2010
comment
Пока это не будет работать в Linux, это будет работать в Windows, но это не то же самое. Для меня wchar будет беззнаковым коротким, но wcslen не будет принимать и беззнаковым коротким, если я конвертирую wchars в этот тип. Я пробовал кучу разных способов, и пока ничего не работает для linux. Кроме того, атрибут L не будет работать при распределении, опять же несоответствие типов, и пока ничего другого для меня не сработает. - person Dixon Steel; 11.08.2010
comment
На самом деле это не сработает и в Windows, так как BSTR должен быть выделен из специальной кучи, но это не имеет отношения к Linux. В любом случае попробуйте изменить wchar на wchar_t. Обычно я об этом не думаю (tchar в Visual Studio - это либо char, либо wchar_t, в зависимости от того, компилируете ли вы юникод или нет) - person Mike Caron; 12.08.2010
comment
Кстати, если у вас все еще есть проблемы, напишите мне по электронной почте, чтобы мы не загромождали Stack Overflow :) Мы разберемся и сообщим здесь. Мой адрес электронной почты myLastName.myFirstName@gmail.com (где замены точно такие же, как и в моем имени пользователя) - person Mike Caron; 12.08.2010
comment
Спасибо, пришлю, я не был здесь несколько дней. Я был завален многими вещами. - person Dixon Steel; 16.08.2010
comment
Спасибо, я вообще-то после этого поста стал в этом знатоком, а теперь все забыл :) - person Dixon Steel; 31.03.2015