Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема (с memcpy?) при помещении строки в буфер

23K
21 февраля 2007 года
Seth_a
7 / / 21.02.2007
копирую выбранную строку листбокса по двойному клику в буфер. При добавлении скопированного из буфера получаются иероглифы всякие. копирую английский текст. вот код:

Цитата:
int nIndex = TagListV.GetCurSel();
int nCount = TagListV.GetCount();
int sizeOfString;
CString str, *Copy;
if ((nIndex != CB_ERR) && (nCount > 1))
{
TagListV.GetText(nIndex,str);
sizeOfString = (str.GetLength() + 1);
//открываем буфер, проверка
if (!OpenClipboard())
{
AfxMessageBox(_T("The clipboard is temporarily unavailable"),MB_OK,0);
return;
}
//очищаем буфер, проверка
if (!EmptyClipboard())
{
CloseClipboard();
AfxMessageBox(_T("The clipboard cannot be emptied"),MB_OK,0);
return;
}
//выделяем память для помещения текста
HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE,sizeOfString);
if (!hglbCopy)
{
CloseClipboard();
AfxMessageBox(_T("Memory allocation error"),MB_OK,0);
return;
}
//блокируем выделенный блок памяти, получаем указатель
Copy = (CString *)GlobalLock(hglbCopy);
//копируем
memcpy(Copy,&str,sizeOfString);
//разблокируем
GlobalUnlock(hglbCopy);
//размещаем
if (!SetClipboardData(CF_TEXT, hglbCopy))
{
AfxMessageBox(_T("Error setting clipboard"),MB_OK,0);
}
//закрываем буфер
CloseClipboard();
}



если в строке "memcpy(Copy,&str,sizeOfString);" убираю "&" то в буфер копируется только один символ (первый).

Подскажите, плиз, в чём моя ошибка?

398
21 февраля 2007 года
Alexandoros
630 / / 21.10.2005
На первы взгляд - в том, что CString нельзя так заполнять


 
Код:
//блокируем выделенный блок памяти, получаем указатель
Copy = (CString *)GlobalLock(hglbCopy);
//копируем
memcpy(Copy,&str,sizeOfString);
//разблокируем
GlobalUnlock(hglbCopy);


меняй на

 
Код:
//блокируем выделенный блок памяти, получаем указатель
str = (char *)GlobalLock(hglbCopy);
//разблокируем
GlobalUnlock(hglbCopy);



Кстати вот это - CString *Copy; фигня какато.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cstring.asp - читай отсюда и до понимания различий между char * и CString.
23K
22 февраля 2007 года
Seth_a
7 / / 21.02.2007
Спасибо!
глупость с *Copy понял :)
поменял код, но всё равно в буфере появляется что угодно, кроме того, что надо. вероятно, проблемма ещё и в кодировке.. (при вставке из буфера получаются вопросы...)
подскажите, что можно сделать?
23K
27 февраля 2007 года
Seth_a
7 / / 21.02.2007
всё, разобрался, вот что получилось:
Код:
void CInTouchTagNamesLoaderDlg::OnLbnDblclkTaglist()
{
    int nIndex = TagListV.GetCurSel();
    int nCount = TagListV.GetCount();
    int sizeOfString,n;
    CString str;
    char charstr[100];
    if ((nIndex != CB_ERR) && (nCount > 0))
    {
        n = TagListV.GetTextLen(nIndex);
        TagListV.GetText(nIndex,str.GetBuffer(n));
        str.ReleaseBuffer();
        sizeOfString = (str.GetLength() + 1);
        WideCharToMultiByte( CP_ACP, 0, (CString)str, -1,
                     charstr, sizeOfString, NULL, NULL );
//открываем буфер, проверка
        if (!OpenClipboard())
        {
            AfxMessageBox(_T("The clipboard is temporarily unavailable"),MB_OK,0);
            return;
        }
//очищаем буфер, проверка
        if (!EmptyClipboard())
        {
            CloseClipboard();
            AfxMessageBox(_T("The clipboard cannot be emptied"),MB_OK,0);
            return;
        }
//выделяем память для помещения текста
        HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE,sizeOfString);
        if (!hglbCopy)
        {
            CloseClipboard();
            AfxMessageBox(_T("Memory allocation error"),MB_OK,0);
            return;
        }
//блокируем выделенный блок памяти, получаем указатель
        char *newsym;
        newsym = (char *)GlobalLock(hglbCopy);
        memcpy(newsym,charstr,sizeOfString);
//разблокируем
        GlobalUnlock(hglbCopy);
//размещаем
        if (!SetClipboardData(CF_TEXT, hglbCopy))
        {
            AfxMessageBox(_T("Error setting clipboard"),MB_OK,0);
        }
//закрываем буфер
        CloseClipboard();
    }
}

как всегда всё просто...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог