2014-12-09 30 views
0

BSTR我需要在提交快照方法轉換BYTE在VSS硬件構架C++

雖然現在乾的VSS痕跡,我得到驅動器的page83 page83信息,我需要m_rgbIdentifier

BEGIN VDS_LUN_INFORMATION for \\.\PHYSICALDRIVE1: rgLunInformation[0] 
BEGIN VDS_STORAGE_DEVICE_ID_DESCRIPTOR m_deviceIdDescriptor[0] BEGIN 
VDS_STORAGE_IDENTIFIER m_rgIdentifiers[0,0] m_rgbIdentifier: 

凡m_rgbIdentifier是BYTE

typedef struct _VDS_STORAGE_IDENTIFIER 
    { 
    VDS_STORAGE_IDENTIFIER_CODE_SET m_CodeSet; 
    VDS_STORAGE_IDENTIFIER_TYPE m_Type; 
    ULONG m_cbIdentifier; 
    /* [size_is] */ BYTE *m_rgbIdentifier; 
    } VDS_STORAGE_IDENTIFIER; 

和BYTE

typedef unsigned char BYTE; 

如何將m_rgbIdentifier轉換爲任何字符串類型,並傳遞給REST API

回答

1

BYTE *m_rgbIdentifier;m_rgbIdentifierBYTE *不是​​

所以它是一個unsigned char *。簡單地說它不是(保證是)空終止的,但其長度在m_cbIdentifier中給出。

只要是在它沒有空,你可以轉換是一個普通的C字符串(char *)有:

char * str = new char[m_cbIdentifier + 1]; 
memcpy(str, m_rgbIdentifier, m_cbIdentifier); 
str[m_cbIdentifier] = 0; 

如果你需要真正的BSTR,你應該使用SysAllocString

int len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, m_rgbIdentifier, 
    m_cbIdentifier, NULL, 0); 
LPWSTR w = new WCHAR[len]; 
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, m_rgbIdentifier, 
    m_cbIdentifier, w, len); 
BSTR bstr = SysAllocString(w); 
delete[] w; 

的BSTR必須然後用SysFreeString被釋放。

編輯:

此答案僅具有僅當m_CodeSet在該結構具有值VDSStorageIdCodeSetAscii = 2而在第一方式獲得的C字符串是純ANSI字符串感。如果您需要將其轉換爲Unicode,則必須使用MultiByteToWideChar。在第二片的代碼所獲得的LPWSTR w是Unicode(wchar_t的)C字符串。

+0

第一種方法是不工作....是新的C++, 我試圖 字符*海峽=新的char [rgLunInformation [0] .m_deviceIdDescriptor.m_rgIdentifiers-> m_cbIdentifier + 1]; memcpy(str,rgLunInformation [0] .m_deviceIdDescriptor.m_rgIdentifiers-> m_rgbIdentifier,rgLunInformation [0] .m_deviceIdDescriptor.m_rgIdentifiers-> m_cbIdentifier); \t \t \t STR [rgLunInformation [0] .m_deviceIdDescriptor.m_rgIdentifiers-> m_cbIdentifier] = 0; \t \t \t restClient-> HWProviderlogger(Logger(L「lunserial%S」,NewString(str))); 日誌:lunserial'DD ^大號 – asvignesh 2014-12-11 10:08:22

+1

@Vignesh:見上面我的編輯。 – 2014-12-11 10:55:52