Seite 1 von 1

Problem mit CLICK! 2.03

Verfasst: Di, 21. Okt 2014 10:32
von Thomas Frank
Hallo,

ich versuche gerade CLICK! zum Laufen zu bringen.

Leider erhalten ich einen Fehle:

Code: Alles auswählen

Xbase++ Version     : Xbase++ (R) Version 1.90.355
Betriebssystem      : Windows Vista 06.01 Build 07601 Service Pack 1
-----------------------------------------------------------------------
oError:args         :
          -> VALTYPE: C VALUE:  ▬\»×╚☺
          -> VALTYPE: D VALUE: 19800101
oError:canDefault   : N
oError:canRetry     : N
oError:canSubstitute: J
oError:cargo        : NIL
oError:description  : Parameter hat falschen Typ
oError:filename     :
oError:genCode      :          2
oError:operation    : < ▬\»×╚☺> - <19800101>
oError:osCode       :          0
oError:severity     :          2
oError:subCode      :          3
oError:subSystem    : BASE
oError:thread       :          1
oError:tries        :          0
-----------------------------------------------------------------------
CALLSTACK:
-----------------------------------------------------------------------
Aufgerufen von TD2JUL(48)
Aufgerufen von MAIN(450)
 
Anhand der Fehler habe ich mich zur Funktion GetFileTime(cFile) in xbase.prg durchgehangelt.

Code: Alles auswählen

FUNCTION GetFileTime(cFile)
LOCAL cCreation := SPACE(8), cAccess := SPACE(8), cWrite := SPACE(8)
LOCAL nKernel32Dll:=DllLoad("Kernel32.dll")
LOCAL nH := FOPEN(cFile, FO_READ+FO_SHARED )
LOCAL aTime := {}


   If nKernel32Dll > 0 .AND. nH # -1
      IF DllCall(nKernel32Dll, DLL_STDCALL, 'GetFileTime', nH, @cCreation, @cAccess, @cWrite) # 0
         AADD( aTime, cCreation )
         AADD( aTime, cAccess   )
         AADD( aTime, cWrite    )
        
      ENDIF
      DllUnload(nKernel32Dll)
   EndIf

   IF nH # -1
      FCLOSE(nH)
   ENDIF


Return aTime
Für mich sieht es so aus, als ob die Funktion einen falschen Wert (C VALUE: ▬\»×╚☺) anstelle eines Datums liefert.

Könnte das evtl. mit dem verwendeten Windows 7 64 Bit zusammen hängen?

Habe leider momentan keinen Plan, deswegen bitte ich Euch um Unterstützung.
Danke

Gruß aus Hessen
Frank

Re: Problem mit CLICK! 2.03

Verfasst: Di, 21. Okt 2014 10:40
von Werner_Bayern
Servus Frank,

kenne zwar beide Funktionen nicht, aber lt. Quellcode liefert Dein GetFileTime ein Array zurück, kein Datum.

Was ist click!?

Re: Problem mit CLICK! 2.03

Verfasst: Di, 21. Okt 2014 10:51
von brandelh
CLICK kenne ich auch nicht, aber MSDN FileTime liefert ZEIGER (pointer) auf Strukturen des Typs FILETIME, das kann man nicht einfach als Datum setzen.
lpCreationTime [out, optional]
A pointer to a FILETIME structure to receive the date and time the file or directory was created. This parameter can be NULL if the application does not require this information.
viel einfacher wäre es die Xbase++ Funktion Directory() - Dateiverzeichnis in Array einlesen zu benutzen,
diese stellt alle Infos als Xbase Werte zur Verfügung. Außerdem ändert sie nicht den Wert für den letzten Zugriff ;-)

