System DLL mit Pointer auf String
Moderator: Moderatoren
- klammerauf
- UDF-Programmierer
- Beiträge: 69
- Registriert: Do, 08. Feb 2007 14:16
- Wohnort: Karlsruhe
- Hat sich bedankt: 3 Mal
System DLL mit Pointer auf String
Ich bin gerade dabei eine DLL eines Auftraggebers zu verwenden. Dabei rufe ich eine Funktion auf, die einen Pointer auf einen String zurückgeben soll.
Das klappt aber bei mir weder mit BAP noch mit BAP2 noch mit PGDeref(). Ich bekomme lediglich einen leeren String zurück.
Jetzt würde mich natürlich interessieren, ob das ganz allgemein an meiner Vorgehensweise oder an der DLL des Auftraggebers liegt. Um das rauszubekommen, würde ich gerne eine System DLL aus Windows aufrufen, die einen Pointer auf einen String zurückgibt. Ich dachte da z.B. an die advapi32.dll.
Kennt jemand eine Funktion innerhalb einer SystemDLL, die einen Pointer auf einen String zurückgibt?
Danke
Sebastian
Das klappt aber bei mir weder mit BAP noch mit BAP2 noch mit PGDeref(). Ich bekomme lediglich einen leeren String zurück.
Jetzt würde mich natürlich interessieren, ob das ganz allgemein an meiner Vorgehensweise oder an der DLL des Auftraggebers liegt. Um das rauszubekommen, würde ich gerne eine System DLL aus Windows aufrufen, die einen Pointer auf einen String zurückgibt. Ich dachte da z.B. an die advapi32.dll.
Kennt jemand eine Funktion innerhalb einer SystemDLL, die einen Pointer auf einen String zurückgibt?
Danke
Sebastian
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
--
Grüße
Sebastian
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: System DLL mit Pointer auf String
hi,
ausprobieren.
ansonsten solltest du und mehr Info´s liefern : Name und Hersteller der DLL, VB oder C Beispiele etc.
Die RegClass von Thomas Braun verwendet die ADVAPI32.DLL oder einfach malklammerauf hat geschrieben: Ich dachte da z.B. an die advapi32.dll.
Code: Alles auswählen
STATIC DLLFUNCTION IsTextUnicode( cText,nULen, @npi ) USING STDCALL FROM "ADVAPI32.DLL"
ansonsten solltest du und mehr Info´s liefern : Name und Hersteller der DLL, VB oder C Beispiele etc.
gruss by OHR
Jimmy
Jimmy
- klammerauf
- UDF-Programmierer
- Beiträge: 69
- Registriert: Do, 08. Feb 2007 14:16
- Wohnort: Karlsruhe
- Hat sich bedankt: 3 Mal
Re: System DLL mit Pointer auf String
Hallo Jimmy,
Danke für die Rückmeldung. Aber laut
http://msdn.microsoft.com/en-us/library/ms776445.aspx
liefert die Funktion IsTextUnicode einen Bool-Wert zurück, und nicht einen Pointer auf einen String.
Ich kann leider keine Infos zu meiner DLL weitergeben, weil das eine nicht öffentliche DLL ist.
Ein Codebeispiel allerdings schon:
Sebastian
Danke für die Rückmeldung. Aber laut
http://msdn.microsoft.com/en-us/library/ms776445.aspx
liefert die Funktion IsTextUnicode einen Bool-Wert zurück, und nicht einen Pointer auf einen String.
Ich kann leider keine Infos zu meiner DLL weitergeben, weil das eine nicht öffentliche DLL ist.
Ein Codebeispiel allerdings schon:
Code: Alles auswählen
#include "bap.ch"
#include "dll.ch"
PROCEDURE Main()
LOCAL nDLL
LOCAL nPointer, cRet
LOCAL nAdr
LOCAL nSize := 255
LOCAL cSpace := SPACE( nSize + 1 )
nDLL := DLLLoad( "Config.dll" )
IF nDLL == 0
? "Fehler bei DLL-Load!"
RETURN
ELSE
? "DLL-Handle: " + VAR2CHAR( nDLL )
? "DLL_INFO_PATHNAME: " + DLLInfo( nDLL, DLL_INFO_PATHNAME )
?
ENDIF
nPointer := DLLCall( nDLL, DLL_STDCALL, "GetConfig", "", "", @cSpace, @nSize )
? "Type nPointer: " + VALTYPE( nPointer )
IF VALTYPE( nPointer ) != "U"
? "Value nPointer: " + VAR2CHAR( nPointer )
ELSE
? "Value nPointer = NIL"
ENDIF
cRet := StringOf( nPointer )
? "Rückgabe BAP StringOf: ", cRet
? "Type Rückgabe: ", VALTYPE( cRet )
IF VALTYPE( cRet ) == "C"
? "Zeichenlänge Rückgabe: ", ALLTRIM( VAR2CHAR( LEN( cRet ) ) )
ENDIF
RETURN
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
--
Grüße
Sebastian
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: System DLL mit Pointer auf String
Hi,
ich bin zwar nicht der WinAPI Profi, aber bei meinem PowerBasic compilier ist die WinAPI und andere in PowerBasic defininert. Dort kann ich nur DWORD und LONG Rückgabewerte sehen.
Möglich dass einer davon auch ein Pointer auf einen String darstellen soll (DWORD ?), aber nach
der Beschreibung von denen die ich schon probiert habe geht das immer anders.
Bei Handles = 0 Fehler, sonst ein Handle.
Bei den anderen ist 0 kein Fehler und der Rest Fehler/Statusmeldungen...
Alles Strings die ich bis jetzt gesehen habe werden als BufferVariable per Referenz übergeben und erhalten danach das Ergebnis. Aber wem sage ich das ... wenn ich sehe, dass du mit BAB arbeitest
Ich erzähle es deshalb, weil mir diese Zeile aufgefallen ist:
cRet := StringOf( nPointer )
Ich vermute mal, dass diese aus einem Pointer einen String macht.
Vorausgesetzt, dass sie normalerweise richtig arbeitet (kein Ahnung !) und nun aber nicht,
wäre eine naheliegende Möglichkeit, dass die DLL einen Pointer auf einen UNICODE String zurückliefert.
Damit kann Xbase++ aber nichts anfangen.
Wer sich aber gut damit auskennt ist Pablo Botella, der die ot4xb geschrieben hat.
Wenn du im Alaska Forum oder in seinem http://www.xbwin.com / news.xbwin.com Forum
(allerdings nur englisch) fragst könnte er vielleicht helfen.
Ansonsten müsste man wissen mit was die DLL geschrieben wurde.
Wenn es C++/C Beispiele für den (allgemeinen) Aufruf gibt, sollte sich doch jemand finden
lassen, der einen Wrapper darum schreibt und den StringPointer in Xbase++ verträglicher Weise
an eine andere Funktion übergibt
ich bin zwar nicht der WinAPI Profi, aber bei meinem PowerBasic compilier ist die WinAPI und andere in PowerBasic defininert. Dort kann ich nur DWORD und LONG Rückgabewerte sehen.
Möglich dass einer davon auch ein Pointer auf einen String darstellen soll (DWORD ?), aber nach
der Beschreibung von denen die ich schon probiert habe geht das immer anders.
Bei Handles = 0 Fehler, sonst ein Handle.
Bei den anderen ist 0 kein Fehler und der Rest Fehler/Statusmeldungen...
Alles Strings die ich bis jetzt gesehen habe werden als BufferVariable per Referenz übergeben und erhalten danach das Ergebnis. Aber wem sage ich das ... wenn ich sehe, dass du mit BAB arbeitest
Ich erzähle es deshalb, weil mir diese Zeile aufgefallen ist:
cRet := StringOf( nPointer )
Ich vermute mal, dass diese aus einem Pointer einen String macht.
Vorausgesetzt, dass sie normalerweise richtig arbeitet (kein Ahnung !) und nun aber nicht,
wäre eine naheliegende Möglichkeit, dass die DLL einen Pointer auf einen UNICODE String zurückliefert.
Damit kann Xbase++ aber nichts anfangen.
Wer sich aber gut damit auskennt ist Pablo Botella, der die ot4xb geschrieben hat.
Wenn du im Alaska Forum oder in seinem http://www.xbwin.com / news.xbwin.com Forum
(allerdings nur englisch) fragst könnte er vielleicht helfen.
Ansonsten müsste man wissen mit was die DLL geschrieben wurde.
Wenn es C++/C Beispiele für den (allgemeinen) Aufruf gibt, sollte sich doch jemand finden
lassen, der einen Wrapper darum schreibt und den StringPointer in Xbase++ verträglicher Weise
an eine andere Funktion übergibt
Gruß
Hubert
Hubert
- klammerauf
- UDF-Programmierer
- Beiträge: 69
- Registriert: Do, 08. Feb 2007 14:16
- Wohnort: Karlsruhe
- Hat sich bedankt: 3 Mal
Re: System DLL mit Pointer auf String
Danke an alle, habs hinbekommen.
Der Fehler war, dass die DLL (übrigens in Delphi geschrieben) einen String als Parameter erwartet hat, der 0-terminiert ist.
Ein einfaches cParam + CHR(0) war die Lösung:
Sebastian
Der Fehler war, dass die DLL (übrigens in Delphi geschrieben) einen String als Parameter erwartet hat, der 0-terminiert ist.
Ein einfaches cParam + CHR(0) war die Lösung:
Code: Alles auswählen
nPointer := DLLCall( nDLL, DLL_STDCALL, "GetConfig", "" + CHR(0), "", @cSpace, @nSize )
Sebastian
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
--
Grüße
Sebastian
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: System DLL mit Pointer auf String
hi,
uups ... JA ... wie schon der Functions Name sagt "IS...()" sollte -> .T. / .F. zurück geben ...klammerauf hat geschrieben: Danke für die Rückmeldung. Aber laut
http://msdn.microsoft.com/en-us/library/ms776445.aspx
liefert die Funktion IsTextUnicode einen Bool-Wert zurück, und nicht einen Pointer auf einen String.
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: System DLL mit Pointer auf String
Hi,
nur der Vollständigkeit halber. Fall jemand wirklich eine Funktion hat, die einen Pointer auf einen AscIIZ String zurückliefert, findet er hier etwas weiter unten eine von mir übersetzte Funktion von Pablo:
http://www.xbaseforum.de/viewtopic.php? ... 222#p30222
nur der Vollständigkeit halber. Fall jemand wirklich eine Funktion hat, die einen Pointer auf einen AscIIZ String zurückliefert, findet er hier etwas weiter unten eine von mir übersetzte Funktion von Pablo:
http://www.xbaseforum.de/viewtopic.php? ... 222#p30222
Gruß
Hubert
Hubert