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
:oops: 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 !