Seite 1 von 2
PChar Structure in PureBasic
Verfasst: 08.10.2006 18:15
von legion
Hallo liebe Basicfreunde !
Habe lange Zeit in Delphi programmiert und jede Menge Source und DLL's angehäuft. Wollte so eine Dll setzt in PB einbinden, komme aber mit der Structure nicht zurecht. Was nimmt man in PB für PChar (Pointer of Char)?
Wie würde diese Structure in PB aussehen ?
Type DiskInfo = packed record
FirmwareRev:PChar;
SerialNumber: PChar;
ModalNumber: PChar;
ECCByte: PChar;
Heads: PChar;
Sectors: PChar;
LBASector: PChar;
Bytes_Sector: PChar;
end;
Danke für eure Hilfe !
Verfasst: 08.10.2006 18:29
von edel
Willkommen.
So wie ich das verstanden habe ist PChar ein Pointer auf eine Reihe von
Chars. Ich wuerde es ersteinmal ganz simpel mit einem String versuchen.
Code: Alles auswählen
Structure DiskInfo
FirmwareRev.s
SerialNumber.s
ModalNumber.s
ECCByte.s
Heads.s
Sectors.s
LBASector.s
Bytes_Sector.s
EndStructure
Verfasst: 08.10.2006 18:36
von legion
Das hab ich schon getestet -> funktioniert leider nicht !
Beim Aufruf der Dll kommt sofort:
"Incorrect Number of Parameters"
Verfasst: 08.10.2006 18:52
von PMV
Was hat die Struktur mit der Anzahl der Parametern zu tun?
Was erwartet die DLL denn?
MFG PMV
Verfasst: 08.10.2006 18:52
von #NULL
dieser fehler wird aber wohl kaum an den typen liegen.
poste doch mal den kopf einer aufzurufenden funktion und einen versuch von dir sie aufzurufen.
Verfasst: 08.10.2006 19:43
von legion
Danke für eure Unterstützung!
Ich habe die Dll mit dem Dll-Importer importiert und als lib abgelegt (ohne Fehler)! Mit dieser Dll ist es möglich, die Hardware-Seriennummer der Festplatte auszulesen. download unter:
http://www.amok.am/index.php?page=progr&id=24&lang=de
--------------------------------------------------------------------------------------
Structure DiskInfo
FirmwareRev.s
SerialNumber.s
ModalNumber.s
ECCByte.s
Heads.s
Sectors.s
LBASector.s
Bytes_Sector.s
EndStructure
DI.DISKINFO
info_(0,DI)
Debug DI\SerialNumber
End
------------------------------------------------------------------------------------------
DLL-Info:
==================================================
Function Name : about
Address : 0x00408324
Relative Address : 0x00008324
Ordinal : 1 (0x1)
Filename : getide.dll
Full Path : C:\Temp\getide.dll
==================================================
==================================================
Function Name : info
Address : 0x004081e0
Relative Address : 0x000081e0
Ordinal : 2 (0x2)
Filename : getide.dll
Full Path : C:\Temp\getide.dll
==================================================
Verfasst: 08.10.2006 19:58
von #NULL
#
Dll-Importer ..kenn ich mich nicht aus. hast du mal versucht direkt aus der dll zu laden?
#
versuchs mal mit info_(0,@DI)
#
'packed record' ist in object-pascal aber nicht zufällig sowas wie eine enumeration?
Verfasst: 08.10.2006 20:04
von legion
info_(0,@DI) funktioniert nicht !
packed record entspricht möglicher weise einer StructureUnion in PB.
Hab ich auch schon getestet, leider kein Erfolg.
Aus der Dll direkt zu laden hab ich nicht versucht.
Verfasst: 08.10.2006 20:09
von #NULL

StructureUnion, nicht Enumeration - hast recht
bei packed geht's glaub ich um gepackte speicherbereiche.
delphi-hilfe zu 'packed' hat geschrieben:Im Falle eines Zeichen-Arrays beeinflusst packed auch die Kompatibilität der Typen
Verfasst: 08.10.2006 20:24
von legion
Code: Alles auswählen
Structure PChar
*Pointer.c
EndStructure
Structure DiskInfo
FirmwareRev.PChar
SerialNumber.PChar
ModalNumber.PChar
ECCByte.PChar
Heads.PChar
Sectors.PChar
LBASector.PChar
Bytes_Sector.PChar
EndStructure
DI.DISKINFO
If OpenLibrary(0, "c:\temp\getide.dll")
CallFunction(0, "Info",0,DI)
EndIf
Debug DI\SerialNumber
So funktioniert zu mindest der Zugriff auf die Speicheradresse !