AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SHFileOperation abbrechen per Code

Ein Thema von Mattze · begonnen am 30. Jul 2013 · letzter Beitrag vom 18. Jan 2024
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#11

AW: SHFileOperation abbrechen per Code

  Alt 12. Jan 2024, 13:27
MSDN-Library durchsuchenIFileOperation
Die Definition, egal ob altes Delphi, neues Delphi, C++ oder sonstwas.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Bodenseematze

Registriert seit: 10. Jul 2023
50 Beiträge
 
#12

AW: SHFileOperation abbrechen per Code

  Alt 12. Jan 2024, 13:43
MSDN-Library durchsuchenIFileOperation
Die Definition, egal ob altes Delphi, neues Delphi, C++ oder sonstwas.
Wenn ich Deinen Such-Link anklicke kommt "No Results"

Ich finde bei MS das hier: IFileOperation interface (shobjidl_core.h)

Aber wie setze ich das jetzt in Delphi um?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#13

AW: SHFileOperation abbrechen per Code

  Alt 12. Jan 2024, 14:40
Links, siehe "Dokumentation" oder "All" (steht ja netter Weise extra daneben, wo wie viel gefunden wurde)

OK, bei Interfaces ist die Online-Hilfe öfters etwas "unhandlich".
Bei Funktionen sieht es "meistens" besser aus -> oben die C++-Deklaration und unten der DLLName, welches man für ie Übersetzung nach Delphi benötigt.
https://learn.microsoft.com/en-us/wi...fileoperationw

* 2:
Nja, erstmal könnte man sich das Windows-SDK/PSDK runterladen. Dort findet sich für naheu jede WinAPI die passende Header-Datei (mit der C++-Deklaration)

* 1:
Strg+Shift+F
Filter = *.* oder z.B. *.pas;*.dfm;*.inc;*.dpr;*.dpk;*.dproj;*.h;*.c;*.sql;*.txt;*.csv
Verzeichnis = $(BDS) oder $(BDS)\source
oder $(USERPROFILE)\Documents\Embarcadero\Studio\Projekte;$(BDS)\source;$(BDSCatalogRepository);$(BDSCatalogRepositoryAllUsers)
bzw. ...\Studio\Projects für's englische Delphi

und ich hab's so C:\Develop;$(USERPROFILE)\Documents\Embarcadero\Studio\Projekte;$(BDS)\source;$(BDSCatalogRepository);$(BDSCatalogRepositoryAllUsers);\\FranksSpeicher\Files\Develop (Fremdcodes) (inkl. ein paar eigener Verzeichnisse)

* 3:
dann die üblichen Verdächtigen durchsuchen, wie z.B. die JCL

* 4:
Und da Borland/CodeGear/Embarcadero eh nie hinterher kam, die mitgebrachten WinAPI zu aktuell zu halten und zu erweitern ....
Seit Kurzem verwenden sie ein Projekt von Microsoft, womit man große Teile der WinAPI automatisch in andere Sprachen übersetzen kann.
https://learn.microsoft.com/de-de/uw...ef/winmd-files
siehe GetIt Windows API from WinMD
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Bodenseematze

Registriert seit: 10. Jul 2023
50 Beiträge
 
#14

AW: SHFileOperation abbrechen per Code

  Alt 16. Jan 2024, 07:47
OK, bei Interfaces ist die Online-Hilfe öfters etwas "unhandlich".
Und genau für die (COM basierten) Interfaces verstehe ich die Umsetzung nach Delphi nicht.

Bei Funktionen sieht es "meistens" besser aus
"normale" Funktionen umzusetzen und anzusprechen ist kein Problem.
Aber wie gesagt - irgendwie funktioniert das bei ActiveX / COM basierten Schnittstellen ja anders...
(...und ich bin zu doof, das zu verstehen )

* 2:
Nja, erstmal könnte man sich das Windows-SDK/PSDK runterladen. Dort findet sich für naheu jede WinAPI die passende Header-Datei (mit der C++-Deklaration)
Ja, das bringt mich aber nicht wirklich weiter...

* 1:
Strg+Shift+F
Filter = *.* oder z.B. *.pas;*.dfm;*.inc;*.dpr;*.dpk;*.dproj;*.h;*.c;*.sql;*.txt;*.csv
Verzeichnis = $(BDS) oder $(BDS)\source
oder $(USERPROFILE)\Documents\Embarcadero\Studio\Projekte;$(BDS)\source;$(BDSCatalogRepository);$(BDSCatalogRepositoryAllUsers)
bzw. ...\Studio\Projects für's englische Delphi
Du meinst damit, dass ich in meinem bevorzugten Editor bzw. im Windows Explorer suchen soll?!
Habe ich natürlich gemacht - aber in meinen Verzeichnissen wurde das nirgends gefunden (wie gesagt: Delphi 7!)


