Author |
Topic: cpuspeed program expansion.... (Read 730 times) |
|
Yshua
New Member
member is offline


Posts: 6
|
 |
cpuspeed program expansion....
« Thread started on: Jul 16th, 2015, 5:45pm » |
|
Dear BBC BASIC forum people:
Have a program running successfully, an expansion of cpuspeed.com, as follows:
REM Get CPU clock speed using Windows Management Instrumentation (WMI) REM Adapted from http://www.codeproject.com/KB/system/UsingWMI.aspx REM Richard Russell, http://www.rtrussell.co.uk/, 18-Sep-2010
REM Load OLE32 library: SYS "LoadLibrary", "OLE32.DLL" TO ole32% SYS "GetProcAddress", ole32%, "CoInitializeEx" TO `CoInitializeEx` SYS "GetProcAddress", ole32%, "CoUninitialize" TO `CoUninitialize` SYS "GetProcAddress", ole32%, "CoCreateInstance" TO `CoCreateInstance` SYS "GetProcAddress", ole32%, "CoSetProxyBlanket" TO `CoSetProxyBlanket` SYS "GetProcAddress", ole32%, "CLSIDFromString" TO `CLSIDFromString`
REM Define constants: RPC_C_AUTHN_LEVEL_CALL = 3 RPC_C_AUTHN_WINNT = 10 RPC_C_AUTHZ_NONE = 0 RPC_C_IMP_LEVEL_IMPERSONATE = 3 WBEM_FLAG_FORWARD_ONLY = &20
CLSID_WbemLocator% = FNguid("{4590f811-1d3a-11d0-891f-00aa004b2e24}") IID_IWbemLocator% = FNguid("{dc12a687-737f-11cf-884d-00aa004b2e24}") CLSCTX_INPROC_SERVER = 1
REM Define COM interfaces: DIM IWbemLocator{QueryInterface%, AddRef%, Release%, ConnectServer%}
DIM IWbemServices{QueryInterface%, AddRef%, Release%, OpenNameSpace%, \ \ CancelAsyncCall%, QueryObjectSink%, GetObject%, GetObjectAsync%, \ \ PutClass%, PutClassAsync%, DeleteClass%, DeleteClassAsync%, \ \ CreateClassEnum%, CreateClassEnumAsync%, PutInstance%, PutInstanceAsync%, \ \ DeleteInstance%, DeleteInstanceAsync%, CreateInstanceEnum%, \ \ CreateInstanceEnumAsync%, ExecQuery%, ExecQueryAsync%, \ \ ExecNotificationQuery%, ExecNotificationQueryAsync%, ExecMethod%, \ \ ExecMethodAsync%}
DIM IEnumWbemClassObject{QueryInterface%, AddRef%, Release%, \ \ Reset%, Next%, NextAsync%, Clone%, Skip%}
DIM IWbemClassObject{QueryInterface%, AddRef%, Release%, \ \ GetQualifierSet%, Get%, Put%, Delete%, GetNames%, BeginEnumeration%, \ \ Next%, EndEnumeration%, GetPropertyQualifierSet%, Clone%, GetObjectText%, \ \ SpawnDerivedClass%, SpawnInstance%, CompareTo%, GetPropertyOrigin%, \ \ InheritsFrom%, GetMethod%, PutMethod%, DeleteMethod%, \ \ BeginMethodEnumeration%, NextMethod%, EndMethodEnumeration%, \ \ GetMethodQualifierSet%, GetMethodOrigin%}
REM Initialise COM: SYS `CoInitializeEx`, 0, 0
ON ERROR PROCcleanup : SYS "MessageBox", @hwnd%, REPORT$, 0, 48 : QUIT ON CLOSE PROCcleanup : QUIT
REM Get CPU speed using WMI:
SYS `CoCreateInstance`, CLSID_WbemLocator%, 0, CLSCTX_INPROC_SERVER, \ \ IID_IWbemLocator%, ^pLoc% TO hr% IF hr% THEN ERROR 100, "Could not create IWbemLocator interface" !(^IWbemLocator{}+4) = !pLoc%
SYS IWbemLocator.ConnectServer%, pLoc%, FNwide("root\cimv2"), \ \ 0, 0, 0, 0, 0, 0, ^pSvc% TO hr% IF hr% THEN ERROR 100, "Could not create IWbemServices interface" !(^IWbemServices{}+4) = !pSvc%
SYS `CoSetProxyBlanket`, pSvc%, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, 0, \ \ RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, 0, 0 TO hr% IF hr% THEN ERROR 100, "Could not set proxy blanket"
query$ = FNwide("SELECT * FROM Win32_Processor") lang$ = FNwide("WQL") SYS IWbemServices.ExecQuery%, pSvc%, lang$, query$, \ \ WBEM_FLAG_FORWARD_ONLY, 0, ^pEnum% TO hr% IF hr% THEN ERROR 100, "Could not query Win32_Processor enumerator" !(^IEnumWbemClassObject{}+4) = !pEnum%
SYS IEnumWbemClassObject.Next%, pEnum%, -1, 1, ^pCPU%, ^nret% TO hr% IF hr% THEN ERROR 100, "Could not enumerate Win32_Processor object" !(^IWbemClassObject{}+4) = !pCPU%
DIM var{vartype{l&,h&},reserved&(5),ldata%,hdata%} SYS IWbemClassObject.Get%, pCPU%, FNwide("CurrentClockSpeed"), 0, \ \ var{}, 0, 0 TO hr% IF hr% THEN ERROR 100, "Could not get processor clock speed"
PRINT "CPU #0 clock speed = " ; var.ldata% AND &FFFF ; " MHz"
DIM var{vartype{l&,h&},reserved&(5),ldata%,hdata%} SYS IWbemClassObject.Get%, pCPU%, FNwide("DataWidth"), 0, \ \ var{}, 0, 0 TO hr% IF hr% THEN ERROR 100, "Could not get data width"
PRINT "data width = " ; var.ldata% AND &FFFF
DIM var{vartype{l&,h&},reserved&(5),ldata%,hdata%} SYS IWbemClassObject.Get%, pCPU%, FNwide("Description"), 0, \ \ var{}, 0, 0 TO hr% IF hr% THEN ERROR 100, "Could not get processor description"
DIM cpu{desc&(256)} SYS "WideCharToMultiByte", 0, 0, var.ldata%, -1, cpu{}, 256, 0, 0 PRINT "CPU #0 description = """ cpu.desc&() """"
DIM var{vartype{l&,h&},reserved&(5),ldata%,hdata%} SYS IWbemClassObject.Get%, pCPU%, FNwide("Manufacturer"), 0, \ \ var{}, 0, 0 TO hr% IF hr% THEN ERROR 100, "Could not get Manufacturer"
DIM cpu{desc&(256)} SYS "WideCharToMultiByte", 0, 0, var.ldata%, -1, cpu{}, 256, 0, 0 PRINT "CPU #0 description = """ cpu.desc&() """"
DIM var{vartype{l&,h&},reserved&(5),ldata%,hdata%} SYS IWbemClassObject.Get%, pCPU%, FNwide("Revision"), 0, \ \ var{}, 0, 0 TO hr% IF hr% THEN ERROR 100, "Could not get revision"
PRINT "Revision number = " ; var.ldata% AND &FFFF ; "."
PROCcleanup
END
DEF PROCcleanup pCPU% += 0 : IF pCPU% SYS !(!pCPU%+8), pCPU% : pCPU% = 0 pEnum% += 0 : IF pEnum% SYS !(!pEnum%+8), pEnum% : pEnum% = 0 pSvc% += 0 : IF pSvc% SYS !(!pSvc%+8), pSvc% : pSvc% = 0 pLoc% += 0 : IF pLoc% SYS !(!pLoc%+8), pLoc% : pLoc% = 0 SYS `CoUninitialize` ENDPROC
DEF FNwide(A$) LOCAL M$ M$ = STRING$(2*LENA$+2,CHR$0) SYS "MultiByteToWideChar", 0, 0, A$, -1, M$, LENA$+1 = M$
DEF FNguid(A$) LOCAL C%, M% DIM C% 15, M% LOCAL 2*LENA$+1 SYS "MultiByteToWideChar", 0, 0, A$, -1, M%, LENA$+1 SYS `CLSIDFromString`, M%, C% = C%
Now when even just one more WMI attribute is added, such as,
DIM cpu{desc&(256)} SYS "WideCharToMultiByte", 0, 0, var.ldata%, -1, cpu{}, 256, 0, 0 PRINT "CPU #0 description = """ cpu.desc&() """"
DIM var{vartype{l&,h&},reserved&(5),ldata%,hdata%} SYS IWbemClassObject.Get%, pCPU%, FNwide("InstallDate"), 0, \ \ var{}, 0, 0 TO hr% IF hr% THEN ERROR 100, "Could not get install date"
after the CPU Description attribute, this attribute simply repeats the CPU Description. Also is there a limit to how many attributes can be printed out in the program?
Thanks sooo much, Yshua
|
|
Logged
|
|
|
|
rtr2
Guest
|
 |
Re: cpuspeed program expansion....
« Reply #1 on: Jul 16th, 2015, 9:14pm » |
|
on Jul 16th, 2015, 5:45pm, Yshua wrote:Now when even just one more WMI attribute is added, such as... "InstallDate"... this attribute simply repeats the CPU Description. |
|
It doesn't "repeat" the CPU Description, that string is simply left over from the previous operation. If you had checked the returned VARTYPE you would have seen that it is VT_NULL, which I suspect simply means that the InstallDate property is not available for the processor.
Quote:Also is there a limit to how many attributes can be printed out in the program? |
|
No.
Richard.
|
|
Logged
|
|
|
|
|