3.6k Aufrufe
Gefragt in Anwendungen(Java,C++...) von
Hallo zusammen,

ich habe vor längerem ein Programm geschrieben, dass mir Dateien automatisch kopiert. Das Programm hat die Kopierfunktion von Windows genutzt. Leider geht es nun bei Windows 7 nicht mehr.

Woran könnte das denn liegen?

Gruß knog

6 Antworten

0 Punkte
Beantwortet von marie Experte (2k Punkte)
Ich denke das kann man so nicht sagen, ohne Deinen Code zu kennen und ohne die Stelle, an der es nicht mehr läuft und mit welcher Fehlermeldung es aussteigt. Ich habe mehrere VB6 Programme, die laufen einwandfrei unter Windows 7.

Gruß Marie
0 Punkte
Beantwortet von
naja, das Programm geht auf, man drückt den kopieren knopf und nichts passiert. Der Ordner in den die Daten kopiert werden sollen wird noch erstellt aber dann passiert nix.
Bisher ist dann immer das kopieren Fenster vom XP aufgegangen und die Dateien wurden kopiert.
Es muss ja irgendwie damit zusammenhängen, dass das kopieren bei Win 7 anders funktioniert, oder?

Gruß Knog
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Wenn du von der Win32-Funktion CopyFile() sprichst solltest du natürlich auch prüfen, ob deren Aufruf erfolgreich war. Falls nicht, gibt dir GetLastError() eine weiterführende Fehlernummer zurück. Wenn du hingegen weiter so detaillos bleibst und auch nicht den relevanten Code mal posten willst (der Fehlschläge zu ignorieren scheint) wird das auch weiterhin nichts werden...
0 Punkte
Beantwortet von luke_filewalker Experte (3.3k Punkte)
Ja, ohne weitere Details wird das nur ein rumstochern im Dunkeln. Ab Windows Vista hat sich einiges geändert und es müssen teilweise alternative APIs verwendet werden bzw. anders definiert sein.

Ich habe ebenfalls mehrere VB6 Programme (Freeware) die unter Vista & 7 problemlos laufen. Bei manchen Funktionen mussten allerdings auch erst Anpassungen vorgenommen werden. Mit diesen Anpassungen sind VB6 Programme dann auch unter Windows 7 kein Problem.
0 Punkte
Beantwortet von
so ... jetzt hab ich den Code gefunden, den ich damals eingesetzt hatte:



Const Verschieben = &H1&
Const Kopieren = &H2&
Const Löschen = &H3&

Private Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long
Quelle As String
Ziel As String
DateiFlags As Integer
fAnyOperationsAborted As Long
hNameMappings As Long
lpszProgressTitle As String
End Type

Private Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Declare Function SHFileOperation Lib "Shell32.dll" Alias "SHFileOperationA" (lpFileOp As Any) As Long

Public Function FileOperation(Mode, Source As String, Dest As String, Abfrage, Sichtbar) As Boolean
Dim lenFileop As Long
Dim foBuf() As Byte
Dim fileop As SHFILEOPSTRUCT
lenFileop = LenB(fileop)
ReDim foBuf(1 To lenFileop)
With fileop
.hwnd = Me.hwnd
.wFunc = Mode
.Quelle = Source & vbNullChar & vbNullChar & vbNullChar
.Ziel = Dest & vbNullChar & vbNullChar
If Abfrage = False Then .DateiFlags = &H10&
If Sichtbar = False Then .DateiFlags = .DateiFlags Or &H4&
.DateiFlags = .DateiFlags Or &H40&
End With
Call CopyMemory(foBuf(1), fileop, lenFileop)
Call CopyMemory(foBuf(19), foBuf(21), 12)
FileOperation = SHFileOperation(foBuf(1)) = 0
End Function

Private Sub Command1_Click()
FileOperation Kopieren, "c:\temp", "C:\neutemp", False, True
End Sub

Private Sub Command2_Click()
FileOperation Verschieben, "c:\temp", "C:\neutemp", False, True
End Sub

Private Sub Command3_Click()
FileOperation Löschen, "c:\temp", "", False, True
End Sub

Private Sub Form_Load()
Command1.Caption = "c:\temp nach c:\neutemp kopieren"
Command2.Caption = "c:\temp nach c:\neutemp verschieben"
Command3.Caption = "c:\temp löschen"
End Sub



vielleicht hilft das ja...

Grüße knog
0 Punkte
Beantwortet von luke_filewalker Experte (3.3k Punkte)
Wegen GetLastError: Das ist unter VB keine gute Idee:

Um dieser unter Visual Basic oft fälschlich verwendeten Vorgehensweise gleich einen Riegel vorzuschieben: GetLastError liefert Ihnen unter Visual Basic vielleicht, vielleicht aber auch nicht die korrekte Fehlernummer zurück - diese Funktion ist für Visual Basic Programmierer absolut tabu!


Stattdessen sollte LastDllError eingesetzt werden. Zu diesem Thema gibts zahlreiche Infos im Netz warum das so ist. Unter anderem auch direkt von Microsoft. Von der Seite stammt übrigens das Zitat.

SHFileOperation
Ich habe mit dieser API noch nie gearbeitet, deswegen kann ich zumindest nicht aus dem Stand heraus beantworten warum es nicht geht. Mir fällt nur auf, Du ermittelst als ReturnCode lediglich einen booleschen Wert und damit nur ob es geklappt hat oder nicht. Stattdessen solltest mal den tatsächlichen RC als Long ausgeben lassen um herauszukriegen WARUM es nicht funktioniert.

Eventuell hilft Dir auch dieser vb@archiv Tipp weiter, der diese API verwendet. Entweder Du leitest die dortige Funktionsweise für Deine Routine ab, oder verwendest gleich die fertigen Routinen. Funktionieren sollen diese Funktionen u.a. auch unter Vista, und damit stehen die Chancen sehr gut, dass es auch unter 7 klappt.
...