Auch im JEDI-Projekt nicht (auch nicht im JEDI API-Projekt).

* 4:
Und da Borland/CodeGear/Embarcadero eh nie hinterher kam, die mitgebrachten WinAPI zu aktuell zu halten und zu erweitern ....
Seit Kurzem verwenden sie ein Projekt von Microsoft, womit man große Teile der WinAPI automatisch in andere Sprachen übersetzen kann.
https://learn.microsoft.com/de-de/uw...ef/winmd-files
siehe GetIt Windows API from WinMD
Das hört sich interessant an - aber auch da habe ich nichts gefunden, was mir das irgendwie in Delphi übersetzt.
Das einzige, was ich diesbezüglich gefunden habe, ist der Delphi WinMD Parser
Den bekomme ich aber nicht mit meinem Delphi 7 übersetzt - und vom Quellcode her bringt es mich leider auch nicht wirklich weiter.

Wie gesagt, vielleicht bin ich einfach zu blöd dafür und ich hatte gehofft, dass schon jemand vor mir die IFileOperation-Verwendung für D7 gekapselt hat; aber scheinbar nicht
  Mit Zitat antworten Zitat
Bodenseematze

Registriert seit: 10. Jul 2023
50 Beiträge
 
#15

AW: SHFileOperation abbrechen per Code

  Alt 16. Jan 2024, 08:34
Wenn ich mir jetzt bei Microsoft die Beschreibung anschaue:
IFileOperation::CopyItem method (shobjidl_core.h)
Da finde ich dann unten ein C++ Beispiel für die Benutzung - das müsste ich ja in Delphi umsetzen...

d.h. ich benötige zuerst
CoInitializeEx - verfügbar in der ComObj-Unit, dann
CoCreateInstance - verfügbar ebenfall in der ComObj-Unit; oder ich verwende direkt CreateComObject aus der selben Unit...
Für den CoCreateInstance-Aufruf - oder für den Cast (?) des IUnknown-Objektes, das bei CreateComObject zurück kommt) benötige ich eine Pascal Definition der IFileOperation-Schnittstelle, weil ich diese ja zurück bekomme (IFileOperation *pfo im C++ Beispiel, verwendet über das Makro IID_PPV_ARGS()):
Code:
extern "C++"
{
    template<typename T> _Post_equal_to_(pp) _Post_satisfies_(return == pp) void** IID_PPV_ARGS_Helper(T** pp);
}

#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)
(wie soll ich denn das umsetzen?)

