Problem with access to shared memory(W2K) / ORIGINALLY (win32) speedfan api control
Thomas Heller
theller at python.net
Wed Apr 6 14:28:01 EDT 2005
"Claudio Grondi" <claudio.grondi at freenet.de> writes:
> Background information:
> ---------------------------------
> in order to monitor mainboard sensory data
> as fan speeds, temperatures, applications
> like SpeedFan http://www.almico.com/speedfan.php
> or MBM http://mbm.livewiredev.com/
> can be used.
> Both of the mentioned apps expose data got
> from the hardware in a shared memory area.
>
> The goal to achieve:
> ---------------------------
> is to supervise the motherboard sensory
> data from within a Python script
>
> The approach:
> -------------------
> access to the shared memory area
> exposed by motherboard hardware
> querying apps from Python script.
For the mistake you made see below, hope that helps.
For the general way to solve this problem you should know that you can
access a shared memory area with a certain name also with Python's mmap
module, although that is probably not documented very good. There was a
recipe posted a few days ago which showed different ways to acces shared
memory, with or without ctypes.
> The problem:
> -----------------
> the below listed script code returns
> always same values, what
> leads to the conclusion, that something
> is going wrong.
>
> Can anyone help?
>
> Thanks in advance
>
> Claudio
>
> The code
> -------------
> I use is provided also here:
> http://www.codecomments.com/Python/message430495.html
> http://mail.python.org/pipermail/python-list/2005-March/271853.html
> (the mmap part of it doesn't work at all)
>
> from ctypes import *
>
> class Buffer(Structure):
> # just to see if any useful data can be acquired
> _fields_ = [
> ("Data0", c_longlong)
> ,("Data1", c_longlong)
> ,("Data2", c_longlong)
> ,("Data3", c_longlong)
> ,("Data4", c_longlong)
> ,("Data5", c_longlong)
> ,("Data6", c_longlong)
> ,("Data7", c_longlong)
> ,("Data8", c_longlong)
> ,("Data9", c_longlong)
> ,("DataA", c_longlong)
> ,("DataB", c_longlong)
> ,("DataC", c_longlong)
> ,("DataD", c_longlong)
> ,("DataE", c_longlong)
> ,("DataF", c_longlong)
> ]
>
> szName = c_char_p("SFSharedMemory_ALM") # SpeedFan
> szName = c_char_p("$M$B$M$5$S$D$") # MBM
> # szName = c_char_p("blabla") # not existing shared memory
>
> FILE_MAP_ALL_ACCESS = 0xF001F
> FALSE = 0
>
> hMapObject = windll.kernel32.OpenFileMappingA(
> FILE_MAP_ALL_ACCESS
> ,FALSE
> ,szName
> )
> if (hMapObject == 0):
> print "Could not open file mapping object"
> raise WinError()
>
> pBuf = windll.kernel32.MapViewOfFile(
> hMapObject
> ,FILE_MAP_ALL_ACCESS
> ,0
> ,0
> ,0
> )
>
> if (pBuf == 0):
> print "Could not map view of file"
> raise WinError()
> else:
> print repr(pBuf)
> print repr(hMapObject)
>
> pBuf_str = cast(pBuf, c_char_p)
> print repr(pBuf_str.value)
> print repr(pBuf_str)
>
> pBuf_buf = cast(pBuf, Buffer)
Here's the problem. pBuf is a pointer to a Buffer structure, not the
buffer structure itself.
Something like
pBuf_buf = Buffer.from_address(pBuf)
may work.
Thomas
More information about the Python-list
mailing list