Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30

Копирование списка файлов в буфер обмена

16.11.2012, 03:05. Показов 2967. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Долго мучал пример на делфях, но так и нечего не вышло.
Собственно непонятно как это должно правильно выглядеть.

Рабочий оригинал
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
unit CopyFilesToClipboard2;
 
interface
  uses Windows, SysUtils,Classes, AnsiStrings, ShlObj, ClipBrd, ActiveX;
 
  procedure CopyFilesToClipboardEx(const AFiles: TStrings; MoveFiles: Boolean = false);
 
implementation
//-------------------------------------------------------------------------------
procedure CopyFilesToClipboardEx(const AFiles: TStrings; MoveFiles: Boolean = false);
var
 DropFiles: PDropFiles;
 hGlobal: THandle;
 iLen: Integer;
 f: Cardinal;
 d: PCardinal;
 FileList: string;
begin
 Clipboard.Open;
 
 FileList := StringReplace(AFiles.Text, #13#10, #0, [rfReplaceAll]);
 FileList := trim(FileList) + #0#0;
 iLen := Length(FileList) * SizeOf(char);
 hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT, SizeOf(TDropFiles) + iLen);
 Win32Check(hGlobal <> 0);
 DropFiles := GlobalLock(hGlobal);
 DropFiles^.pFiles := SizeOf(TDropFiles);
 
 {$IFDEF UNICODE}
  DropFiles^.fWide := true;
 {$ENDIF}
 
 Move(FileList[1], (PansiChar(DropFiles) + SizeOf(TDropFiles))^, iLen);
 SetClipboardData(CF_HDROP, hGlobal);
 GlobalUnlock(hGlobal);
 
 if MoveFiles then
   begin
     f := RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);
     hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT, sizeof(dword));
     d := PCardinal(GlobalLock(hGlobal));
     d^ := DROPEFFECT_MOVE;
     SetClipboardData(f, hGlobal);
     GlobalUnlock(hGlobal);
   end;
 
 Clipboard.Close;
end;
//-------------------------------------------------------------------------------
end.
То что намучал :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//---------------------------------------------------------------------------
#include <Clipbrd.hpp>
#include <Shlobj.h>
 
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
//---------------------------------------------------------------------------
bool CopyFilesToClipboard(const vector<string>& files,bool moved)
{
    if(!OpenClipboard(0)) return false;  //очищаем буфер
    EmptyClipboard();
 
    vector<char> data;
 
    vector<string>::const_iterator first= files.begin();
    for(; first!=files.end(); ++first)
     {
        copy(first->begin(),first->end(), back_inserter(data));
        data.push_back('\0');
     }
    data.push_back('\0');
 
     //Выделяем память
    HGLOBAL  hGlobal = GlobalAlloc(GMEM_SHARE|GMEM_MOVEABLE|GMEM_ZEROINIT,
                                                                                        sizeof(DROPFILES) + data.size() );
    if (!hGlobal) return false;
 
    DROPFILES *DF = (DROPFILES*)GlobalLock(hGlobal); //Создаем структуру
    DF->fWide= false;
        //записываем данные в структур
    size_t offset = DF->pFiles = sizeof(DROPFILES);
 
     memcpy( DF + offset, &data[0], data.size() *sizeof(char) );
 
    if (!SetClipboardData(CF_HDROP, hGlobal)) return false;  //записываем данные в буфер
    GlobalUnlock(hGlobal);
 
    if(moved)
        {
            Cardinal cf;
            Cardinal* d;
 
            cf = RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);
 
            hGlobal = GlobalAlloc(GMEM_SHARE | GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(DWORD));
 
            d = (Cardinal*)GlobalLock(hGlobal);
            *d = DROPEFFECT_MOVE;
 
            if (!SetClipboardData(cf, hGlobal)) return false;
            GlobalUnlock(hGlobal);
        }
 
    CloseClipboard(); //закрываем буфер
    return true;
}
//---------------------------------------------------------------------------
В общем не копирует и ошибки памяти...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.11.2012, 03:05
Ответы с готовыми решениями:

