myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: Windows-Forms » Drag and Drop von Anwendung/Datenbank zu Explorer
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Drag and Drop von Anwendung/Datenbank zu Explorer

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
SimonKnight6600 SimonKnight6600 ist männlich
myCSharp.de-Mitglied

avatar-1433.gif


Dabei seit: 09.03.2005
Beiträge: 709
Entwicklungsumgebung: Microsoft Visual Studio 2008
Herkunft: Österreich


SimonKnight6600 ist offline

Drag and Drop von Anwendung/Datenbank zu Explorer

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen!

Wir möchten in unsere Anwendung Drag and Drop Funktionalitäten einbauen, so dass z.B. eine Datei von unserer Anwendung aus in den Explorer gezogen werden kann und dann dorthin kopiert wird

Das schwierige dabei: Die Datei liegt in einer Datenbank. Es gibt auf Codeproject einen  Artikel dazu, leider hat dieser Probleme mit größeren Dateien. (ab 20Mb) In der MSDN gibt es auch eine Beschreibung der notwendigen  Datenstrukturen, die hat mir aber auch nicht weitergeholfen. Der Inhalt der Datei müsste über ein IStream Interface direkt an den Explorer gestreamt werden...

Viele Grüße,
Simon
14.07.2009 16:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team

avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.397
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

und wo hast du konkret ein problem?
14.07.2009 16:26 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
SimonKnight6600 SimonKnight6600 ist männlich
myCSharp.de-Mitglied

avatar-1433.gif


Dabei seit: 09.03.2005
Beiträge: 709
Entwicklungsumgebung: Microsoft Visual Studio 2008
Herkunft: Österreich

Themenstarter Thema begonnen von SimonKnight6600

SimonKnight6600 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo JAck30lena!

Größere Dateien werden zwar korrekt übertragen, der Windows Explorer regt sich aber auf dass nicht genügend Speicher vorhanden ist. (Ist ein bekanntes Problem des Codes, wird auch bei den Kommentaren unter dem Artikel diskutiert).

Gibt es eventuell eine andere Möglichkeit? Es würde ja auch reichen wenn ich irgendwie an den Pfad komme, in den die Datei hingedroppt wurde.

Viele Grüße,
Simon
14.07.2009 16:36 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team

avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.397
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

die IStream möglichkeit hast du doch schon genannt. warum setzt du diese nciht um?
14.07.2009 17:12 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
SimonKnight6600 SimonKnight6600 ist männlich
myCSharp.de-Mitglied

avatar-1433.gif


Dabei seit: 09.03.2005
Beiträge: 709
Entwicklungsumgebung: Microsoft Visual Studio 2008
Herkunft: Österreich

Themenstarter Thema begonnen von SimonKnight6600

SimonKnight6600 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo JAck30lena!

Weil ich ehrlich gesagt keine Ahnung habe, wie ich dies mit C# realisieren könnte. Ich hatte gehofft, dass jemand damit Erfahrung hat und weiß wie man es implementiert. Gibt es eventuell eine Möglichkeit den Ordner herauszufinden, in in den gedroppt wurde?

Viele Grüße,
Simon
14.07.2009 17:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team

avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.397
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

hier das IStream interface:  http://www.pinvoke.net/default.aspx/Interfaces/IStream.html

das musst du implementieren und diese klasse musst du dann ins clipboard marshallen.

ein beispiel wie das insgesamt geht:  http://blog.madmap.at/2008/09/09/using-d...-c-and-outlook/

(den ole teil kannst du in deinem fall weg lassen, da du nicht mit outlook sondern dem explorer arbeitest)
14.07.2009 17:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JAck30lena JAck30lena ist männlich
myCSharp.de-Team

avatar-2653.jpg


Dabei seit: 01.10.2006
Beiträge: 11.397
Entwicklungsumgebung: Visual Studio 05/08/10 Prof.


JAck30lena ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