Oder du siehst dich mal bei Pablo um (http://www.xbwin.com) da gibt es einige Funktionen zu FileTime ... mit Xbase 2.00 liefert FileTime64() allerdings aktuell nicht zurück.

Re: Problem mit CLICK! 2.03

Verfasst: Di, 21. Okt 2014 12:07
von Thomas Frank
Hallo,

CLICK! ist ein Source-Code-Formatierer, ähnlich Snap für Clipper. Scheint wohl keiner zu verwenden?
siehe http://www.xbaseforum.de/viewtopic.php?f=24&t=1609

Das da ein Array zurückkommt ist mir klar. Die Werte in dem Array müßten jedoch Ziffern in einem Charfeld sein, damit sie zu einem Datum werterverarbeitet werden können.

Das Problem ist wohl die Funktion DllCall() die hier nicht das Richtige zurückgibt.

Gibt es evtl. einen alternaitiven Source-Code-Formatierer, möglichst Freeware?

Gruß
Frank

Re: Problem mit CLICK! 2.03

Verfasst: Di, 21. Okt 2014 14:48
von brandelh
Thomas Frank hat geschrieben:Die Werte in dem Array müßten jedoch Ziffern in einem Charfeld sein, damit sie zu einem Datum werterverarbeitet werden können.
Ich meine auch mal gesehen zu haben, dass ein Dateizugriffsdatum aus chr(Jahr)+chr(Monat)+(tag) ... gespeichert wurde, das entspricht aber nicht mehr dem aktuellen Windowsstand.

GetFileTime() füllt Parameter vom Typ FILETIME und diese müssen zu einer 64Bit QUAD zusammengebaut werden (die es in Xbase selbst nicht gibt).
In einer solchen FileTime 64 bit QUAD sind die vergangenen Sekunden seit 01.01.1601 in der Auflösung 100 Nano Sekunden gespeichert.
Für die Umrechnung braucht man mehrere API Funktionen, der Quellcode ist an dieser Stelle also völlig unbrauchbar geworden !

:arrow: http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Kann aber leicht mit DIRECTORY() verbessert werden. So werden alle nötigen Werte als Xbase++ Datentyp geliefert.

Hier ein Beispiel das Infos einer Datei abfragt:

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Inkey.ch"
#include "directry.ch"


procedure main
   local aFiles, cMaske, nAnz, x

   cMaske := "Drucktest.pdf" // Dateiname

   aFiles := directory(cMaske)
   nAnz   := len(aFiles)

   for x := 1 to nAnz
       ? padr(aFiles[x,F_NAME],20),transform(aFiles[x,F_SIZE],"999,999,999,999"),"Byte"
       ? "Write:  ",aFiles[x,F_WRITE_DATE],   aFiles[x,F_WRITE_TIME]
       ? "Create: ",aFiles[x,F_CREATION_DATE],aFiles[x,F_CREATION_TIME]
       ? "Access: ",aFiles[x,F_ACCESS_DATE],  aFiles[x,F_ACCESS_TIME]
       ?
       inkey(5)
   next
   inkey(10)
return
PS: Xbase 1.90.355 bzw. die neu 2.00 haben enorm an Funktionen zugelegt,
neuerdings sind auch immer die XbToolsIII dabei, da kann und sollte man wenn
möglich auf API Funktionen verzichten.

Re: Problem mit CLICK! 2.03

Verfasst: Di, 21. Okt 2014 22:55
von AUGE_OHR
Thomas Frank hat geschrieben:ich versuche gerade CLICK! zum Laufen zu bringen.

Anhand der Fehler habe ich mich zur Funktion GetFileTime(cFile) in xbase.prg durchgehangelt.

Code: Alles auswählen

FUNCTION GetFileTime(cFile)
LOCAL cCreation := SPACE(8), cAccess := SPACE(8), cWrite := SPACE(8)
LOCAL nKernel32Dll:=DllLoad("Kernel32.dll")
LOCAL nH := FOPEN(cFile, FO_READ+FO_SHARED )
LOCAL aTime := {}

   If nKernel32Dll > 0 .AND. nH # -1
      IF DllCall(nKernel32Dll, DLL_STDCALL, 'GetFileTime', nH, @cCreation, @cAccess, @cWrite) # 0
         AADD( aTime, cCreation )
         AADD( aTime, cAccess   )
         AADD( aTime, cWrite    )
      ENDIF
      DllUnload(nKernel32Dll)
   EndIf

   IF nH # -1
      FCLOSE(nH)
   ENDIF

Return aTime
Für mich sieht es so aus, als ob die Funktion einen falschen Wert (C VALUE: ▬\»×╚☺) anstelle eines Datums liefert.

Könnte das evtl. mit dem verwendeten Windows 7 64 Bit zusammen hängen?
das sieht nach meinem Code aus ... und ich habe doch Click ständig im Gebrauch ...

Ich habe mir das nun angesehen und muss bestätigen das es "so" nicht mehr läuft ... aber irgendwie lief es vorher und mein Click.EXE läuft doch ...
egal, ich habe gerade vor paar Tagen eine Lösung gepostet .

Code: Alles auswählen

// in GetFileTime() erweitern

         AADD( aTime, FTtoST(cCreation) )
         AADD( aTime, FTtoST(cAccess  ) )
         AADD( aTime, FTtoST(cWrite   ) )



// wandelt FileTime nach SystemTime um
FUNCTION FTtoST(cFileTime, lDay, lConvert)
LOCAL cConvertTime:=Space(16), cDate, dDate

  DEFAULT lDay TO .F., lConvert TO .T.

  /* Convert Time */
  IF DllCall("Kernel32.dll",DLL_STDCALL,"FileTimeToSystemTime", cFileTime, @cConvertTime)==0
    RETURN ""
  ENDIF
  IF lConvert==.F.
    RETURN cConvertTime
  ENDIF

  cDate:=Padl(LTrim(Str(Bin2w(SubStr(cConvertTime,1,2)))),4,"0")+;
         Padl(LTrim(Str(Bin2w(SubStr(cConvertTime,3,2)))),2,"0")+;
         Padl(LTrim(Str(Bin2w(SubStr(cConvertTime,7,2)))),2,"0")
  dDate:=StoD(cDate)
  cDate:=DtoC(dDate)

RETURN IF(lDay,CdoW(dDate)+" ","")+cDate+" "+;
   Padl(LTrim(Str(Bin2w(SubStr(cConvertTime, 9,2)))),2,"0")+":"+;
   Padl(LTrim(Str(Bin2w(SubStr(cConvertTime,11,2)))),2,"0")+":"+;
   Padl(LTrim(Str(Bin2w(SubStr(cConvertTime,13,2)))),2,"0")+":"+;
   Padl(LTrim(Str(Bin2w(SubStr(cConvertTime,15,2)))),2,"0")
und damit läuft es wieder.

Der Grund warum ich FileTime() geschrieben habe war das ich die Tools Function FileTime() ersetzen wollte die Click benutzt.

Re: Problem mit CLICK! 2.03

Verfasst: Mi, 22. Okt 2014 7:18
von brandelh
und warum nimmst du nicht einfach die Funktion directory() ?
Alles was man in Xbase++ als PRG codiert, muss Alaska bei Updates verbessern,
API Funktionen muss man selbst verbessern ;-)

Re: Problem mit CLICK! 2.03

Verfasst: Do, 23. Okt 2014 0:32
von AUGE_OHR
brandelh hat geschrieben:und warum nimmst du nicht einfach die Funktion directory() ?
wie schon gesagt suchte ich eine Ersatz für die Tools Function FileTime() welche ich "so" schon hatte ... also habe ich die genommen.