In C++ ist das Interface IFileOperation so definiert:
Code:
IFileOperation : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE Advise( 
            /* [in] */ __RPC__in_opt IFileOperationProgressSink *pfops,
            /* [out] */ __RPC__out DWORD *pdwCookie) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE Unadvise( 
            /* [in] */ DWORD dwCookie) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE SetOperationFlags( 
            /* [in] */ DWORD dwOperationFlags) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE SetProgressMessage( 
            /* [string][in] */ __RPC__in_string LPCWSTR pszMessage) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE SetProgressDialog( 
            /* [in] */ __RPC__in_opt IOperationsProgressDialog *popd) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE SetProperties( 
            /* [in] */ __RPC__in_opt IPropertyChangeArray *pproparray) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE SetOwnerWindow( 
            /* [in] */ __RPC__in HWND hwndOwner) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE ApplyPropertiesToItem( 
            /* [in] */ __RPC__in_opt IShellItem *psiItem) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE ApplyPropertiesToItems( 
            /* [in] */ __RPC__in_opt IUnknown *punkItems) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE RenameItem( 
            /* [in] */ __RPC__in_opt IShellItem *psiItem,
            /* [string][in] */ __RPC__in_string LPCWSTR pszNewName,
            /* [unique][in] */ __RPC__in_opt IFileOperationProgressSink *pfopsItem) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE RenameItems( 
            /* [in] */ __RPC__in_opt IUnknown *pUnkItems,
            /* [string][in] */ __RPC__in_string LPCWSTR pszNewName) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE MoveItem( 
            /* [in] */ __RPC__in_opt IShellItem *psiItem,
            /* [in] */ __RPC__in_opt IShellItem *psiDestinationFolder,
            /* [string][unique][in] */ __RPC__in_opt_string LPCWSTR pszNewName,
            /* [unique][in] */ __RPC__in_opt IFileOperationProgressSink *pfopsItem) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE MoveItems( 
            /* [in] */ __RPC__in_opt IUnknown *punkItems,
            /* [in] */ __RPC__in_opt IShellItem *psiDestinationFolder) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE CopyItem( 
            /* [in] */ __RPC__in_opt IShellItem *psiItem,
            /* [in] */ __RPC__in_opt IShellItem *psiDestinationFolder,
            /* [string][unique][in] */ __RPC__in_opt_string LPCWSTR pszCopyName,
            /* [unique][in] */ __RPC__in_opt IFileOperationProgressSink *pfopsItem) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE CopyItems( 
            /* [in] */ __RPC__in_opt IUnknown *punkItems,
            /* [in] */ __RPC__in_opt IShellItem *psiDestinationFolder) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE DeleteItem( 
            /* [in] */ __RPC__in_opt IShellItem *psiItem,
            /* [unique][in] */ __RPC__in_opt IFileOperationProgressSink *pfopsItem) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE DeleteItems( 
            /* [in] */ __RPC__in_opt IUnknown *punkItems) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE NewItem( 
            /* [in] */ __RPC__in_opt IShellItem *psiDestinationFolder,
            /* [in] */ DWORD dwFileAttributes,
            /* [string][in] */ __RPC__in_string LPCWSTR pszName,
            /* [string][unique][in] */ __RPC__in_opt_string LPCWSTR pszTemplateName,
            /* [unique][in] */ __RPC__in_opt IFileOperationProgressSink *pfopsItem) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE PerformOperations( void) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE GetAnyOperationsAborted( 
            /* [out] */ __RPC__out BOOL *pfAnyOperationsAborted) = 0;
       
    };
Dafür brauche ich dann wieder eine Definition von IShellItem, das ich leider auch nicht in meinen Delphi-Quellen als Umsetzung finde;
Hier die C++-Definition:
Code:
    IShellItem : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE BindToHandler( 
            /* [unique][in] */ __RPC__in_opt IBindCtx *pbc,
            /* [in] */ __RPC__in REFGUID bhid,
            /* [in] */ __RPC__in REFIID riid,
            /* [iid_is][out] */ __RPC__deref_out_opt void **ppv) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE GetParent( 
            /* [out] */ __RPC__deref_out_opt IShellItem **ppsi) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE GetDisplayName( 
            /* [in] */ SIGDN sigdnName,
            /* [annotation][string][out] */ 
            _Outptr_result_nullonfailure_  LPWSTR *ppszName) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE GetAttributes( 
            /* [in] */ SFGAOF sfgaoMask,
            /* [out] */ __RPC__out SFGAOF *psfgaoAttribs) = 0;
       
        virtual HRESULT STDMETHODCALLTYPE Compare( 
            /* [in] */ __RPC__in_opt IShellItem *psi,
            /* [in] */ SICHINTF hint,
            /* [out] */ __RPC__out int *piOrder) = 0;
       
    };
Uff - und wenn ich da in der Definition irgendwas nicht korrekt umsetze, wird's beim Aufruf wahrscheinlich einfach "knallen" und ich weiß nicht warum...

Mal schauen, wie /ob ich damit weiter komme...

Geändert von Bodenseematze (16. Jan 2024 um 08:38 Uhr) Grund: IID_PPV_ARGS-Code hinzugefügt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#16

AW: SHFileOperation abbrechen per Code

  Alt 16. Jan 2024, 09:01
Jupp, ich hab z.B. auf dem NAS ein Verzeichnis mit Fremdprojekten, u.A. welche von Microsoft (Downlaods oder z.B. aus GitHub)
Dann eben die beiden CatalogRepository-Verzeichnisse vom Delphi, dessen Quellcode-Verzeichnisse, meine Quellcodeverzeichnisse usw.