ach ja, das framework benutzt auch dieses interface:

public interface IStream


Name: MS.Win32.UnsafeNativeMethods+IStream
Assembly: WindowsBase, Version=3.0.0.0

und nochmals hier:

internal interface IStream


Name: MS.Internal.Interop.IStream
Assembly: PresentationFramework, Version=3.0.0.0

eine .net implementierung findest du hier:

internal class ManagedIStream : IStream


Name: MS.Internal.IO.Packaging.ManagedIStream
Assembly: PresentationFramework, Version=3.0.0.0

da das alles .net 3.0 ist, wirst du dort vielleicht auch eine methode finden, die du ohne großen aufwand auch von außen benutzen kannst.
14.07.2009 17:44 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
SimonKnight6600 SimonKnight6600 ist männlich
myCSharp.de-Mitglied

avatar-1433.gif


Dabei seit: 09.03.2005
Beiträge: 709
Entwicklungsumgebung: Microsoft Visual Studio 2008
Herkunft: Österreich

Themenstarter Thema begonnen von SimonKnight6600

SimonKnight6600 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo JAck30lena!

Danke für deine Mühe. Unter System.Runtime.InteropService.ComTypes gibt es ebenfalls ein IStream Interface, ich hab also die Qual der Wahl Augenzwinkern . Aber mithilfe des Links den du gestern gepostet hast sollte ich's hinkriegen.

Viele Grüße,
Simon
15.07.2009 08:05 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
SimonKnight6600 SimonKnight6600 ist männlich
myCSharp.de-Mitglied

avatar-1433.gif


Dabei seit: 09.03.2005
Beiträge: 709
Entwicklungsumgebung: Microsoft Visual Studio 2008
Herkunft: Österreich

Themenstarter Thema begonnen von SimonKnight6600

SimonKnight6600 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen!

Ich komme momentan nicht weiter, der Explorer stürzt immer nach einigen ComExceptions mit der Fehlermeldung "Ungültige Formattec Struktur" ab. Das Problem liegt in der Methode GetData(ref System.Runtime.InteropServices.ComTypes.FORMATETC formatetc, out System.Runtime.InteropServices.ComTypes.STGMEDIUM medium)
.

Ich hab das Testprojekt angehängt.

