tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
700
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Billie
    Billie Billie ist offline Mitglied Platin
    Registriert seit
    Jan 2003
    Ort
    Arzl im Pitztal (Tirol)
    Beiträge
    510
    Hellas!

    Mein Problem ist folgendes, ich schreibe an einem Programm das eine C-API verwendet. Diese API ist aber lediglich die Middleware über die Kommuniziert wird.

    Jetzt habe ich folgendes Problem: Ich bekomme eine Struktur mit einem Pointer auf eine weitere Struktur, welche wie folgt definiert ist:

    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    
    typedef struct _wfs_hwerror
    {
        LPSTR           lpszLogicalName;
        LPSTR           lpszWorkstationName;
        LPSTR           lpszAppID;
        DWORD           dwSize;
        LPBYTE          lpbDescription;
    } WFSHWERROR, * LPWFSHWERROR;

    In der API-Dokumentation sind die ersten drei Felder optional - also "points to ... (if any)". dwSize sollte aber immer die Größe des Buffer auf den lbpDescription zeigt angeben.

    Nun habe ich beim Zugriff auf die Struktur über JNI eine Zugriffsverletzung verursacht. Genau genommen beim Zugriff auf lpszAppID - lpszLogicalName und lpszWorkstationName zeigen wie gewünscht auf Strings.

    Man könnte jetzt annehmen, dass lpszAppID auf NULL zeigt - aber Nein, beim Debuggen mit VC++ zeigt er mir an, dass lpszAppID auf die Adresse "0x00000004" <Schlechtes Ptr> zeigt. dwSize hat einen unmöglichen Wert (1431128403 unsigned long) und lpbDescription wieder <Schlechtes Ptr> bei Adresse 0x4554414c.

    Mach ich jetzt einen Fehler oder liegt der Fehler bei der Applikation auf der anderen Seite der Middleware? Die ersten zwei Strings werden beim Debuggen problemlos angezeigt.

    Beste Grüße,
    Billie
     
    Fann Ég Fjalli Fallega Steina
    Faldi Dá Alla Vildi Deim Leyna
    Huldi Dar Hellisskúta Heillasteina
    Alla Mína Una eth slegu Óskasteina

  2. #2
    jsendrow Tutorials.de Gastzugang
    Du machst was falsch.
     

  3. #3
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Hast du denn die Struktur ordentlich initialisiert? Oder wie kommst du an die Struktur? Doch wohl über call-by-reference, oder?

    Zeig am besten mal (überblicksmäßig) was der Code macht. Unter deiner Beschreibung kann ich mir jetzt nichts richtiges vorstellen.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  4. #4
    Avatar von Billie
    Billie Billie ist offline Mitglied Platin
    Registriert seit
    Jan 2003
    Ort
    Arzl im Pitztal (Tirol)
    Beiträge
    510
    Guten Morgen!

    Also ich habe jetzt meinen Code nicht da, aber im Grunde passiert nur folgendes:

    Code c:
    1
    2
    3
    4
    5
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {
        LPWFSRESULT lpWFSResult;
        LPWFSHWERROR lpWFSHwError;
        lpWFSResult = (LPWFSRESULT) lParam;
        lpWFSHwError = (LPWFSHWERROR) lpWFSResult->lpBuffer;

    Also, lParam ist der Pointer auf eine WFSRESULT-Struktur. Diese enthält enthält den lpBuffer der in meinem Fall auf eine WFSHWERROR-Struktur zeigt.

    Im Debugger kann ich dann lpWFSHwError durchklicken und bekomme eben die ersten zwei Strings angezeigt und dann bad pointer.

    Beste Grüße,
    Billie
     
    Fann Ég Fjalli Fallega Steina
    Faldi Dá Alla Vildi Deim Leyna
    Huldi Dar Hellisskúta Heillasteina
    Alla Mína Una eth slegu Óskasteina

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Billie Beitrag anzeigen
    Also ich habe jetzt meinen Code nicht da, aber im Grunde passiert nur folgendes:

    Code c:
    1
    2
    3
    4
    5
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {
        LPWFSRESULT lpWFSResult;
        LPWFSHWERROR lpWFSHwError;
        lpWFSResult = (LPWFSRESULT) lParam;
        lpWFSHwError = (LPWFSHWERROR) lpWFSResult->lpBuffer;

    Also, lParam ist der Pointer auf eine WFSRESULT-Struktur. Diese enthält enthält den lpBuffer der in meinem Fall auf eine WFSHWERROR-Struktur zeigt.
    Evlt. ist die Error-Struktur nur valide wenn ein Fehler aufgetreten ist (was durch ein Attribut der Result-Struktur angezeigt wird)?

    Ansonsten kannst du wohl nichts machen, du bekommst die Daten ja so geliefert.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    Avatar von Billie
    Billie Billie ist offline Mitglied Platin
    Registriert seit
    Jan 2003
    Ort
    Arzl im Pitztal (Tirol)
    Beiträge
    510
    OK - Es war mein Fehler, ich habe etwas übersehen und die falsche Struktur verwendet.

    Aber Grundsätzlich, hätte ich eine WFSHWERROR Struktur bekommen sollen, wäre es nicht mein Fehler gewesen. War aber natürlich unwahrscheinlich

    Danke!
     
    Fann Ég Fjalli Fallega Steina
    Faldi Dá Alla Vildi Deim Leyna
    Huldi Dar Hellisskúta Heillasteina
    Alla Mína Una eth slegu Óskasteina

Ähnliche Themen

  1. Pointer vergisst mein ersten Wert...
    Von XeoX im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 11.01.08, 13:16
  2. Invalid Pointer Addition.. wo is denn da n pointer !
    Von GartenUmgraben im Forum Borland CBuilder und VCL
    Antworten: 3
    Letzter Beitrag: 29.07.06, 16:48
  3. Antworten: 4
    Letzter Beitrag: 07.07.06, 13:34
  4. Antworten: 1
    Letzter Beitrag: 22.12.05, 09:27
  5. Antworten: 6
    Letzter Beitrag: 02.11.03, 21:23