DLL Zugriff - Probleme bei Datentypen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Szandor
Beiträge: 24
Registriert: 27.01.2005 17:09

DLL Zugriff - Probleme bei Datentypen

Beitrag von Szandor »

Hallo liebe PB Gemeinde,

war schon lange nicht mehr hier da ich schon lange keine Probleme mehr hatte. Nun habe ich aber folgendes Problem:

Eine DLL die auf einen Server zugreift und dort Accounts erstellt benötigt eine C++ Klasse. Gut das sollte man mit PC ja auch hinbekommen....

Nun probiere ich und probiere ich, doch es will einfach nicht klappen. Ich vermute das liegt daran das s zB kein int64 gibt :|. Kann auch sein das ich das nur mit C++ realisieren kann!?

Der C++ Struct (Class) Code:

Code: Alles auswählen

struct sRecordAccount {
	char*				NAME;
	char*				PASSWORD;
	char*				FNAME;
	char*				SNAME;
	char*				MNAME;
	char*				ADDR1;
	char*				ADDR2;
	char*				CITY;
	char*				STATE;
	char*				ZIPCODE;
	char*				COUNTRY;
	char*				PHONE;
	char*				EMAIL;
	char*				SECRET;
	char*				CDKEY;
	char*				SESSION_KEY;
	char*				LAST_IP;
	unsigned __int64	CHAR[CHARACTERS_ON_ACCOUNT];
	unsigned int		PLEVEL;
	unsigned char		MD5_0[16];
	unsigned char		MD5_1[16];
	unsigned char		MD5_2[16];
	unsigned char		MD5_3[16];
	unsigned char		MD5_4[16];
	bool				BANNED;
	bool				LOCKED;
	unsigned int		LAST_ACCESS;
};
Hier mein PB Code:

Code: Alles auswählen

OpenLibrary(0, "db.dll")

Dim CHAR.w(10)
Dim MD5_0.b(16)
Dim MD5_1.b(16)
Dim MD5_2.b(16)
Dim MD5_3.b(16)
Dim MD5_4.b(16)


Structure sRecord
	NAME.s
	PASSWORD.s
	FNAME.s
	SNAME.s
	MNAME.s
	ADDR1.s
	ADDR2.s
	CITY.s
	STATE.s
	ZIPCODE.s
	COUNTRY.s
	PHONE.s
	EMAIL.s
	SECRET.s
	CDKEY.s
	SESSION_KEY.s
	LAST_IP.s
	CHAR.w
	PLEVEL.w
	MD5_0.b
	MD5_1.b
	MD5_2.b
	MD5_3.b
	MD5_4.b
	BANNED.b
	LOCKED.b
	LAST_ACCESS.s
EndStructure


CreateDB.l = IsFunctionEntry(0, "CreateDB")
AddRecord.l = IsFunctionEntry(0, "AddRecord")
FindRecordStr.l = IsFunctionEntry(0, "FindRecordStr")
FindRecordU64.l = IsFunctionEntry(0, "FindRecordU64")
GetRecordAndLock.l = IsFunctionEntry(0, "GetRecordAndLock")
OpenDB.l = IsFunctionEntry(0, "OpenDB")
RootProcess.l = IsFunctionEntry(0, "RootProcess")
SaveDB.l = IsFunctionEntry(0, "SaveDB")
Unlock.l = IsFunctionEntry(0, "Unlock")
_Alloc.l = IsFunctionEntry(0, "_Alloc")
_Free.l = IsFunctionEntry(0, "_Free")

dbid.l = CallFunctionFast(OpenDB, "saves", "accounts", "DButil")
Debug dbid
Delay(2000)

newrecord.sRecord\NAME = "Szandor"
newrecord.sRecord\PASSWORD = "password"
newrecord.sRecord\PLEVEL = 7

Debug CallFunctionFast(AddRecord, dbid, *newrecord)
Debug CallFunctionFast(SaveDB, dbid)
Wäre über jeden Tipp dankbar, habe auch das komplette SDK dazu. Und bin über ICQ unter 3106672 erreichbar.

