DLL und Strucktur-Type

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

Moderator: Moderatoren

Antworten
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

DLL und Strucktur-Type

Beitrag von andreas »

Hallo,

ich versuche gerade eine C-DLL in XBase einzubinden und brauche Variablen von Type "Struct". Ich habe es schon mit BAP ausprobiert, scheint aber irgendwie nicht zu funktionieren.
Ich weiss ganz genau, dass ich schon irgendwo andere Möglichkeiten gesehen habe, kann aber diese leider nicht mehr finden.
Kann mir jemand helfen?
Gruß,

Andreas
VIP der XUG Osnabrück
Gerd König
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 193
Registriert: Fr, 09. Jun 2006 7:52
Wohnort: Nähe Sömmerda

Beitrag von Gerd König »

Hallo Andreas,

da eine Struktur nichts weiter ist als eine Aneinanderreihung verschiedener Variablentypen, muß man erst einmal die Länge jeder Variablen in Bytes kennen. Die Summe ergibt dann den benötigten Buffer für die Struktur.

Ich mache das so, daß ich einen String mit der entsprechenden Länge erzeuge und dann an den richtigen Stellen fülle.
...2Bin-Funktionen verwenden!

Beispiel:
Die Struktur enthält vier unsigned Integer

Code: Alles auswählen

FUNCTION MyCapi(aArray)  //{nPos1,nPos2,nPos3,nPos4}
   LOCAL cSBuffer    :=Space(16)
   LOCAL cConv       :=Space(4)
      cConv:=U2Bin(aArray[1])
      cSBuffer[1]:=cConv[1]
      cSBuffer[2]:=cConv[2]
      cSBuffer[3]:=cConv[3]
      cSBuffer[4]:=cConv[4]
      cConv:=U2Bin(aArray[2])
      cSBuffer[5]:=cConv[1]
      cSBuffer[6]:=cConv[2]
      cSBuffer[7]:=cConv[3]
      cSBuffer[8]:=cConv[4]
      cConv:=U2Bin(aArray[3])
      cSBuffer[9]:=cConv[1]
      cSBuffer[10]:=cConv[2]
      cSBuffer[11]:=cConv[3]
      cSBuffer[12]:=cConv[4]
      cConv:=U2Bin(aArray[4])
      cSBuffer[13]:=cConv[1]
      cSBuffer[14]:=cConv[2]
      cSBuffer[15]:=cConv[3]
      cSBuffer[16]:=cConv[4]
Der C-Funktion wird dann der Pointer @cSBuffer übergeben

Herzlichst
Gerd
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:

Beitrag von brandelh »

Hallo,

und wie macht man es wenn die Struktur Pointer auf ASCIIZ Strings enthalten soll ?

Bei einem normelen Pointer würde ich einfach die Textvariable übergeben oder ? In einer Struktur ;-(
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,
und wie macht man es wenn die Struktur Pointer auf ASCIIZ Strings enthalten soll ?
ich mache das so, daß ich von Windows ein Stück freien Speicher anfordere und den Xbase++ - String dorthin kopiere. Mehr als ein paar Dllcalls ist dafür nicht erforderlich. Mit BAP, ot4xb oder Cockpit sollte das natürlich auch gehen.


nPointer := GetPointerOf( "IrgendeinString" )

Den Wert mit L2Bin() in die Struktur einbauen, API-Funktion aufrufen, und den Speicherbereich wieder freigeben, wenn er nicht mehr gebraucht wird.

ReleasePointer( nPointer )

Code: Alles auswählen

function GetPointerOf( cString )

local nSize := len( cString )

// vom Betriebssystem Speicher anfordern
local nPointer := LocalAlloc( 0x40, nSize+1 )

// den Xbase++ - String dorthin kopieren
RtlMoveMemory( nPointer, cString, nSize ) 

return nPointer

function ReleasePointer( nPointer )
 //  den vom Betriebssystem angeforderten Speicher freigeben
return LocalFree( nPointer )

DLLFUNCTION LocalAlloc( nFlags, nSize ) USING STDCALL FROM kernel32.dll
DLLFUNCTION LocalFree( nPointer) USING STDCALL FROM kernel32.dll
DLLFUNCTION RtlMoveMemory( to, from, size ) USING STDCALL FROM kernel32.dll
Viele Grüße
Günter
Antworten