//блокируем выделенный блок памяти, получаем указатель
Copy = (CString *)GlobalLock(hglbCopy);
//копируем
memcpy(Copy,&str,sizeOfString);
//разблокируем
GlobalUnlock(hglbCopy);
Проблема (с memcpy?) при помещении строки в буфер
Цитата:
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();
}
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);" убираю "&" то в буфер копируется только один символ (первый).
Подскажите, плиз, в чём моя ошибка?
Код:
меняй на
Код:
//блокируем выделенный блок памяти, получаем указатель
str = (char *)GlobalLock(hglbCopy);
//разблокируем
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.
глупость с *Copy понял :)
поменял код, но всё равно в буфере появляется что угодно, кроме того, что надо. вероятно, проблемма ещё и в кодировке.. (при вставке из буфера получаются вопросы...)
подскажите, что можно сделать?
Код:
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();
}
}
{
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();
}
}
как всегда всё просто...