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


Anmelden zum Antworten