Memo - работа со строками и копирование в буфер обмена
Приветствую всех. Написал простенькое прикладное приложение, которое обрамляет строку еще двумя. Результат работы на экране вот такой: ...

Копирование файлов в буфер обмена
Можно ли реализовать с помощь Qt копирование файлов в буфер обмена? (По списоку путей к файлам ) Или только через WinApi ...

Копирование текста в буфер обмена
Всем привет, скажите пожалуста, как можна скопировать в буфер обмена определённый текст ?

2
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
16.11.2012, 06:11
Копируем список файлов в буфер Windows
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    #define NO_WIN32_LEAN_AND_MEAN
    #include <vector>
    #include <string>
    using namespace std;
     
    bool CopyFilesToClipboard(vector <string> &ListFile)
    {
       vector<string>::iterator It;
       //открываем буфер
       if(!OpenClipboard(Application->Handle)) return false;
       //очищаем буфер
       EmptyClipboard();
       //Определяем размер
       int SizeLine(1);
       for (It=ListFile.begin();It!=ListFile.end();++It)
          SizeLine+=(*It).length()+1;
       //Выделяем память
       HGLOBAL  hGlobal = GlobalAlloc(GMEM_SHARE|GMEM_MOVEABLE|GMEM_ZEROINIT,
                                                sizeof(DROPFILES) + SizeLine);
       if (!hGlobal) return false;
       //Создаем структуру
       DROPFILES *MyDropFiles = (DROPFILES*)GlobalLock(hGlobal);
       //записываем данные в структуру
       SizeLine = MyDropFiles->pFiles = sizeof(DROPFILES);
       for (It=ListFile.begin();It!=ListFile.end();++It)
       {
          strcpy((char*)MyDropFiles + SizeLine, (*It).c_str());
          SizeLine+=(*It).length()+1;
       }
       GlobalUnlock(hGlobal);
       //записываем данные в буфер
       if (!SetClipboardData(CF_HDROP, hGlobal)) return false;
       //закрываем буфер
       CloseClipboard();
       return true;
    }
Пример использования:
C++
1
2
3
4
5
6
vector <string> ListFile;
ListFile.push_back("C:\\Boot.ini");
ListFile.push_back("C:\\NTDETECT.COM");
ListFile.push_back("C:\\MSDOS.SYS");
ListFile.push_back("C:\\AUTOEXEC.BAT");
CopyFilesToClipboard(ListFile);
не моё, не проверял
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.11.2012, 07:31  [ТС]
Походу проблема была в строке

C++
1
memcpy( (char*)DF+offset, &data[0],  data.size() *sizeof(char)  );
Только чет не соображу зачем приводить DF к (char*)

Добавлено через 2 минуты
Блин тупнул...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.11.2012, 07:31
Помогаю со студенческими работами здесь

Копирование массива char в буфер обмена компьютера
Здравствуйте. Нужно, чтобы программа могла скопировать какой-либо массив char или string в буфер обмена компьютера и уже после завершения...

Копирование папок, файлов, используя буфер обмена
Доброго времени суток! подскажите есть ли в С# какой-то метод для копирование файло, папок, между разделами диска, по сети, используя буфер...

Копирование в буфер обмена части имени файлов (Total Commander)
Здравствуйте, в Total Commander есть инструмент копирования имён выделенных файлов в буфер. Возможно ли посредством скриптов или...

Копирование текста в буфер обмена
Блин, после замены клипбордовых процедур с апишных на джаву на некоторых машинах (там кстати 8.5 стоит) нотес стал крошиться с ошибкой ...

Копирование из ListBox в буфер обмена
Доброго всем времени суток!Пожалуйста подскажите или ткните носом.Не могу разобраться с копированием содержимого List в буфер обмена.У меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru