2010-12-22 97 views
0

我必須將C中的BSTR轉換爲CHAR *數據類型。有沒有辦法在不使用VC++庫或函數的情況下執行此操作。代碼必須在純C中。我認爲'comutil.h'具有函數,但它們是用C++編寫的。將BSTR轉換爲CHAR *和CHAR *爲C中的BSTR

另外,關於SysAllocString函數,我們可以在C中使用它並轉換爲CHAR * ?.請幫忙。

感謝, sveerap

回答

0

這取決於你如何定義 「VC++庫或者功能」。 BSTR類型幾乎是VC++類型。如果你認爲它是一個「Windows」類型,那麼你可以使用「Windows」庫和「Windows」函數中的BSTR操作函數。這一切都取決於你在做什麼,你正在使用什麼編譯器,以及任何其他技術限制。描述爲什麼你不能在問題中使用VC++庫是一個好主意。

事實上,BSTR類型是很好理解和記錄。見here

它不超出可能的範圍,你應該被禁止從使用任何微軟BSTR操作功能,編寫自己的BSTR操作功能的BSTRchar *之間進行轉換的一些原因。

作爲一個便宜而且非常討厭的黑客,我現在已經將一個BSTR轉換爲char *,然後將每個備用字符複製到一個緩衝區或類似的地方。但是這並不能應付特殊字符,而且是非常非常討厭的黑客攻擊。除非你能保證BSTR中的字符都是標準的ASCII字符(或者不關心它們是否是這樣),並且只是作爲一種快速的調試黑客行事,或者只是作爲一種謊言,而不是正確的產品優質的代碼。

+0

感謝您的回覆。我是visual studio 2008,但必須將其編譯爲純c代碼,因爲此代碼必須內置到一個dll中,該dll將與可與c模塊進行通信的舊系統集成在一起 – sveerap 2010-12-22 13:38:09

2

你可以從char *到帶有SysAllocStringByteLen()的BSTR。但是,如果char *僅包含ASCII字符,則不會發生字符轉換。這不會造成問題將是非常罕見的。

下一跳是MultiByteToWideChar(),您通常希望將CodePage參數設置爲CP_ACP,除非您知道該字符串是以另一種方式編碼的。這會產生一個寬字符串,然後您可以傳遞給SysAllocString()來獲取BSTR。

另一種方法是WideCharToMultiByte(),直接傳遞BSTR將工作,除非它包含嵌入的0個字符。無論如何,轉換是有損的,但要注意,當您使用包含重音字符的字符串或其他任何不能在您使用的代碼頁中表示的字符串時,可能會導致相當大的頭痛。

+0

感謝您的迴應。我使用了vC++中提供的comutil.h方法,並在dll中公開了C函數並將它們用作實用程序。它有效,但我不確定它是否是一種有效的方法 – sveerap 2010-12-24 02:02:10