Shared Memory



  • Hallo,
    Ich hab da mal eine Frage zu einem bestimmten Programm, das wäre, Motherboard Monitor 5.xxx.
    Das Ding hat Shared Memory, also bietet es anderen Programmen an, z.B. die Temperatur der CPU zu ermitteln.
    Die haben auf der Seite auch ein Beispiel Programm in c/c++, aber das gibt bei mir keine ordentlichen Werte aus, also habe ich mir ein fertiges Programm mit Quellcode (Delphi oder so...) runtergeladen und getestet, das funktioniert, nur kann ich diesen Code natürlich nicht in meinem Programm (C/C++) einbinden und habe deshalb versucht, es zu 'übersetzen', und siehe da, das selbe ergebnis wie bei dem Code-Schnipsel auf ihrer HP. Woran kann das liegen? Wer es sich mal angucken will : http://mbm.livewiredev.com und dann shared memory...

    hier mein Ansatz :

    #include <windows.h>
    #include <stdio.h>
    #include "cmbm.h"
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
    {
     TSharedData *data;
     char temp[1024];
     double test;
     HANDLE SHandle = OpenFileMapping(FILE_MAP_READ, FALSE, "$M$B$M$5$S$D$");
    
     if(SHandle == INVALID_HANDLE_VALUE)
     {MessageBox(NULL, "Konnte den Shared Memory von MBM 5 nicht öffnen!", "Fehler!", NULL);return 1;}
    
     data = (TSharedData *)MapViewOfFile(SHandle, FILE_MAP_READ, 0, 0, 0);
    
     if(data == NULL)
     {MessageBox(NULL, "Konnte den Shared Memory von MBM 5 nicht lesen!", "Fehler!", NULL);return 1;}
    
     test = data->sdSensor[0].ssCurrent;
     sprintf(temp, "aktuelle CPU - Temperatur : %g", test);
     MessageBox(NULL, temp, "TotalCount = ", NULL);
     UnmapViewOfFile(data);
     CloseHandle(SHandle);
     return 0;
    }
    

    cmbm.h :

    #include <windows.h>
    
    typedef enum { btISA, btSMBus, btVIA686ABus, btDirectIO } TBusType;
    typedef enum { smtSMBIntel, smtSMBAMD, smtSMBALi, smtSMBNForce, smtSMBSIS } TSMBType;
    typedef enum { stUnknown, stTemperature, stVoltage, stFan, stMhz, stPercentage } TSensorType;
    
    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;
    

    danke



  • Was für einen Fehler bekommst du denn beim compilieren?



  • keinen, er vertauscht nur die Werte,

    data->sdSensor[0].ssCurrent müsste z.B. die aktuelle CPu-Temperatur sein, ist aber die niedrigste Temperatur seit dem Start von MBM5 (Motherboard Monitor)...

    Ich dachte mir schon vielleicht, dass ich die Struktur nicht richtig hätte, und er deshalb ein paar Werte 'vergisst'...
    Kann das mal jemand für mich überprüfen? Ich kann leider kein Delphi, und komme daher mit der 'Übersetzung' nicht wirklich klar (nur die Struktur).

    Danke



  • Ok, ich habs schon...
    hab jetzt die Struktur von dem C-Beispiel genommen (funzt), nicht das von C++, hab mir den Unterschied noch nicht genauer angeguckt, werde es aber heut noch machen...

    Danke trotzdem


Anmelden zum Antworten