Kampi4
03-02-06, 11:07
So guten Tag erst mal,
habe ein Problem in VARPG.
Und zwar will ich aus einer txt Datei, die auf meiner Festplatte liegt den Inhalt auslesen und dann in ein Mehrzeiliges Eingabefeld laden.
Dazu benutze ich APIs aus der kernel32.dll.
Das Problem ist nun, daß das "CreateFile" und das "CloseFile" funktioniert, nur das "ReadFile" funktioniert nicht.
Im Debugger sieht das folgerndermaßen aus:
Nach "CreateFile" - "BRC" = 272
Nach "GetLastError" - "Error" = 0
Nach "ReadFile" - "RET2" = 0 ---> wenns funzt müsste es 1 sein
Nach "GetLastError" - "Error" = 6 ---> heisst das der Handle falsch ist
und "OVERLAP" ist 259 ---> warum auch immer
Nach "CloseFile" - "RET3" = 1 ---> hat also funktioniert
Was ich jetzt nicht verstehe ist, das er den Handle beim "ReadFile" nicht annehmen will, direkt danach den gleichen Handle beim "CloseFile" aber akzeptiert.
Das gleiche Problem habe ich wenn ich einen Com-Port öffne, da funzt auch alles, sogar ein "WriteFile", nur das "ReadFile" nicht.
Das komische ist auch, das beides schon mal so funktioniert hat. Aber als ich dann mein Programm erweitert habe, mit Sachen die eigentlich nichts damit zu tun haben, hat es auf einmal nicht mehr funktioniert.
Kann es was geben, was dem ins Gehege kommt, obwohl es eigentlich nichts damit zu tun hat?!?
Hier noch Quellcode-Auszüge (wollte nicht allen reinpacken, da das Programm knappe 4000 Zeilen hat):
D CRTFILE PR 10U 0 ExtProc('CreateFileA')
D DLL('Kernel32.dll')
D Linkage(*StdCall)
D * VALUE OPTIONS(*STRING)
D 10I 0 Value
D 10I 0 Value
D $SEC LIKE(secattr)
D 10I 0 Value
D 10I 0 Value
D 10I 0 Value
D GETLASTERROR PR 10U 0 EXTProc('GetLastError')
D DLL('Kernel32.dll')
D Linkage(*StdCall)
D READFILE PR 10U 0 ExtProc('ReadFile')
D DLL('Kernel32.dll')
D Linkage(*StdCall)
D 10I 0 Value
D * VALUE OPTIONS(*STRING)
D 10I 0 Value
D $WRITE LIKE(WRITE)
D $OVER LIKE(OVERLAP)
D CLOSEFILE PR 10U 0 ExtProc('CloseHandle')
D DLL('Kernel32.dll')
D Linkage(*StdCall)
D 10I 0 Value
D secattr DS
D LENGTH 10I 0 INZ(80)
D SECDESC 10I 0 INZ(0)
D BOOL 10I 0 INZ(0)
D name S 10A
D access S 10U 0 INZ(3221225472)
D share S 10U 0 INZ(0)
D create S 10I 0 INZ(3)
D attr S 10U 0 INZ(128)
D template S 10I 0 INZ(0)
DBRC S 10U 0
DRET S 10U 0
DRET2 S 10U 0
DRET3 S 10U 0
DRET4 S 10U 0
DWRITE S 10U 0
DOVERLAP S 10U 0
DENT1 S 10A
DENT2 S 18A
DENT3 S 350A
DENT4 S 18A
DENT5 S 2000A
DENTERR S 80A
DaENT1 S * inz(%addr(ENT1))
DaENT2 S * inz(%addr(ENT2))
DaENT3 S * inz(%addr(ENT3))
DaENT4 S * inz(%addr(ENT4))
DaENT5 S * inz(%addr(ENT5))
DaENTERR S * inz(%addr(ENTERR)
EVAL ENT4 = 'c:\rdc\hilfe_1.txt' + X'00'
C*
C EVAL BRC = CRTFILE(aENT4:ACCESS:share:
C secattr:create:attr:template)
C*
C EVAL error = getlasterror
C*
C EVAL length = 2000
C EVAL RET2 = READFILE(BRC:aENT5:Length:WRITE
C :OVERLAP)
C EVAL error = getlasterror
C*
C EVAL RET3 = Closefile(brc)
Ich hoffe ihr könnt mir weiterhelfen, weil es das letzte ist, was der Vollendung des Programms im Wege steht.
Schon mal vielen Dank für eure Mühen und allen ein schönes WE!
Mfg KAMPI
habe ein Problem in VARPG.
Und zwar will ich aus einer txt Datei, die auf meiner Festplatte liegt den Inhalt auslesen und dann in ein Mehrzeiliges Eingabefeld laden.
Dazu benutze ich APIs aus der kernel32.dll.
Das Problem ist nun, daß das "CreateFile" und das "CloseFile" funktioniert, nur das "ReadFile" funktioniert nicht.
Im Debugger sieht das folgerndermaßen aus:
Nach "CreateFile" - "BRC" = 272
Nach "GetLastError" - "Error" = 0
Nach "ReadFile" - "RET2" = 0 ---> wenns funzt müsste es 1 sein
Nach "GetLastError" - "Error" = 6 ---> heisst das der Handle falsch ist
und "OVERLAP" ist 259 ---> warum auch immer
Nach "CloseFile" - "RET3" = 1 ---> hat also funktioniert
Was ich jetzt nicht verstehe ist, das er den Handle beim "ReadFile" nicht annehmen will, direkt danach den gleichen Handle beim "CloseFile" aber akzeptiert.
Das gleiche Problem habe ich wenn ich einen Com-Port öffne, da funzt auch alles, sogar ein "WriteFile", nur das "ReadFile" nicht.
Das komische ist auch, das beides schon mal so funktioniert hat. Aber als ich dann mein Programm erweitert habe, mit Sachen die eigentlich nichts damit zu tun haben, hat es auf einmal nicht mehr funktioniert.
Kann es was geben, was dem ins Gehege kommt, obwohl es eigentlich nichts damit zu tun hat?!?
Hier noch Quellcode-Auszüge (wollte nicht allen reinpacken, da das Programm knappe 4000 Zeilen hat):
D CRTFILE PR 10U 0 ExtProc('CreateFileA')
D DLL('Kernel32.dll')
D Linkage(*StdCall)
D * VALUE OPTIONS(*STRING)
D 10I 0 Value
D 10I 0 Value
D $SEC LIKE(secattr)
D 10I 0 Value
D 10I 0 Value
D 10I 0 Value
D GETLASTERROR PR 10U 0 EXTProc('GetLastError')
D DLL('Kernel32.dll')
D Linkage(*StdCall)
D READFILE PR 10U 0 ExtProc('ReadFile')
D DLL('Kernel32.dll')
D Linkage(*StdCall)
D 10I 0 Value
D * VALUE OPTIONS(*STRING)
D 10I 0 Value
D $WRITE LIKE(WRITE)
D $OVER LIKE(OVERLAP)
D CLOSEFILE PR 10U 0 ExtProc('CloseHandle')
D DLL('Kernel32.dll')
D Linkage(*StdCall)
D 10I 0 Value
D secattr DS
D LENGTH 10I 0 INZ(80)
D SECDESC 10I 0 INZ(0)
D BOOL 10I 0 INZ(0)
D name S 10A
D access S 10U 0 INZ(3221225472)
D share S 10U 0 INZ(0)
D create S 10I 0 INZ(3)
D attr S 10U 0 INZ(128)
D template S 10I 0 INZ(0)
DBRC S 10U 0
DRET S 10U 0
DRET2 S 10U 0
DRET3 S 10U 0
DRET4 S 10U 0
DWRITE S 10U 0
DOVERLAP S 10U 0
DENT1 S 10A
DENT2 S 18A
DENT3 S 350A
DENT4 S 18A
DENT5 S 2000A
DENTERR S 80A
DaENT1 S * inz(%addr(ENT1))
DaENT2 S * inz(%addr(ENT2))
DaENT3 S * inz(%addr(ENT3))
DaENT4 S * inz(%addr(ENT4))
DaENT5 S * inz(%addr(ENT5))
DaENTERR S * inz(%addr(ENTERR)
EVAL ENT4 = 'c:\rdc\hilfe_1.txt' + X'00'
C*
C EVAL BRC = CRTFILE(aENT4:ACCESS:share:
C secattr:create:attr:template)
C*
C EVAL error = getlasterror
C*
C EVAL length = 2000
C EVAL RET2 = READFILE(BRC:aENT5:Length:WRITE
C :OVERLAP)
C EVAL error = getlasterror
C*
C EVAL RET3 = Closefile(brc)
Ich hoffe ihr könnt mir weiterhelfen, weil es das letzte ist, was der Vollendung des Programms im Wege steht.
Schon mal vielen Dank für eure Mühen und allen ein schönes WE!
Mfg KAMPI