Wie gesagt, schon kann man im Delphi, oder mit einem externen Tool, schön darin suchen
Dann kann man auch den Suchbegriff im Internet wuchen (eventuell noch zwei " drumrum und womöglich noch Delphi davor schreiben)

und findet z.B.
C:\Program Files (x86)\Embarcadero\Studio\23.0\source\rtl\win\Winapi.ShlObj.pas (witzig, wie ein etwas aktuelleres Delphi hilfreich sein kann)
oder
C:\Users\%username%\Documents\Embarcadero\Studio\23.0\CatalogRepository\WindowsAPIfromWinMD-1.0\Windows.UI.Shell.pas
Delphi-Quellcode:
  ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nn-shobjidl_core-ifileoperation</summary>
  ///<remarks>
  ///<para>Supported since: <i>windows6.0.6000</i></para>
  ///</remarks>
  IFileOperation = interface(IUnknown)
  ['{947AAB5F-0A5C-4C13-B4D6-4BF7836FC9F8}']
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-advise</summary>
    function Advise(pfops: IFileOperationProgressSink; out pdwCookie: Cardinal): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-unadvise</summary>
    function Unadvise(dwCookie: Cardinal): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-setoperationflags</summary>
    function SetOperationFlags(dwOperationFlags: Cardinal): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-setprogressmessage</summary>
    function SetProgressMessage(pszMessage: PWSTR): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-setprogressdialog</summary>
    function SetProgressDialog(popd: IOperationsProgressDialog): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-setproperties</summary>
    function SetProperties(pproparray: IPropertyChangeArray): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-setownerwindow</summary>
    function SetOwnerWindow(hwndOwner: HWND): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-applypropertiestoitem</summary>
    function ApplyPropertiesToItem(psiItem: IShellItem): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-applypropertiestoitems</summary>
    function ApplyPropertiesToItems(punkItems: IUnknown): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-renameitem</summary>
    function RenameItem(psiItem: IShellItem; pszNewName: PWSTR; pfopsItem: IFileOperationProgressSink): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-renameitems</summary>
    function RenameItems(pUnkItems: IUnknown; pszNewName: PWSTR): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-moveitem</summary>
    function MoveItem(psiItem: IShellItem; psiDestinationFolder: IShellItem; pszNewName: PWSTR; pfopsItem: IFileOperationProgressSink): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-moveitems</summary>
    function MoveItems(punkItems: IUnknown; psiDestinationFolder: IShellItem): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-copyitem</summary>
    function CopyItem(psiItem: IShellItem; psiDestinationFolder: IShellItem; pszCopyName: PWSTR; pfopsItem: IFileOperationProgressSink): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-copyitems</summary>
    function CopyItems(punkItems: IUnknown; psiDestinationFolder: IShellItem): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-deleteitem</summary>
    function DeleteItem(psiItem: IShellItem; pfopsItem: IFileOperationProgressSink): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-deleteitems</summary>
    function DeleteItems(punkItems: IUnknown): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-newitem</summary>
    function NewItem(psiDestinationFolder: IShellItem; dwFileAttributes: Cardinal; pszName: PWSTR; pszTemplateName: PWSTR; pfopsItem: IFileOperationProgressSink): HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-performoperations</summary>
    function PerformOperations: HRESULT; stdcall;
    ///<summary>Documentation: https://docs.microsoft.com/windows/win32/api/shobjidl_core/nf-shobjidl_core-ifileoperation-getanyoperationsaborted</summary>
    function GetAnyOperationsAborted(out pfAnyOperationsAborted: BOOL): HRESULT; stdcall;
  end;
oder
https://github.com/CMCHTPC/WindowsAP...2.ShObjIdl.pas
uvm.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (16. Jan 2024 um 09:13 Uhr)
  Mit Zitat antworten Zitat
Bodenseematze

Registriert seit: 10. Jul 2023
50 Beiträge
 
#17

AW: SHFileOperation abbrechen per Code

  Alt 18. Jan 2024, 15:36
Dann kann man auch den Suchbegriff im Internet wuchen (eventuell noch zwei " drumrum und womöglich noch Delphi davor schreiben)

und findet z.B.
C:\Program Files (x86)\Embarcadero\Studio\23.0\source\rtl\win\Winapi.ShlObj.pas (witzig, wie ein etwas aktuelleres Delphi hilfreich sein kann)
Tja, ich habe aber leider keine Quellen aus einem aktuelleren Delphi zur Verfügung.


Wie ich schon geschrieben hatte, ich glaube ich bin zu doof dafür - ich hatte da bei meiner Internetsuche leider nichts vernünftiges gefunden.
Auf jeden Fall ist der von Dir gepostete Link auf das GitHub-Projekt Gold wert. Danke!

Da ist alles drin, was das Herz begehrt - ist zwar für FPC/Lazarus geschrieben und sehr verteilt / umfangreich, aber die Umsetzung auf D7 und die Ausdünnung auf meinen Anwendungsfall bekomme ich noch hin

Ist zwar mit den vielen Interfaces und Typen immer noch eine Menge (Fleiss-)Arbeit - aber ich denke, da bin ich jetzt schon auf einem guten Weg, das zu implementieren...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz