Pointer auf void Variable (void *)

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
J.Renseler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Do, 15. Nov 2007 11:40
Wohnort: Krefeld
Kontaktdaten:

Pointer auf void Variable (void *)

Beitrag von J.Renseler »

Hallo,

um Zugriff auf eine Datenbank zu bekommen muss ich die mitgelieferte DLL des Lieferanten benutzen. Ein anderer Zugang zu den Daten ist ausgeschlossen. Zum Aufbau des Zugriffs und zur Identifizierung der Session wird jeder Funktion ein Sessionhandel mit übergeben.

Das Handel ist vom Typ(C++):

Code: Alles auswählen

typedef void* VLB_HSession;
Der Funktionsaufruf sieht in C++ wie folgt aus:

Code: Alles auswählen

VLB_OpenSession(char* pCdPath, char* pUserId, char* pPassword,  VLB_HSession* phSession);
Wie bilde ich diesen Funktionaufruf in XBase ab, da ich ansich gerne direkt über Xbase auf die DLL zugreifen würde ohne mir eine zusätzliche Wrapper DLL schreiben zu müssen.


Soweit ist das ganze ja auch noch klar:

Code: Alles auswählen

DLLFUNCTION VLB_OpenSession( pCdPath, pUserID, pPassword, hHndl) USING STDCALL FROM vlbapistd.dll
Aber was übergebe ich später als hHndl?

Gruß,
Jannik
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

was ist die Typdefinition unter C++ ?
Ist dies eventuell eine Konstante aus einer .H Datei oder aber ein Zeiger auf eine Integer, die NACH der Ausführung den Handle enthält ?

Wenn das stimmt, würde ich mal

Code: Alles auswählen

nHndl := 0
...., @nHndl )
versuchen. Eigentlich müsste ja der Dateihandle wie bei z.B. fOpen() durch die Funktion ermittelt und dann für weitere Operationen zurückgegeben werden. Aber die DLL Funktion in deinem Aufbau hat keinen Rückgabewert (das bedeuted doch VOID oder ?). Somit denke ich dass die das als Parameter per Referenz zurückgeben.
Gruß
Hubert
J.Renseler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Do, 15. Nov 2007 11:40
Wohnort: Krefeld
Kontaktdaten:

Beitrag von J.Renseler »

Wenn ich es richtig verstanden habe bedeuten Void ähnlich wie NIL oder NULL "nichts". So wie du es vorschlägst habe ich es bereits ausprobiert. Ich frage mich auch wie ein Zeiger auf "nichts" einen Wert speichern kann da ja überhaupt kein Speicher reserviert wird.
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

J.Renseler hat geschrieben:So wie du es vorschlägst habe ich es bereits ausprobiert.
und war nach dem Aufruf in der Variable ein anderer Wert ?

Irgendwo habe ich auch mal was gelesen wegen Parameterübergabe in Alaska, kann es sein dass die Zeiger auf Strings anders übergeben werden müssen ... wo war das noch ... ich seh mal nach.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

laut Hilfe zu DLLCall() ist ein C Parameter *char das Gleiche wie Übergabe per Referenz, somit müsste es so aussehen:

Code: Alles auswählen

pCdPath := "x:/DB_Path"
pUserID := "test"
pPassword := "geheim"
hHndl := 0

VLB_OpenSession( @pCdPath, @pUserID, @pPassword, @hHndl)
? nHndl // ist das jetzt ungleich 0 ? Negtiv = Fehler ?

DLLFUNCTION VLB_OpenSession( pCdPath, pUserID, pPassword, hHndl) USING STDCALL FROM vlbapistd.dll 



Aber was übergebe ich später als hHndl?
Gruß
Hubert
J.Renseler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Do, 15. Nov 2007 11:40
Wohnort: Krefeld
Kontaktdaten:

Beitrag von J.Renseler »

Hi,

der Aufruf funktioniert leider auch nicht. hHndl enthält danach immer noch den Wert 0.
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

wenn du C++ hast, prüfe doch ob die Werte für User und KW sowie Pfad richtig sind und seh dort nach was genau der Datentyp des Handles ist. Da muss es mehr Infos geben. Auch was nach dem Aufruf in dem handle steht ...
Gruß
Hubert
J.Renseler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Do, 15. Nov 2007 11:40
Wohnort: Krefeld
Kontaktdaten:

Beitrag von J.Renseler »

Die Werte für Pfad, User und Kennwort sind richtig. (Habe mir schnell ein kleines C++ Programm gemacht mit dem ich das testen kann).

hHndl ist vom Typ void * und hat als Wert eine Speicheradresse (0x00b338bc deute ich einfach mal als Speicheradresse.)
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

eventuell ist es auch sinnvoll mit DLLLOAD() und DLLCALL() die Schritte aufzuteilen, eventuell stimmt ja auch der Pfad zur DLL selbst nicht.

Auch könntest du statt DLL_STDCALL die anderen versuchen.
Gruß
Hubert
J.Renseler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Do, 15. Nov 2007 11:40
Wohnort: Krefeld
Kontaktdaten:

Beitrag von J.Renseler »

Also die DLL findet er, da ich auch in C++ "_stdcall" verwende bin ich einfach mal davon ausgegangen das das auch für XBase++ richtig ist, probiere die andern nochmal aus.
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,
da ich auch in C++ "_stdcall" verwende bin ich einfach mal davon ausgegangen das das auch für XBase++ richtig ist,
das scheint auch plausibel :)

hast du unter Xbase OEM Zeichensatz aktiv und Umlaute in den Parametern ?

Du merkst, mir gehen die Ideen aus ;-)
Gruß
Hubert
J.Renseler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Do, 15. Nov 2007 11:40
Wohnort: Krefeld
Kontaktdaten:

Beitrag von J.Renseler »

Hi,

danke auf jeden Fall schonmal für deine Hilfe, also die anderen DLL Call Typen bringen leider auch nichts. Sonderzeichen sind nicht aktiv. Das Problem dürfte sein das Xbase keine Pointer im ursprünglichem Sinn kennt.
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

In der Hilfe steht aber drinn, dass die @Variable einen Pointer übergibt, sehr seltsam.

Was mich irritiert ist die TYPEDEF .... Angabe. Wenn der Handle einfach eine Integer wäre (wie ich annahm), dann bräuchte man das doch unter C++ auch nicht oder ?

Könnte das eine Struktur sein ?

Dann müsste man die Variable mit mehr Speicherplatz ausstatten und interpretieren (Bin2... ...2Bin Funktionen)
Gruß
Hubert
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Jannik,

da phSession (wie in der C-Deklaration) ein Ausgabeparameter ist, sollte die DLLFUNCTION so aussehen:

Code: Alles auswählen

DLLFUNCTION VLB_OpenSession( pCdPath, pUserID, pPassword, @hHndl) USING STDCALL FROM vlbapistd.dll
und deren Aufruf:

Code: Alles auswählen

pCdPath := "x:/DB_Path"
pUserID := "test"
pPassword := "geheim"
hHndl := 0 

nRueckgabewert := VLB_OpenSession( pCdPath, pUserID, pPassword, @hHndl)
Die Klammeraffen bei den Strings sind entbehrlich, weil es sich dabei um reine IN-Parameter handelt (obwohl sie auch nicht schaden dürften.)

Viele Grüße,
Günter
J.Renseler
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 151
Registriert: Do, 15. Nov 2007 11:40
Wohnort: Krefeld
Kontaktdaten:

Beitrag von J.Renseler »

*oehm* jetzt wo du es gesagt hast klingt das ganze ziemlich logisch und funktioniert auch!

Danke!!

Gruß,
Jannik
Kassensysteme für den Einzelhande http://ab-software.de
Mitglied der XUG-Cologne http://www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

in meiner RM_Chart Klasse habe ich das mit dem @Parameter noch gewußt und verwendet, leider oben aber vergessen ...
in der Hilfe zu DLLCALL() ist es in den Beispielen ja angedeutet ;-)
aber in DLLFUNCTION steht es explizit drin :!:

Ich hoffe nun werde ich es mir besser merken, danke :D
Gruß
Hubert
Antworten