[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2005
    Beiträge
    54

    READFILE der kernel32.dll funktioniert nicht

    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):

    PHP-Code:
         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
    PHP-Code:
    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

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Die Deklaration von ReadFile ist falsch:

    BOOL ReadFile(
    HANDLE hFile, // handle of file to read
    LPVOID lpBuffer, // pointer to buffer that receives data
    DWORD nNumberOfBytesToRead, // number of bytes to read
    LPDWORD lpNumberOfBytesRead, // pointer to number of bytes read
    LPOVERLAPPED lpOverlapped // pointer to structure for data
    );

    also:

    D READFILE PR 10U 0 ExtProc('ReadFile')
    D DLL('Kernel32.dll')
    D Linkage(*StdCall)
    D 10I 0 Value
    D * Value <= Adresse eines Puffers
    D 10I 0 Value
    D 10I 0 <= Adresse eines Long für Rückgabe
    D $OVER * Value <= Adresse der OVERLAP-Struktur

    Um Adressen zu übergeben verwendest du %addr(MyVar).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Sep 2005
    Beiträge
    54
    Ich danke dir für die schnelle Antwort!
    Jetzt gehts, lag zusätzlich noch an der Overlapp-Struktur, in der was falsches stand. Die muss komplett mit "0"en gefüllt sein, wenn man die eigentlich nicht braucht, weil man keinen gleichzeitigen Lese-/Schreibzugriff hat. Habe das noch auf ner VBA Seite gelesen.

    Jetzt ist das WE gerettet.

    Mfg KAMPI
    P.S. Trotzdem komisch, weil es auf jeden Fall schon mal lief so wie ich es hatte. Naja egal!

Similar Threads

  1. Hilfe! Rollback bei Transaktionen funktioniert nicht
    By remo2010 in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 23-11-06, 13:31
  2. Antworten: 1
    Letzter Beitrag: 06-11-06, 10:02
  3. VARPG /COPY Auflösung funktioniert nicht
    By hteufl in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 21-08-06, 13:12
  4. Script funktioniert nach Releasewechsel auf V5R4 nicht mehr.
    By ratinger in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 30-06-06, 10:39
  5. overlay funktioniert nicht
    By steven_r in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-05-06, 07:59

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •