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