BSTR,如何制作自己的BSTR?

3
我需要将一个Linux应用程序与使用bstr数据的服务器进行接口对接。我能否自己编写代码来生成一个bstr?我知道bstr的基本知识,它具有带有字节大小减去空终止符的头部,并且由于头部的存在,它可以在字符串中间包含null字符,以及其它所有遵循bstr规则的条款。
我不确定头部的字节顺序或更详细的信息,例如是否像com一样传递指向头部或第5个字节的数据?是否有人知道我可以在哪里获取此信息,或者是否有人为Linux编写了bstr类型类?或者通常在哪里可以找到关于bstr详细信息的资料,而不仅仅是基于Microsoft libs的概述?
谢谢。

这个链接显示BSTR长度前缀为4个字节。我刚查看了内存,确实如此。 - lsalamon
1个回答

4

这可能对您有趣:

Eric的完整指南: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等而不是此代码。

谢谢,实际上 MSDN 上有一篇文章与此相同,不知道是谁抄袭了谁。这很有帮助,但我仍需要更低层的细节。 - Dixon Steel
抱歉,今天我精疲力尽了,这篇文章和 MSDN 上的一模一样。 - Dixon Steel
实际上,在Windows中也不会起作用,因为必须从特殊堆中分配BSTR,但在Linux上这无关紧要。无论如何,尝试将'wchar'更改为'wchar_t'。我通常不考虑这个(在Visual Studio中,'tchar'是'char'或'wchar_t',具体取决于您是否正在编译unicode)。 - Mike Caron
顺便说一下,如果你还有问题,请给我发电子邮件,这样我们就可以停止在 Stack Overflow 上混乱了 :) 我们会解决它,并在这里报告。我的电子邮件是"myLastName.myFirstName@gmail.com"(其中替换与我的用户名中完全相同)。 - Mike Caron
谢谢,实际上在这篇文章之后我成为了一个专家,但现在我已经把它全部忘记了 :) - Dixon Steel
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接