LG Szandor
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Das Problem ist, dass ein Haufen der Datentypen, die in deiner C++-Structure vorkommen, in PB gar nicht existieren... z.B. Bool (eine Variable die theoretisch nur 1 *Bit* (nicht Byte) lang ist), existiert in PB gar nicht. Und wenn du die Procedure jetzt einen Bool-Wert in ein eine Byte-Variable schreiben lässt, kriegst du natürlich probleme... Ein weiteres Problem sind unsigned-Typen. Die können zwar nicht kleiner als 0 sein, allerdings doppelt so hohe Zahlen enthalten wie ihre signed Brüder. Bei den signed-Brüdern ist eine hälfte "unter" 0, die andere Häflte "über" 0. Bei unsigned-Vars sind beide hälften "über" 0. Wenn du jetzt mit unsigned Longs arbeiten musst, dann biste mit PB schon aufgeschmissen, weil es in PB bis jetzt leider nur signed Variablen gibt, und der "grösste" numerische Datentyp Long ist.
Szandor
Beiträge: 24
Registriert: 27.01.2005 17:09

Beitrag von Szandor »

genau das ist auch so ein problem... bitm unsigned... bei c++ gibts bool bzw unsigned das aber bei PB nicht vorhanden ist :| - Also wie es scheint liegt das Problem nur an den Datentypen.

gibt es da vielleicht LIBs für solche Datentypen? *Purearea stöbert*

Danke für deinen Beitrag,
LG Szandor
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 »

>> Bool (eine Variable die theoretisch nur 1 *Bit* (nicht Byte) lang ist),
O_o, wie willste denn das bewerkstelligen. Das kann auch C plüsch plüsch nicht. :D
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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

ts-soft hat geschrieben:>> Bool (eine Variable die theoretisch nur 1 *Bit* (nicht Byte) lang ist),
O_o, wie willste denn das bewerkstelligen. Das kann auch C plüsch plüsch nicht. :D
Was ist C plüsch plüsch? Meinst du C++? Das geht schon, es wird ein byte erstellt, aber nur ein bit davon wird genutzt ;) .
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
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 »

Code: Alles auswählen

Procedure SetBit(Value.l, BitNumber.l, Flag.l); Flag = #True oder #False
  BitNumber = 1 << BitNumber
  If Flag
    ProcedureReturn Value | BitNumber
  Else
    ProcedureReturn (Value | BitNumber) & ~BitNumber
  EndIf
EndProcedure
Procedure TestBit(Value.l, BitNumber.l)
  If Value & (1 << BitNumber)
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure
geht doch, mit der ersten Proc setze oder entsetze das das Bit, mit der 2 teste ich ob das bit sich gesetzt hat
PB kann alles, man muß nur den Weg kennen :D
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
Szandor
Beiträge: 24
Registriert: 27.01.2005 17:09

Beitrag von Szandor »

Danke für die Hilfreichen Antworten :allright: , werde die Tipps und Codeschnippsel sofort mal ausprobieren!

LG Szandor :allright:
andi256
Beiträge: 100
Registriert: 06.11.2004 11:23
Computerausstattung: PB 5.30 (x64) Win7
Wohnort: Österreich

Beitrag von andi256 »

so schnell aus dem Kopf....

char* NAME;
=Name.l (pointer?)

unsigned __int64 CHAR[CHARACTERS_ON_ACCOUNT];
mit F64.lib
oder
CHAR.l[#CHARACTERS_ON_ACCOUNT*2]
und selber zusammenstopeln

unsigned int PLEVEL;
= PLEVEL.l

unsigned char MD5_0[16];
=MD5_0.b[16]

bool BANNED;
=BANNED.l

Bool ist 4byte lang ... somit genügt "BANNED.l" ... mehr ist nicht nötig

Andi256
Antworten