2010-08-10 79 views
3

我需要将Linux应用程序连接到使用bstr数据的服务器。我可以“滚动”我自己的代码来制作一个bstr吗?我知道bstr的基础知识,它有一个字节大小减去空终止符的头部,并且由于头部可以在字符串中间包含空值,基本上是bstr后面的所有其他规则。BSTR,如何让你自己做?

我不确定字节排序标题或更私密的细节,如我通过数据指向头或第5字节像COM一样吗?有没有人知道我可以得到这些信息,或者如果有人为linux写了一个bstr类型的类?或者在一般情况下,我可以找到有关bstr细节的信息,而不仅仅是基于Microsoft库的一般概述?

感谢

+0

此[链接显示BSTR长度前缀为4个字节](https://msdn.microsoft.com/en-us/library/windows/desktop/ms221069(v = vs.85).aspx)。我只是看内存而且我认为是真的。 – lsalamon 2015-03-10 17:06:13

回答

4

这可能对你很有意思:

Eric's Complete Guide To BSTR Semantics

编辑:更多的细节,因为那篇文章收集:

免责声明:这关的。上面有我头和我的包含严重的错误,直到但不限于因果关系的破坏和已知宇宙的结束。

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等来代替此代码。

+0

谢谢,其实MSDN上有一篇文章是这个镜像的,不知道是谁抄的。这有帮助,但我仍然需要较低的杠杆细节。 – 2010-08-10 18:05:09

+0

很抱歉,这是msdn上的文章,我今天被烧坏了。 – 2010-08-10 18:08:21

+0

好的,我从某处取出一些代码,并将其添加到我的答案中。但是,如果它是正确的,我不作任何保证。 – 2010-08-10 18:25:13