C#-Code:
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
void System.Runtime.InteropServices.ComTypes.IDataObject.GetData(ref System.Runtime.InteropServices.ComTypes.FORMATETC formatetc, out System.Runtime.InteropServices.ComTypes.STGMEDIUM medium)
{
    medium = new STGMEDIUM();

    Debug.WriteLine("Format requested: " + DataFormats.GetFormat(formatetc.cfFormat).Name);


    if (DataFormats.GetFormat(formatetc.cfFormat).Name == NativeMethods.ShellClipboardFormats.CFSTR_FILEDESCRIPTORW.Name)
    {
        Debug.WriteLine("---- FileDescriptor wird übergeben");
        MemoryStream fdStream = new MemoryStream();
        fdStream.Write(BitConverter.GetBytes(files.Count), 0, sizeof(UInt32));

        NativeMethods.FILEDESCRIPTORW fd = new NativeMethods.FILEDESCRIPTORW();
        fd.cFileName = files[0].FileName;
        fd.nFileSizeHigh = (UInt32)(files[0].FileSize >> 32);
        fd.nFileSizeLow = (UInt32)(files[0].FileSize & 0xFFFFFFFF);

        Int64 fileWriteTimeUtc = DateTime.Now.ToFileTimeUtc();
        fd.ftLastWriteTime = new NativeMethods.FILETIME();
        fd.ftLastWriteTime.nFileTimeHigh = (uint)(fileWriteTimeUtc >> 32);
        fd.ftLastWriteTime.nFileTimeLow = (uint)(fileWriteTimeUtc & 0xFFFFFFFF);

        // FileDescriptor in Memory Stream schreiben
        int fdSize = Marshal.SizeOf(fd);
        IntPtr fdPtr = Marshal.AllocHGlobal(fdSize);
        Marshal.StructureToPtr(fd, fdPtr, true);
        byte[] fdByteArray = new byte[fdSize];
        Marshal.Copy(fdPtr, fdByteArray, 0, fdSize);
        Marshal.FreeHGlobal(fdPtr);

        fdStream.Write(fdByteArray, 0, fdByteArray.Length);
        SetData(NativeMethods.ShellClipboardFormats.CFSTR_FILEDESCRIPTORW.Name, fdStream);
        return;
    }

    if (IsAllowedTymed(formatetc.tymed))
    {
        if ((formatetc.tymed & TYMED.TYMED_ISTREAM) != TYMED.TYMED_NULL)
        {
            medium.tymed = TYMED.TYMED_HGLOBAL | TYMED.TYMED_ISTREAM;

            if (formatetc.cfFormat == NativeMethods.ShellClipboardFormats.CFSTR_FILECONTENTS.Id)
            {
                if (istream != null)
                {
                    medium.unionmember = pointer;
                }
                else
                {
                    istream = new ComIStreamWrapper(File.Open(files[0].FullPath, FileMode.Open));
                    pointer = Marshal.GetIUnknownForObject(istream);
                    medium.unionmember = pointer;
                }
            }

            try
            {
                ((System.Runtime.InteropServices.ComTypes.IDataObject)this).GetDataHere(ref formatetc, ref medium);
                return;
            }
            catch (Exception exc)
            {
                NativeMethods.GlobalFree(new HandleRef((STGMEDIUM)medium, medium.unionmember));
                medium.unionmember = IntPtr.Zero;
                Debug.WriteLine(exc);
            }
        }
        medium.tymed = formatetc.tymed;
        ((System.Runtime.InteropServices.ComTypes.IDataObject)this).GetDataHere(ref formatetc, ref medium);
    }

}

So wie es scheint gibt es bis jetzt niemanden der das hinbekommen hat. (Zumindest findet sich per Google nichts)

Viele Grüße,
Simon


Dateianhang:
unknown IbfDragDrop.zip (104 KB, 288 mal heruntergeladen)
15.07.2009 12:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
SimonKnight6600 SimonKnight6600 ist männlich
myCSharp.de-Mitglied

avatar-1433.gif


Dabei seit: 09.03.2005
Beiträge: 709
Entwicklungsumgebung: Microsoft Visual Studio 2008
Herkunft: Österreich

Themenstarter Thema begonnen von SimonKnight6600

SimonKnight6600 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

So, bin mittlerweile zu dem Schluss gekommen, dass die IStream Methode mit C# nicht so ohne weiteres möglich ist. Grundsätzlich muss es aber gehen. Nochmal mein Problem: Ich möchte eine Datei per Drag and Drop in ein Explorer Fenster ziehen (geht normal ganz einfach, wenn die Quelldatei irgendwo auf der Festplatte liegt) Die Datei ist aber in einer Datenbank.

2 andere Möglichkeiten:

1) Eine Möglichkeit wäre, dem Explorer den Pfad einer temporären Datei zu geben und beim Einfügen die Datei dorthin zu kopieren, damit sie sich der Explorer von dort holen kann. Allerdings müsste der Explorer warten bis ich mit dem Kopieren fertig bin. (Was er nicht tut, und sich deswegen beschwert dass die Datei in Verwendung ist.) Wie krieg ich den Explorer dazu, zu warten bis ich die Datei in den Temp Ordner kopiert habe?

2) Eventuell ist es auch möglich, den Pfad des Ordners zu bekommen, in den der Benutzer die Datei gedroppt hat. Dann könnte meine Anwendung die Datei auch direkt dorthin schreiben.
16.07.2009 10:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 10 Jahre.
Der letzte Beitrag ist älter als 10 Jahre.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 13.11.2019 04:02