System DLL mit Pointer auf String

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

Moderator: Moderatoren

Antworten
Benutzeravatar
klammerauf
UDF-Programmierer
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

Beitrag von klammerauf »

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
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

hi,
klammerauf hat geschrieben: Ich dachte da z.B. an die advapi32.dll.
Die RegClass von Thomas Braun verwendet die ADVAPI32.DLL oder einfach mal

Code: Alles auswählen

STATIC DLLFUNCTION IsTextUnicode( cText,nULen, @npi ) USING STDCALL FROM "ADVAPI32.DLL"
ausprobieren.

ansonsten solltest du und mehr Info´s liefern : Name und Hersteller der DLL, VB oder C Beispiele etc.
gruss by OHR
Jimmy
Benutzeravatar
klammerauf
UDF-Programmierer
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

Beitrag von klammerauf »

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:

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
Sebastian
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
Benutzeravatar
brandelh
Foren-Moderator
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

Beitrag von brandelh »

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 ;-)
Gruß
Hubert
Benutzeravatar
klammerauf
UDF-Programmierer
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

Beitrag von klammerauf »

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:

Code: Alles auswählen

nPointer := DLLCall( nDLL, DLL_STDCALL, "GetConfig", "" + CHR(0), "", @cSpace, @nSize )
:banghead:

Sebastian
Exzessiver Codeblock Programmierer
--
Grüße
Sebastian
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

hi,
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.
uups ... JA ... wie schon der Functions Name sagt "IS...()" sollte -> .T. / .F. zurück geben ...
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
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

Beitrag von brandelh »

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
Gruß
Hubert
Antworten