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?
DLL und Strucktur-Type
Moderator: Moderatoren
-
- Rekursionen-Architekt
- Beiträge: 193
- Registriert: Fr, 09. Jun 2006 7:52
- Wohnort: Nähe Sömmerda
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
Der C-Funktion wird dann der Pointer @cSBuffer übergeben
Herzlichst
Gerd
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]
Herzlichst
Gerd
-
- Rekursionen-Architekt
- Beiträge: 315
- Registriert: Mo, 16. Okt 2006 13:04
- Wohnort: Region Stuttgart
Hallo,
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 )
Viele Grüße
Günter
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.und wie macht man es wenn die Struktur Pointer auf ASCIIZ Strings enthalten soll ?
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
Günter