在VSS硬件框架c ++中将BYTE转换为BSTR

时间:2014-12-09 11:44:56

标签: c++ windows

我需要提交快照方法中的page83信息

在进行vss跟踪时,我得到了驱动器的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转换为任何String类型并传递给REST API

1 个答案:

答案 0 :(得分:1)

BYTE *m_rgbIdentifier;表示m_rgbIdentifierBYTE *不是BYTE

所以它是unsigned char *。简单地说它不是(保证是)空终止,但它的长度在m_cbIdentifier中给出。

如果没有null,你可以转换为普通的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;

然后必须使用SysFreeString释放BSTR。

编辑:

只有当结构中的m_CodeSet具有值VDSStorageIdCodeSetAscii = 2时,此答案才有意义。并且以第一种方式获得的C字符串是纯ANSI字符串。如果需要将其转换为Unicode,则必须使用MultiByteToWideChar。在第二段代码中获得的LPWSTR w是Unicode(wchar_t)C字符串。