Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2019, 18:51   #1
Maxim_St
Пользователь
 
Регистрация: 10.05.2017
Сообщений: 23
По умолчанию Копирование в буфер обмена Windows "файл(ы)."

Здравствуйте.
Не выходит копирование в буфер. В MSDN толком примеров и описания нет, только если - строка должна заканчиваться "00".
То вылет на free(), то как бы пройдет но вылетает при закрытие программы на DestroyWindow(Wnd);.
А если "удачно" прошло - буфер пуст.

Где ошибка, или все это сплошная ошибка?
сборная с разных форумов.
Код:
void ClipBboard_Copy(HWND Wnd, wchar_t *StrCopy, size_t Len)
{
	//Выделяем память
	size_t MemLen = Len + 2;

	wchar_t *hj = (wchar_t*)malloc(MemLen * sizeof(wchar_t));
	if (hj != NULL)
	{
		wmemcpy_s(hj, MemLen, StrCopy, Len /*+ 1*/);
		hj[MemLen - 2] = 0;
		hj[MemLen - 1] = 0;

		//открываем буфер
		if (!OpenClipboard(Wnd))
			return;
		//очищаем буфер
		EmptyClipboard();

		HGLOBAL  hGlobal = GlobalAlloc(GMEM_SHARE | GMEM_MOVEABLE | GMEM_ZEROINIT,
 sizeof(DROPFILES) + (MemLen * sizeof(wchar_t)));
		if (!hGlobal)
			return;
		//Создаем структуру
		DROPFILES *MyDropFiles = (DROPFILES*)GlobalLock(hGlobal);

		if (MyDropFiles != NULL)
		{
			//запишем данные в память

			MyDropFiles->pFiles = sizeof(DROPFILES);
			MyDropFiles->fWide = TRUE;
			//errno_t iu = wmemmove_s((wchar_t*)(MyDropFiles + sizeof(DROPFILES)), MemLen, hj, MemLen);   //вылет на free()
			//errno_t iu = wmemcpy_s((wchar_t*)MyDropFiles + sizeof(DROPFILES), MemLen, hj, MemLen);   //вылет на free()
			//errno_t iu = memcpy_s((void*)(MyDropFiles + sizeof(DROPFILES)), MemLen * sizeof(wchar_t), hj, MemLen * sizeof(wchar_t));   //вылет на free()
			errno_t iu = memmove_s((void*)(MyDropFiles + sizeof(DROPFILES)), MemLen * sizeof(wchar_t), hj, MemLen * sizeof(wchar_t));

			
			wchar_t *jj = (wchar_t*)(MyDropFiles + sizeof(DROPFILES));

			if (hj != NULL)
			   free(hj);

			GlobalUnlock(hGlobal);

			//записываем данные в буфер
			if (iu == 0)
			{
				if (!SetClipboardData(CF_HDROP, hGlobal))
					return;
			}
		}
		//закрываем буфер
		CloseClipboard();
	}
}

Проверяю буфер(он всегда пуст, если копировать файл(ы) или папки из проводника, то все прекрасно):
Код:
void ClipBboard_Paste(HWND Wnd)
{
	if (IsClipboardFormatAvailable(CF_HDROP))
	{
		if (OpenClipboard(Wnd))
		{
			HGLOBAL  hglb = GetClipboardData(CF_HDROP);
			if (hglb != 0)
			{
				HDROP hDrop = (HDROP)GlobalLock(hglb);
				if (hDrop != NULL)
				{
					UINT Count = DragQueryFileW(hDrop, 0xFFFFFFFF, 0, 0);
					if (Count > 0)
					{	
						int SzWchar = sizeof(wchar_t);

						wchar_t *St = NULL;

						for (UINT Ib = 0; Ib < Count; Ib++)
						{
							UINT Size = DragQueryFileW(hDrop, Ib, 0, 0);
							if (Size > 0)
							{
								Size += 1;
								if (St == NULL)
								{
									St = (wchar_t*)malloc(Size * SzWchar);			
									if (St != NULL)
										St[0] = 0;
								}
								else
								{
									wchar_t *temp = St;
									St = (wchar_t*)realloc(temp, Size * SzWchar);
									if (St != NULL)
									{
										St[0] = 0;
									}
									else
									{
										free(temp);
									}
								}

								UINT ResCountSymb = DragQueryFileW(hDrop, Ib, St, Size);	// получаем непосредственно само имя файла и путь
								if (ResCountSymb > 0)
									MessageBoxW(Wnd, St, L"", 0);
							}
							Sleep(0);
						}
						if (St != NULL)
							free(St);
					}
					GlobalUnlock(hDrop);
				}
			}
		}
		CloseClipboard();
	}
}
Помогите пожалуйста.

PS нифигаСе здесь отступы.
Maxim_St вне форума Ответить с цитированием
Старый 12.09.2019, 20:30   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Maxim_St Посмотреть сообщение
MyDropFiles + sizeof(DROPFILES)
Куда, по-вашему, будет указывать это указатель после сложения и почему?
waleri вне форума Ответить с цитированием
Старый 12.09.2019, 21:02   #3
Maxim_St
Пользователь
 
Регистрация: 10.05.2017
Сообщений: 23
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Куда, по-вашему, будет указывать это указатель
Если я правильно понял из MSDN:
член структуры "pFiles" - Тип: DWORD

Смещение списка файлов с начала этой структуры, в байтах. Сразу за стуктурой.
Или я осел?

Последний раз редактировалось Maxim_St; 12.09.2019 в 21:10.
Maxim_St вне форума Ответить с цитированием
Старый 12.09.2019, 21:52   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Я про pFiles ничего не спрашивал.
Я спрашиваю про выражение MyDropFiles + sizeof(DROPFILES).
Ключевая часть моего вопроса - почему.
waleri вне форума Ответить с цитированием
Старый 12.09.2019, 22:47   #5
Maxim_St
Пользователь
 
Регистрация: 10.05.2017
Сообщений: 23
По умолчанию

waleri ОГРОМНОЕ СПАСИБО.
Работает и с одним и множеством файлов. И в проводник и из него.
Не ругайте сильно, сделал так:
Код:
  LPDROPFILES MyDrop = MyDropFiles;
  ++MyDrop;
Или Нельзя так?

Последний раз редактировалось Maxim_St; 12.09.2019 в 22:56.
Maxim_St вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Экспорт из Excel определенных строк с текстом в ячейках в Word, ошибка "Метод или свойство не допустимы, поскольку буфер обмена пуст или содержит не верные данные" apfu00 Microsoft Office Excel 1 30.07.2019 09:22
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Навеяно предыдущим топиком о Буфере обмена. Можно ли перехватить события "приКопированииВбуфер" и "приВставкеИзБуфера"? DBEER Microsoft Office Word 9 06.03.2016 23:45
Копирование в буфер обмена motorway JavaScript, Ajax 1 10.04.2011 07:36
Копирование в буфер обмена Xanex Общие вопросы Delphi 5 18.05.2009 23:13