Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Аналог CString и GetBuffer() из VC++ в Builder-e


Автор: cyberstream 1.11.2006, 12:45
Код

{
 [color=crimson]CString[/color]    strType, strValue, DisplayName;
 LPTSTR    Buffer;  
 int  BufferSize = MAX_PATH + MAX_DEVICE_ID_LEN; 
 ULONG  BufferLen = BufferSize * sizeof(TCHAR);  
 Buffer  = strValue.[color=crimson]GetBuffer[/color](BufferSize);
....
}

Чем заменить CString и GetBuffer()?
Я пробовал АnsiString и без GetBuffer() - приложение работает  некорректно  smile 


Автор: _hunter 1.11.2006, 14:25
можеш использовать data

Автор: cyberstream 2.11.2006, 10:16
Цитата(_hunter @  1.11.2006,  14:25 Найти цитируемый пост)
можеш использовать data

То есть ???  AnsiString::data ??? И далее ?? А куда лепить GetBuffer() ? Или без GetBuffer() ? Примерчик можно ?


Автор: _hunter 2.11.2006, 11:52
Цитата(cyberstream @  2.11.2006,  10:16 Найти цитируемый пост)
То есть ???  AnsiString::data

да

Цитата(cyberstream @  2.11.2006,  10:16 Найти цитируемый пост)
 А куда лепить GetBuffer()

никуда

Цитата(cyberstream @  2.11.2006,  10:16 Найти цитируемый пост)
Или без GetBuffer() ?

таки да

Цитата(cyberstream @  2.11.2006,  10:16 Найти цитируемый пост)
Примерчик можно ?

примерчик есть в хелпе

Автор: cyberstream 3.11.2006, 12:44
Исходная функция
Код

{
    СString   strType, strValue, DisplayName;
    LPTSTR    Buffer;
    int  BufferSize = MAX_PATH + MAX_DEVICE_ID_LEN;
    ULONG  BufferLen = BufferSize * sizeof(TCHAR);

    Buffer  = (strValue).GetBuffer(BufferSize);
    if (CR_SUCCESS ==
    CM_Get_DevNode_Registry_Property_Ex(DevNode, CM_DRP_FRIENDLYNAME, NULL,
        Buffer, &BufferLen, 0, m_hMachine)
       )
    {   DisplayName = Buffer;    }
    else
    {   BufferLen = BufferSize * sizeof(TCHAR);
        if (CR_SUCCESS ==
        CM_Get_DevNode_Registry_Property_Ex(DevNode, CM_DRP_DEVICEDESC, NULL,
            Buffer, &BufferLen, 0, m_hMachine)
           )
        {   DisplayName = Buffer;   }
    else
    {   DisplayName=("Unknown Device");  }
    }
    return DisplayName;
}


Описание ф-ии в 
Код

DWORD CM_Get_DevNode_Registry_Property_Ex(
             IN  DEVINST    dnDevInst,
             IN  ULONG       ulProperty,
             OUT PULONG   pulRegDataType,   OPTIONAL
             OUT PVOID      Buffer,           OPTIONAL
             IN  OUT PULONG  pulLength,
             IN  ULONG       ulFlags,
             IN  HMACHINE hMachine
             );


Я понимаю, что в Buffer возвращается некое значение и перед вызовом CM_Get_DevNode_Registry_Property_Ex нужно этому Buffer-у чё-нить зарезервировать? 
Что следует писать? Всего лишь подставлять strValue.data() вместо Buffer ? BCB ругается cannot convert 'const void *' to 'void*' 

Автор: cyberstream 10.11.2006, 13:00
В общем, разобрались сами. Жаль только, что было это долго, и не уложились в срок.  А написать требовалось всего-то
Код

     LPTSTR    Buffer;
     Buffer= new char[BufferLen];

А вот как написать используя AnsiString::data - не представляю smile . _hunter , объяснишь мне это языком C++Builder, please ?

Автор: _hunter 10.11.2006, 13:26
простите, но если Вам нужно было то, что вы написали -- я вообще не представляю при чем тут GetBuffer()...

Автор: cyberstream 11.11.2006, 14:59
Насколько я понял, GetBuffer() резервировал память указанной размерности  для указателя Buffer, который передавался в CM_Get_DevNode_Registry_Property_Ex. Если не резервировать ничего или недостаточно - ожидаемого не получим.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)