2010-08-10 64 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