uses Windows, ShlObj, ComObj, ActiveX;
function SHBindToObject(const psf: IShellFolder; pidl: PItemIDList;
const pbc: IBindCtx; const riid: TIID; var ppv: Pointer): HResult; stdcall; external 'shell32' name 'SHBindToObject';
procedure CopyFilesToClipboard2(const Folder: widestring; FileNames: TStrings);
var
SF: IShellFolder;
PidlFolder: PItemIDList;
PidlChildren: array of PItemIDList;
Eaten: UINT;
Attrs: DWORD;
Obj: IDataObject;
I: Integer;
Filename: widestring;
begin
if (Folder = '') or (FileNames = nil) or (FileNames.Count = 0) then Exit;
OleCheck(SHParseDisplayName(PWideChar(Folder), nil, PidlFolder, 0, @Attrs));
try
OleCheck(SHBindToObject(nil, PidlFolder, nil, IShellFolder, Pointer(SF)));
finally
CoTaskMemFree(PidlFolder);
end;
SetLength(PidlChildren, FileNames.Count);
for I := Low(PidlChildren) to High(PidlChildren) do
PidlChildren[i] := nil;
try
for I := 0 to FileNames.Count-1 do
begin
Filename := Filenames[i];
OleCheck(SF.ParseDisplayName(0, nil, PWideChar(FileName), Eaten, PidlChildren[i], Attrs));
end;
OleCheck(SF.GetUIObjectOf(0, FileNames.Count, PIdlChildren[0], IDataObject, nil, obj));
finally
for I := Low(PidlChildren) to High(PidlChildren) do
begin
if PidlChildren[i] <> nil then
CoTaskMemFree(PidlChildren[i]);
end;
end;
OleCheck(OleSetClipboard(obj));
OleCheck(OleFlushClipboard);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
FileNames: TStringList;
begin
FileNames := TStringList.Create;
try
FileNames.Add('file1.jpg');
CopyFilesToClipboard2('C:\Your_directory_with_the_files', FileNames);
finally
FileNames.Free;
end;
end;