Seite 1 von 1

DLL Zugriff - Probleme bei Datentypen

Verfasst: 29.08.2005 16:50
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

Verfasst: 29.08.2005 17:02
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.

Verfasst: 29.08.2005 17:42
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

Verfasst: 29.08.2005 18:04
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

Verfasst: 29.08.2005 18:05
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 ;) .

Verfasst: 29.08.2005 18:15
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

Verfasst: 29.08.2005 21:58
von Szandor
Danke für die Hilfreichen Antworten :allright: , werde die Tipps und Codeschnippsel sofort mal ausprobieren!

LG Szandor :allright:

Verfasst: 30.08.2005 14:55
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