[C] Bad pointer - mein Fehler?

Billie

Erfahrenes Mitglied
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:

C:
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
 
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ß
 
Guten Morgen!

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

C:
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
 
Hi.
Also ich habe jetzt meinen Code nicht da, aber im Grunde passiert nur folgendes:

C:
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ß
 
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!
 
Zurück