problem mit der mbm wrapper class
-
hi!!
ich will die daten des motherboard monitors auslesen. auf der internet seite steht auch extra eine c++ wrapper class zur verfügung mit der man auf den shared memory des programms zugreifen kann - nur diese funktioniert nicht wirklich - die daten kommen bruchstückhaft und verschoben in der datenstruktur an.
hat evtl. jemand erfahrung mit der klasse?hier mal der wichtigste code: (in data landen die falschen infos)
double CMBM::Connect() { if (isConnected()) return -2; // try to open shared memory hMapFile = OpenFileMapping(FILE_MAP_READ, FALSE, "$M$B$M$5$S$D$"); if (hMapFile == 0) return -1; // try to make a first read to memory if (!ReadValues()) return -1; Connected = true; //return MBM version return data->sdVersion; } bool CMBM::ReadValues() { data = (TSharedData *)MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0); if (data == NULL) { DisConnect(); return false; } return true; }
die struktur sollte die richtige sein, da sie erstens mit der klasse mitgegeben wurde uns zweites die selbe struktur auch auf der mbm seite steht....
-
Vielleicht wurde das Datenaligning der Struktur im Header nicht vereinbart.
-
aligning??
wenn du damit die reihenfolge der einträge in der struktur meinst: doch die sollte richtig sein. die struktur ist wirklich nicht klein - ich hab jeden eintrag mit der referenz verglichen.
die struktur
typedef enum { btISA, btSMBus, btVIA686ABus, btDirectIO } TBusType; typedef enum { smtSMBIntel, smtSMBAMD, smtSMBALi, smtSMBNForce, smtSMBSIS } TSMBType; typedef enum { stUnknown, stTemperature, stVoltage, stFan, stMhz, stPercentage } TSensorType; //--------------------------------------------------------------------------- // STRUCT //--------------------------------------------------------------------------- typedef struct TSHAREDINDEX { TSensorType iType; // type of sensor int Count; // number of sensor for that type } TSharedIndex; typedef struct TSHAREDSENSOR { TSensorType ssType; // type of sensor unsigned char ssName[12]; // name of sensor char sspadding1[3]; // padding of 3 byte double ssCurrent; // current value double ssLow; // lowest readout double ssHigh; // highest readout long ssCount; // total number of readout char sspadding2[4]; // padding of 4 byte long double ssTotal; // total amout of all readouts char sspadding3[6]; // padding of 6 byte double ssAlarm1; // temp & fan: low alarm; voltage: % off; double ssAlarm2; // temp: high alarm } TSharedSensor; typedef struct TSHAREDINFO { short siSMB_Base; // SMBus base address TBusType siSMB_Type; // SMBus/Isa bus used to access chip TSMBType siSMB_Code; // SMBus sub type, Intel, AMD or ALi char siSMB_Addr; // Address of sensor chip on SMBus unsigned char siSMB_Name[41]; // Nice name for SMBus short siISA_Base; // ISA base address of sensor chip on ISA int siChipType; // Chip nr, connects with Chipinfo.ini char siVoltageSubType; // Subvoltage option selected } TSharedInfo; typedef struct TSHAREDDATA { double sdVersion; // version number (example: 51090) TSharedIndex sdIndex[10]; // Sensor index TSharedSensor sdSensor[100]; // sensor info TSharedInfo sdInfo; // misc. info unsigned char sdStart[41]; // start time unsigned char sdCurrent[41]; // current time unsigned char sdPath[256]; // MBM path } TSharedData; class CMBM { private : HANDLE hMapFile; TSharedData *data;
-
achso: ich verwende übrigens visual c++.net 7.0 std.
-
Jo, daran könnte es liegen.
VS.net benutzt standardmässig ein Data-Align von 8Byte, bei VC6.0 sind es 4Byte, soviel ich weiss.Du solltest das also entweder schon in den Projekteigenschaften ändern, oder an den Anfang der Header-Datei ein #pragma pack( push, 4) und am Ende ein #pragma pack(pop) schreiben.
-
Original erstellt von RenéG:
**bei VC6.0 sind es 4Byte, soviel ich weiss.
**Afaik sind es beim 6er auch 8.
-
Wenn ich mir die Strukturen ansehe, würde ich sogar davon ausgehen, dass es sich hierbei um Byte-aligned Strukturen handelt. Einfach mal ausprobieren!
-
ich kanns jetzt leider nicht ausprobieren, aber erst mal vielen, vielen dank!!
aber was bedeutet überhaupt Data-Align od. Byte-Align??
-
hi!
habs ausprobiert - geht leider nicht
-- ich hab alle einstellungen von 1-16 durchprobiert und das ganze auch noch mal durch die compileroptionen statt durch pack probiert
man sieht zwar beim debuggen, dass sich dadurch die daten verschieben aber sie sind nie richtig....
kann es evtl. darin liegen, dass mbm mit delphi geschrieben wurde (glaube ich) und das dort das data-aligning anders ist??
es muss doch irgendwie gehen
-
Dann schau doch mal, ab welchem Struktureintrag die Werte falsch sind, schon ab dem 1. oder erst ab einem bestimmten Offset?
Möglicherweise wird das enum von Delphi anders behandelt. Bei C++ sind es auf alle Fälle immer 32bit.
-
hm...
also bei data (TSharedData) sind die daten von sdVersion und sdIndex i.O. aber ab dann ist nur noch müll drin.
allerdings werden in sdIndex auch schon die enum verwendet...
ich habe noch beispiel code gefunden, der allerdings für eine ältere version von mbm ist und deswegen nicht geht - allerdings wird dort die borland c++ anweisung
#pragma package(smart_init)
verwendet. die geht leider unter vc++.net nicht aber evtl. gibt es ein passendes gegenstück dazu unter vc (wenn es nicht pack ist)
-
RenéG: Das war der richtige Tipp!!!!!! THX!!!!!!!
:p:p
:p
Delphi scheint enums nur als 8 Bit zu speichern....
Kaum nimmt man statt der enums BYTE ist alles i.O.
thx!!!!!
seit tagen bin ich an nix anderem dran als diesem kram.... und in drei wochen muss das prog zur messe fertig sein... also nochmal Danke!!!