Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Скопировать в переменную типа LPBYTE из CString


Автор: AndreySol 23.8.2011, 20:16
в классе CRichEditCtrl есть метод StreamIn, в котором используется CALLBACK-функция. Необходимо считать этим методом данные из CString-переменной в RichEdit.
Примерно так:
Код

CString strTest;

static DWORD CALLBACK REStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CThisClass *pThisClass = (CThisClass*) dwCookie;

//// Здесь надо скопировать в pbBuff содержимое pThisClass -> strTest. КАК ЭТО сделать ? /////////


return 0;
}

void CThisClass::WriteToRE()
{
strTest = _T("Тестовая строка");

EDITSTREAM es = {0};
es.dwCookie = (DWORD) this;
es.pfnCallback = REStreamInCallback;
m_RichEdit.StreamIn(SF_TEXT, es);
}

Автор: Earnest 24.8.2011, 06:58
Цитата(AndreySol @  23.8.2011,  21:16 Найти цитируемый пост)
//// Здесь надо скопировать в pbBuff содержимое pThisClass -> strTest. КАК ЭТО сделать ? 

Например, использовать функцию memcpy.

Автор: AndreySol 24.8.2011, 13:00
А пример кода можно ?

Автор: Earnest 24.8.2011, 14:11
AndreySol, ты же вроде не вчера родился. В MSDN заглянуть лень, чтобы синтаксис посмотреть? Ладно,
memcpy (pDestination, pSource, NumberOfBytes).

Автор: AndreySol 24.8.2011, 23:08
Цитата

AndreySol, ты же вроде не вчера родился. В MSDN заглянуть лень, чтобы синтаксис посмотреть? Ладно, memcpy (pDestination, pSource, NumberOfBytes). 

Я не про синтаксис memcpy спрашивал, а про то как организовать считывание из строки в CALLBACK-функции. Или Вы будете утверждать, что в таком виде CALLBACK-функция прекрасно заработает ?
Код

static DWORD CALLBACK REStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CThisClass *pThisClass = (CThisClass*) dwCookie;

memcpy(...., ...., ....); 

return 0;
}

Автор: volatile 25.8.2011, 01:45
Код

strcpy ( pbBuff, pThisClass->strTest );

 smile 

Автор: Earnest 25.8.2011, 09:16
Цитата(AndreySol @  25.8.2011,  00:08 Найти цитируемый пост)
Или Вы будете утверждать, что в таком виде CALLBACK-функция прекрасно заработает ?

С многоточиями, конечно, нет. Даже не скомпилируется. Но после подстановки параметров, почему бы и нет? Или как у volatile, через strcpy.
 smile 

Только обрати внимание на доп. аргументы CALLBACK'а. Насколько помню, cb - размер буфера (нужно проверить, что он имеет достаточную длину), а в pcb возможно надо записать реальную длину. Уточни в MSDN.

Автор: AndreySol 27.8.2011, 13:36
тут мне на RSDN подсказали такой-вот способ:
Код
static DWORD CALLBACK REStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
    CMemFile *pMemFile = (CMemFile*) dwCookie;

    *pcb = pMemFile->Read(pbBuff,cb);

    return 0;
}

strTest = _T("Тестовая строка");

void CThisClass::WriteToRE()
{

    CMemFile pFile;
    UINT uiBuffSize = 0;
    void* lpszTextIN = (void*)(LPCTSTR)strTest;
    BOOL bUnicode = FALSE;

#ifdef _UNICODE
    bUnicode = TRUE;
#else
    bUnicode = FALSE;
#endif

    UINT uiTextSize = bUnicode ? wcslen((LPCWSTR)lpszTextIN) : strlen((LPCSTR)lpszTextIN);
    uiBuffSize = bUnicode ? uiTextSize*sizeof(WCHAR) : uiTextSize;

    pFile.Attach((unsigned char*)lpszTextIN, uiBuffSize);

    EDITSTREAM es = {0};
    es.dwCookie = (DWORD) &pFile;
    es.pfnCallback = REStreamInCallback;
    m_RichEdit.StreamIn(SF_TEXT, es);

    pFile.Detach();
}

вроде работает. Похоже это наилучший способ ?

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