DLL-Funktion liefert Pointer auf ein Array - Wie Arr lesen?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Clipper
Beiträge: 30
Registriert: 24.12.2004 06:47
Wohnort: NRW

DLL-Funktion liefert Pointer auf ein Array - Wie Arr lesen?

Beitrag von Clipper »

Hallo,

ich benutze per CallfunctionFast eine Funktion einer Lib, die mir eine
null-terminierte Liste mit Pointern auf Werte zurückgibt.

Wenn ich die Werte lesen will, geht das in C so:


char **vals;


if ( ( vals = funktion( a,b,c ) ) != NULL ) {
for ( i = 0; vals != NULL; i++ ) {
printf( "%s: %s\n", a, vals );

}


Wie bekomme ich das in PB hin??
(Die Anzahl der Werte weiss ich nicht im Vorraus)
Benutzeravatar
Clipper
Beiträge: 30
Registriert: 24.12.2004 06:47
Wohnort: NRW

Beitrag von Clipper »

Sorry sorry :oops:


Ich glaube ich hab es:
valu = CallFunction(0,"funktion",*a,*a,c.s)
Debug PeekS(PeekL(valu))
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag von inc. »

Dadurch erhälst du aber lediglich den Pointer zum ersten Element jenes "char **vals" Arrays im C Code.

Hmmmm ..... mal nur so ausm Kopf, keine Gewähr ...

Code: Alles auswählen

structure myString
  s.s[0]
EndStructure

i.l = 0

*valu.myString = CallFunction(0,"funktion",*a,*a,c.s)

While *valu\s[i]
  Debug *valu\s[i] ; < ---- Kein Peek sondern direkte String-via-pointer Abfrage
  i+1
Wend


[OT]
PS: Somit könnte man sich viell. auch generell das PeekS() bei Stringrückgaben aus Dlls sparen:

*ResultedString.String = DllFunction()
Debug *ResultedString\s

[\OT]
Hier gibts die OOP Option für PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

inc. hat geschrieben: [OT]
PS: Somit könnte man sich viell. auch generell das PeekS() bei Stringrückgaben aus Dlls sparen:

*ResultedString.String = DllFunction()
Debug *ResultedString\s

[\OT]
Wenn man Prototypes verwendet, was ich nur empfehlen kann, ist dies doch auch überflüssig. Jedenfalls das OT-Beispiel.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Und ich kann nur von Prototypen abraten, da diese den Stack zerhauen
könnten. Das Problem hatte ich zumindest mal. Hab mir dann natürlich
nen Wolf gesucht, bis ich den Fehler hatte.
Bild
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag von inc. »

Ich kenne mich mit Prototypen noch nicht so aus, bis auf jene Beispiele um Functionen in Structuren nutzen zu können ....


@TS-Soft & MVXA

Könntet Ihr mal zu euren Angaben Beispiele posten? Thx.
Hier gibts die OOP Option für PureBasic.
Benutzeravatar
Clipper
Beiträge: 30
Registriert: 24.12.2004 06:47
Wohnort: NRW

Beitrag von Clipper »

Hallo inc, du hast natürlich Recht, ich bekomme nur den Zeiger auf das erste Listenelement.
Die Liste ist eine Liste von Pointern auf Strings.
So funktioniert es dann:

Code: Alles auswählen

        pt.l=CallFunction(0,"funktion",*a,*a,c.s) 
        If pt
           ptp.l=PeekL(pt)
           While ptp
              ptp.l=PeekL(pt)
              If ptp
                 Debug PeekS(ptp)
                 pt+4                                ; = sizeof(LONG)
              EndIf
           Wend 
        EndIf
Dein Beispiel habe ich umgebaut zu:

Code: Alles auswählen

Structure myLong
  l.l[0] 
EndStructure 

       *valu.myLong=CallFunction(0,"funktion",*a,*a,c.s) 
       i=0
       While *valu\l[i]
          Debug PeekS(*valu\l[i])
          i+1
       Wend
Das läuft soweit bis irgendwann die Fehlermeldung Pointer ist null ausgegeben wird und zwar in der Zeile "While *apt\l" !??
PeekS() kann ich wahrscheinlich auch weglassen wenn ich mit MyString arbeite!.
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Beitrag von inc. »

Da ein Stringelement in einer Struktur eh lediglich nur den pointer! zu jenem string besitzt, ist der Code oben von mir genau richtig, denn so musst du nicht 'peek'en'
Hier gibts die OOP Option für PureBasic.
Benutzeravatar
Clipper
Beiträge: 30
Registriert: 24.12.2004 06:47
Wohnort: NRW

Beitrag von Clipper »

inc, du hast Recht! Ich hab noch einmal alles überprüft. Es läuft super.

Ich danke Dir !!!! :allright:
Antworten