COM
是一種跨編程語言的平臺,需要提供語言無關的數據類型。多數編程語言有自己的字符串表示。
-
C++
字符串是以
0
結束的
ASCII
或
Unicode
字符數組
-
Visual Basic
字符串是一個
ASCII
字符數組加上表示長度的前綴。
-
Java
字符串是以
0
結束的
Unicode
字符數組。
需要定義一種通用的字符串類型,可以很容易的匹配到不同編程語言。在
C++
中,就是
BSTR
。
"
Basic STRing
"
的簡稱,微軟在
COM/OLE
中定義的標準字符串數據類型。對于
C++
,
Windows
頭文件
wtypes.h
中定義如下:
typedef wchar_t WCHAR;
typedef WCHAR OLECHAR;
typedef OLECHAR __RPC_FAR *BSTR;;
在
COM
中,字符用
16-bit OLECHAR
表示,這樣使
COM
可以支持各種
code pages
,包括
Unicode
。對于
windows
系統,可以簡單理解為
OLECHAR
使用的就是
Unicode
。
OLECHAR
串與單字節字符串很類似,是一個以
null
結尾的
buffer
。唯一的區別是每個字符占兩個字節,而不是一個
?
?0 1?2 3?4 5 6 7 8 9 0 1
| H | E | L | L | O | \0|
?^
?OLCHAR
?
?
Figure 1. Format of an OLECHAR string.
?
使用以
Null
結尾的簡單字符串在
COM component
間傳遞不太方便。因此,標準
BSTR
是一個有長度前綴和
null
結束符的
OLECHAR
數組。
BSTR
的前
4
字節是一個表示字符串長度的前綴。
BSTR
長度域的值是字符串的字節數,并且不包括
0
結束符。由于是
Unicode
串,所以字符數是字節數的一半。這種方式的優點是允許程序員在
BSTR
串中間嵌入
NULL
字符。但是,
BSTR
的前四個字節表示長度,而
OLECHAR
數組的前四字節表示前兩個字符。這種情況下,對于
C++
程序,如何實現
BSTR
和
OLECHAR
的交換?答案是
COM
提供了兩個
BSTR
分配用的
API
:
SysAllocString / SysReallocString
。函數返回的指針指向
BSTR
的第一個字符,而不是
BSTR
在內存的第一個字節。
?0 1?2 3?4 5 6 7 8 9 0 1 2 3 4 5
0a000000 |?H | E | L | L | O | \0|
???????? ^
?????????BSTR
?
Figure 2. ?Format of a BSTR.
?
下面是
SysAllocString
和
SysFreeString
的偽代碼。
?
BSTR SimpleSysAllocString( const OLECHAR *?sz)
{
?? ?if ( sz == NULL) return NULL;
???
??? BYTE* buf = new BYTE[sizeof(INT32) + (wcslen(sz)+1)*sizeof(OLECHAR) ];
???
??? if(buf == NULL)
??? {
??????? return NULL;
??? }
??? else
??? {
??????? INT32 len = wcslen(sz) * sizeof(OLECHAR);
??????? *((INT32*) buf) = len;
??????? wcscpy( (WCHAR*)(buf+sizeof(INT32)), sz);
??????? return (BSTR)(buf+sizeof(INT32));
??? }
}
?
?
VOID SimpleSysFreeString( BSTR?bstr)
{
??? if(bstr != NULL)
??? {
?????? BYTE* start = (BYTE*)bstr - sizeof(INT32);
?????? delete []start;
??? }
}
?
from:http://blog.csdn.net/pkrobbie/archive/2007/01.aspx
posted on 2007-01-26 16:14
我風 閱讀(1124)
評論(0) 編輯 收藏 引用