Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie Drag&Drop einzelner Anhänge aus Outlook? (https://www.delphipraxis.net/216276-wie-drag-drop-einzelner-anhaenge-aus-outlook.html)

stalkingwolf 3. Dez 2024 07:56

Wie Drag&Drop einzelner Anhänge aus Outlook?
 
Moin,

ich hänge schon seit Ewigkeiten an dem Thema einzelne Dateianhänge aus Outlook per Drag&Drop.
Ganze Emails funktionieren.

Ich habe mich gestern mit ChatGPT dran gesetzt. Mit dem Code bekomme ich auch Filedescription aber nicht den FileContent.
Hat sich jemand damit schon einmal beschäftigt?

Succeeded(DataObj.GetData(FormatEtc, Medium)) gibt immer false zurück

Code:
procedure Tform3.extractOutlookAttachment(DataObj: IDataObject;var FileList: TStringList);
var
  FormatEtc: TFormatEtc;
  Medium: TStgMedium;
  FileDescriptor: PFileGroupDescriptorW;
  I: Integer;
  Stream: IStream;
  FileName: string;
  FileHandle: THandle;
  FileBuffer: array of Byte;
  BytesRead: LongInt;
const
    CFSTR_FILEDESCRIPTOR = 'FileGroupDescriptorW';
    CFSTR_FILECONTENTS = 'FileContents';
    function GetFormatEtc(Format: string): TFormatEtc;
    begin
        Result.cfFormat := RegisterClipboardFormat(PChar(Format));
        Result.ptd := nil;
        Result.dwAspect := DVASPECT_CONTENT;
        Result.lindex := -1;
        Result.tymed := TYMED_HGLOBAL;
    end;
begin
  // 1. Datei-Beschreibung abrufen
  FormatEtc := GetFormatEtc(CFSTR_FILEDESCRIPTOR);
  if Succeeded(DataObj.GetData(FormatEtc, Medium)) then
  try
    FileDescriptor := GlobalLock(Medium.hGlobal);
    try
      for I := 0 to FileDescriptor.cItems - 1 do
      begin
        FileName := GetEnvironmentVariable('TEMP') + '\'+WideCharToString(FileDescriptor.fgd[I].cFileName);
        FileList.add(FileName);
        showmessage(FileName);
        // 2. Datei-Inhalt abrufen
        FormatEtc := GetFormatEtc(CFSTR_FILECONTENTS);
        FormatEtc.lindex := I; // Dateiindex setzen
        if Succeeded(DataObj.GetData(FormatEtc, Medium)) then // Wird nie getriggert
        try
          Stream := IStream(Medium.stm);
          FileHandle := FileCreate(FileName);
          try
            SetLength(FileBuffer, 4096);
            repeat
              Stream.Read(@FileBuffer[0], Length(FileBuffer), @BytesRead);
              FileWrite(FileHandle, FileBuffer[0], BytesRead);
            until BytesRead = 0;
          finally
            FileClose(FileHandle);
          end;
        finally
          ReleaseStgMedium(Medium);
        end;
      end;
    finally
      GlobalUnlock(Medium.hGlobal);
    end;
  finally
    ReleaseStgMedium(Medium);
  end;
end;

jaenicke 3. Dez 2024 08:51

AW: Wie Drag&Drop einzelner Anhänge aus Outlook?
 
Ich glaube, dass du in FormatEtc zu wenige Werte setzt. Ich glaube nach Lektüre der API du müsstest setzen:
cfFormat = CF_HDROP
dwAspect = DVASPECT_CONTENT
tymed = TYMED_HGLOBAL (oder da du einen Stream nutzt wohl TYMED_ISTREAM)

stalkingwolf 3. Dez 2024 10:40

AW: Wie Drag&Drop einzelner Anhänge aus Outlook?
 
Mein Held :-)

tymed = TYMED_ISTREAM war die Lösung.

Vielen Dank.

itsChris 3. Dez 2024 11:39

AW: Wie Drag&Drop einzelner Anhänge aus Outlook?
 
Moin,
ich hätte noch ein paar Anregungen: Die Schleife für
Delphi-Quellcode:
FileDescriptor.cItem
ist meiner Ansicht nicht nötig, da man aus Outlook nur eine Datei per Drag ziehen kann. Außerdem steht
Delphi-Quellcode:
FormatEtc.lindex
nicht für den Dateiindex. Das erneute Setzen nach dem Aufruf von
Delphi-Quellcode:
GetFormatEtc
wird deshalb nicht benötigt.

Redeemer 3. Dez 2024 11:52

AW: Wie Drag&Drop einzelner Anhänge aus Outlook?
 
Ich hab mich das auch gefragt, aber ich benutze die Suite von Anders Melander und Sven Harazim, aber das Ding ist so riesig, dass ich nicht weiß, wo man da was einfügen könnte.

Zitat:

Zitat von itsChris (Beitrag 1543810)
da man aus Outlook nur eine Datei per Drag ziehen kann.

Nein.

sh17 3. Dez 2024 11:54

AW: Wie Drag&Drop einzelner Anhänge aus Outlook?
 
kommt der Code denn mit Win64 Outlook und Win32 Anwendung klar? Da gibts immer mal wieder Probleme in der Drag&Drop Bibliothek.

itsChris 3. Dez 2024 12:20

AW: Wie Drag&Drop einzelner Anhänge aus Outlook?
 
Zitat:

Zitat von Redeemer (Beitrag 1543812)
Zitat:

Zitat von itsChris (Beitrag 1543810)
da man aus Outlook nur eine Datei per Drag ziehen kann.

Nein.

Stimmt sorry, mit STRG kann man mehrere markieren.

stalkingwolf 4. Dez 2024 16:08

AW: Wie Drag&Drop einzelner Anhänge aus Outlook?
 
Zitat:

Zitat von sh17 (Beitrag 1543813)
kommt der Code denn mit Win64 Outlook und Win32 Anwendung klar? Da gibts immer mal wieder Probleme in der Drag&Drop Bibliothek.

Nein. Nur 32 Bit aktuell.

himitsu 4. Dez 2024 18:38

AW: Wie Drag&Drop einzelner Anhänge aus Outlook?
 
Zitat:

Zitat von sh17 (Beitrag 1543813)
kommt der Code denn mit Win64 Outlook und Win32 Anwendung klar? Da gibts immer mal wieder Probleme in der Drag&Drop Bibliothek.

Zitat:

CFSTR_FILEDESCRIPTOR
Und Outlook verwendet aktuell mal wieder Streams, womit das hier auch nicht hilfreich ist.

Die bauen da aber auch gefühlt alle 1-2 Jahre alles komplett um, damit uns nicht langweilig wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz