Hi,
Is it possible to read GPU card info in a windos computer
to know what GPU card is installed, Manufacture, Model, Type ...
thanks,
marc
GPU card info ...
GPU card info ...
- every professional was once an amateur - greetings from Pajottenland - Belgium -
PS: sorry for my english I speak flemish ...
PS: sorry for my english I speak flemish ...
Re: GPU card info ...
Here a Version of WMI by nco2k, some Changes by me (i can't find the thread by nco2k)
Code: Select all
;WMI by nco2k for PureBasic 5.41 LTS
#RPC_C_AUTHN_WINNT = 10
#RPC_C_AUTHN_LEVEL_CALL = 3
#RPC_C_AUTHN_LEVEL_PKT_PRIVACY = 6
#RPC_C_AUTHZ_NONE = 0
#RPC_C_IMP_LEVEL_IMPERSONATE = 3
#RPC_E_CHANGED_MODE = $80010106
#EOAC_NONE = 0
#CLSCTX_INPROC_SERVER = $1
#WBEM_FLAG_ALWAYS = 0
#WBEM_FLAG_RETURN_IMMEDIATELY = 16
#WBEM_FLAG_FORWARD_ONLY = 32
#WBEM_FLAG_NONSYSTEM_ONLY = 64
#WBEM_INFINITE = -1
Structure DECIMAL2
wReserved.w
scale.b
sign.b
Hi32.l
Lo64.q
EndStructure
Structure VARIANT2
vt.w
wReserved1.w
wReserved2.w
wReserved3.w
StructureUnion
llVal.q
lVal.l
bVal.b
iVal.w
fltVal.f
dblVal.d
boolVal.w
bool.w
scode.l
cyVal.q
date.d
bstrVal.i
*punkVal.IUnknown
*pdispVal.IDispatch
*parray
*pbVal.BYTE
*piVal.WORD
*plVal.LONG
*pllVal.QUAD
*pfltVal.FLOAT
*pdblVal.DOUBLE
*pboolVal.WORD
*pbool.WORD
*pscode.LONG
*pcyVal.QUAD
*pdate.DOUBLE
*pbstrVal.INTEGER
*ppunkVal.INTEGER
*ppdispVal.INTEGER
*pparray.INTEGER
*pvarVal.VARIANT2
*byref
cVal.b
uiVal.w
ulVal.l
ullVal.q
intVal.l
uintVal.l
*pdecVal.DECIMAL2
*pcVal.BYTE
*puiVal.WORD
*pulVal.LONG
*pullVal.QUAD
*pintVal.LONG
*puintVal.LONG
brecord.VARIANT_BRECORD
decVal.DECIMAL2
EndStructureUnion
EndStructure
Import "OleAut32.lib"
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
SysAllocString2_(String.p-unicode) As "_SysAllocString"
SysFreeString2_(*String) As "_SysFreeString"
CompilerElse
SysAllocString2_(String.p-unicode) As "SysAllocString"
SysFreeString2_(*String) As "SysFreeString"
CompilerEndIf
EndImport
Procedure$ WMI(WQL$, flag = 0)
Protected Result$, QuerySelect$, QuerySelectIndex, PropertyList$, PropertyListIndex, PropertyListSize, PropertyListElement$, *PropertyArray, PropertyArrayIndex, PropertyArrayOffset.l, PropertyArraySize.l, PropertyArrayDimensions, PropertyArrayElement$, BufferArrayIndex, BufferArrayOffset.l, BufferArraySize.l, BufferArrayDimensions, BufferArrayElement$
Protected CoInit, *SysRoot, *SysLanguage, *SysQuery, *SysArray, *SysList, ClassObjectSize, iwbemlocator.IWbemLocator, iwbemservices.IWbemServices, ienumwbemclassobject.IEnumWbemClassObject, iwbemclassobject.IWbemClassObject, variant.VARIANT2, VarByte.b, VarWord.w, VarLong.l, VarQuad.q, VarFloat.f, VarDouble.d, *VarString, *VarArray
If UCase(Left(WQL$, 7)) = "SELECT "
QuerySelectIndex = FindString(WQL$, " FROM ", 9, #PB_String_NoCase)
If QuerySelectIndex
QuerySelect$ = Trim(Mid(WQL$, 8, QuerySelectIndex - 8))
EndIf
EndIf
If QuerySelect$
;CoInit = CoInitializeEx_(0, #COINIT_APARTMENTTHREADED | #COINIT_DISABLE_OLE1DDE)
CoInit = CoInitializeEx_(0, #COINIT_MULTITHREADED)
If CoInit = #S_OK Or CoInit = #S_FALSE Or CoInit = #RPC_E_CHANGED_MODE
If CoInitializeSecurity_(0, -1, 0, 0, #RPC_C_AUTHN_LEVEL_PKT_PRIVACY, #RPC_C_IMP_LEVEL_IMPERSONATE, 0, #EOAC_NONE, 0) = #ERROR_SUCCESS And CoCreateInstance_(?CLSID_WbemLocator, 0, #CLSCTX_INPROC_SERVER, ?IID_IWbemLocator, @iwbemlocator) = #ERROR_SUCCESS
If flag
*SysRoot = SysAllocString2_("Root\StandardCimv2")
Else
*SysRoot = SysAllocString2_("ROOT\CIMV2")
EndIf
If *SysRoot
If iwbemlocator\ConnectServer(*SysRoot, 0, 0, 0, 0, 0, 0, @iwbemservices) = #ERROR_SUCCESS
If CoSetProxyBlanket_(iwbemservices, #RPC_C_AUTHN_WINNT, #RPC_C_AUTHZ_NONE, 0, #RPC_C_AUTHN_LEVEL_CALL, #RPC_C_IMP_LEVEL_IMPERSONATE, 0, #EOAC_NONE) = #ERROR_SUCCESS
*SysLanguage = SysAllocString2_("WQL")
If *SysLanguage
*SysQuery = SysAllocString2_(WQL$)
If *SysQuery
If iwbemservices\ExecQuery(*SysLanguage, *SysQuery, #WBEM_FLAG_FORWARD_ONLY | #WBEM_FLAG_RETURN_IMMEDIATELY, 0, @ienumwbemclassobject) = #ERROR_SUCCESS
While ienumwbemclassobject\Next(#WBEM_INFINITE, 1, @iwbemclassobject, @ClassObjectSize) = #ERROR_SUCCESS And ClassObjectSize = 1
If QuerySelect$ <> "*"
PropertyList$ = QuerySelect$+","
Else
PropertyList$ = ""
*PropertyArray = #False
If iwbemclassobject\GetNames(0, #WBEM_FLAG_ALWAYS | #WBEM_FLAG_NONSYSTEM_ONLY, 0, @*PropertyArray) = #ERROR_SUCCESS And *PropertyArray
PropertyArrayDimensions = SafeArrayGetDim_(*PropertyArray)
If PropertyArrayDimensions = 1 And SafeArrayGetLBound_(*PropertyArray, PropertyArrayDimensions, @PropertyArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*PropertyArray, PropertyArrayDimensions, @PropertyArraySize) = #ERROR_SUCCESS
For PropertyArrayIndex = PropertyArrayOffset To PropertyArraySize
If SafeArrayGetElement_(*PropertyArray, @PropertyArrayIndex, @*SysArray) = #ERROR_SUCCESS And *SysArray
PropertyArrayElement$ = PeekS(*SysArray, -1, #PB_Unicode)
If PropertyArrayElement$
PropertyList$+PropertyArrayElement$+","
EndIf
SysFreeString2_(*SysArray)
EndIf
Next
EndIf
SafeArrayDestroy_(*PropertyArray)
EndIf
EndIf
If PropertyList$
PropertyListSize = CountString(PropertyList$, ",")
For PropertyListIndex = 1 To PropertyListSize
PropertyListElement$ = Trim(StringField(PropertyList$, PropertyListIndex, ","))
If PropertyListElement$
*SysList = SysAllocString2_(PropertyListElement$)
If *SysList
If iwbemclassobject\Get(*SysList, 0, @variant, 0, 0) = #ERROR_SUCCESS
Select variant\vt
Case #VT_EMPTY, #VT_NULL, #VT_VOID, #VT_BYREF | #VT_EMPTY, #VT_BYREF | #VT_NULL, #VT_BYREF | #VT_VOID
Result$+PropertyListElement$+"="+#CRLF$
Case #VT_BOOL, #VT_BYREF | #VT_BOOL
If variant\vt & #VT_BYREF <> #VT_BYREF
VarWord = variant\boolVal
Else
VarWord = variant\pboolVal\w
EndIf
If VarWord
Result$+PropertyListElement$+"=1"+#CRLF$
Else
Result$+PropertyListElement$+"=0"+#CRLF$
EndIf
Case #VT_I1, #VT_BYREF | #VT_I1
If variant\vt & #VT_BYREF <> #VT_BYREF
VarByte = variant\cVal
Else
VarByte = variant\pcVal\b
EndIf
Result$+PropertyListElement$+"="+Str(VarByte)+#CRLF$
Case #VT_UI1, #VT_BYREF | #VT_UI1
If variant\vt & #VT_BYREF <> #VT_BYREF
VarByte = variant\bVal
Else
VarByte = variant\pbVal\b
EndIf
Result$+PropertyListElement$+"="+StrU(VarByte, #PB_Byte)+#CRLF$
Case #VT_I2, #VT_BYREF | #VT_I2
If variant\vt & #VT_BYREF <> #VT_BYREF
VarWord = variant\iVal
Else
VarWord = variant\piVal\w
EndIf
Result$+PropertyListElement$+"="+Str(VarWord)+#CRLF$
Case #VT_UI2, #VT_BYREF | #VT_UI2
If variant\vt & #VT_BYREF <> #VT_BYREF
VarWord = variant\uiVal
Else
VarWord = variant\puiVal\w
EndIf
Result$+PropertyListElement$+"="+StrU(VarWord, #PB_Word)+#CRLF$
Case #VT_I4, #VT_INT, #VT_BYREF | #VT_I4, #VT_BYREF | #VT_INT
If variant\vt & #VT_BYREF <> #VT_BYREF
VarLong = variant\lVal
Else
VarLong = variant\plVal\l
EndIf
Result$+PropertyListElement$+"="+Str(VarLong)+#CRLF$
Case #VT_UI4, #VT_UINT, #VT_ERROR, #VT_BYREF | #VT_UI4, #VT_BYREF | #VT_UINT, #VT_BYREF | #VT_ERROR
If variant\vt & #VT_BYREF <> #VT_BYREF
VarLong = variant\ulVal
Else
VarLong = variant\pulVal\l
EndIf
Result$+PropertyListElement$+"="+StrU(VarLong, #PB_Long)+#CRLF$
Case #VT_I8, #VT_CY, #VT_BYREF | #VT_I8, #VT_BYREF | #VT_CY
If variant\vt & #VT_BYREF <> #VT_BYREF
VarQuad = variant\llVal
Else
VarQuad = variant\pllVal\q
EndIf
Result$+PropertyListElement$+"="+Str(VarQuad)+#CRLF$
Case #VT_UI8, #VT_BYREF | #VT_UI8
If variant\vt & #VT_BYREF <> #VT_BYREF
VarQuad = variant\ullVal
Else
VarQuad = variant\pullVal\q
EndIf
Result$+PropertyListElement$+"="+StrU(VarQuad, #PB_Quad)+#CRLF$
Case #VT_R4, #VT_BYREF | #VT_R4
If variant\vt & #VT_BYREF <> #VT_BYREF
VarFloat = variant\fltVal
Else
VarFloat = variant\pfltVal\f
EndIf
Result$+PropertyListElement$+"="+StrF(VarFloat)+#CRLF$
Case #VT_R8, #VT_DATE, #VT_BYREF | #VT_R8, #VT_BYREF | #VT_DATE
If variant\vt & #VT_BYREF <> #VT_BYREF
VarDouble = variant\dblVal
Else
VarDouble = variant\pdblVal\d
EndIf
Result$+PropertyListElement$+"="+StrD(VarDouble)+#CRLF$
Case #VT_LPSTR, #VT_BYREF | #VT_LPSTR
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarString = variant\bstrVal
Else
*VarString = variant\pbstrVal\i
EndIf
If *VarString
Result$+PropertyListElement$+"="+PeekS(*VarString, -1, #PB_Ascii)+#CRLF$
Else
Result$+PropertyListElement$+"="+#CRLF$
EndIf
Case #VT_LPWSTR, #VT_BSTR, #VT_BYREF | #VT_LPWSTR, #VT_BYREF | #VT_BSTR
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarString = variant\bstrVal
Else
*VarString = variant\pbstrVal\i
EndIf
If *VarString
Result$+PropertyListElement$+"="+PeekS(*VarString, -1, #PB_Unicode)+#CRLF$
Else
Result$+PropertyListElement$+"="+#CRLF$
EndIf
Case #VT_ARRAY | #VT_EMPTY, #VT_ARRAY | #VT_NULL, #VT_ARRAY | #VT_VOID, #VT_BYREF | #VT_ARRAY | #VT_EMPTY, #VT_BYREF | #VT_ARRAY | #VT_NULL, #VT_BYREF | #VT_ARRAY | #VT_VOID
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarArray = variant\parray
Else
*VarArray = variant\pparray\i
EndIf
If *VarArray
BufferArrayDimensions = SafeArrayGetDim_(*VarArray)
If BufferArrayDimensions = 1 And SafeArrayGetLBound_(*VarArray, BufferArrayDimensions, @BufferArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*VarArray, BufferArrayDimensions, @BufferArraySize) = #ERROR_SUCCESS
BufferArrayElement$ = ""
For BufferArrayIndex = BufferArrayOffset To BufferArraySize
BufferArrayElement$+#US$
Next
Result$+PropertyListElement$+"="+BufferArrayElement$+#CRLF$
EndIf
EndIf
Case #VT_ARRAY | #VT_BOOL, #VT_BYREF | #VT_ARRAY | #VT_BOOL
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarArray = variant\parray
Else
*VarArray = variant\pparray\i
EndIf
If *VarArray
BufferArrayDimensions = SafeArrayGetDim_(*VarArray)
If BufferArrayDimensions = 1 And SafeArrayGetLBound_(*VarArray, BufferArrayDimensions, @BufferArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*VarArray, BufferArrayDimensions, @BufferArraySize) = #ERROR_SUCCESS
BufferArrayElement$ = ""
For BufferArrayIndex = BufferArrayOffset To BufferArraySize
If SafeArrayGetElement_(*VarArray, @BufferArrayIndex, @VarWord) = #ERROR_SUCCESS
If VarWord
BufferArrayElement$+"1"+#US$
Else
BufferArrayElement$+"0"+#US$
EndIf
EndIf
Next
Result$+PropertyListElement$+"="+BufferArrayElement$+#CRLF$
EndIf
EndIf
Case #VT_ARRAY | #VT_I1, #VT_BYREF | #VT_ARRAY | #VT_I1
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarArray = variant\parray
Else
*VarArray = variant\pparray\i
EndIf
If *VarArray
BufferArrayDimensions = SafeArrayGetDim_(*VarArray)
If BufferArrayDimensions = 1 And SafeArrayGetLBound_(*VarArray, BufferArrayDimensions, @BufferArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*VarArray, BufferArrayDimensions, @BufferArraySize) = #ERROR_SUCCESS
BufferArrayElement$ = ""
For BufferArrayIndex = BufferArrayOffset To BufferArraySize
If SafeArrayGetElement_(*VarArray, @BufferArrayIndex, @VarByte) = #ERROR_SUCCESS
BufferArrayElement$+Str(VarByte)+#US$
EndIf
Next
Result$+PropertyListElement$+"="+BufferArrayElement$+#CRLF$
EndIf
EndIf
Case #VT_ARRAY | #VT_UI1, #VT_BYREF | #VT_ARRAY | #VT_UI1
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarArray = variant\parray
Else
*VarArray = variant\pparray\i
EndIf
If *VarArray
BufferArrayDimensions = SafeArrayGetDim_(*VarArray)
If BufferArrayDimensions = 1 And SafeArrayGetLBound_(*VarArray, BufferArrayDimensions, @BufferArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*VarArray, BufferArrayDimensions, @BufferArraySize) = #ERROR_SUCCESS
BufferArrayElement$ = ""
For BufferArrayIndex = BufferArrayOffset To BufferArraySize
If SafeArrayGetElement_(*VarArray, @BufferArrayIndex, @VarByte) = #ERROR_SUCCESS
BufferArrayElement$+StrU(VarByte, #PB_Byte)+#US$
EndIf
Next
Result$+PropertyListElement$+"="+BufferArrayElement$+#CRLF$
EndIf
EndIf
Case #VT_ARRAY | #VT_I2, #VT_BYREF | #VT_ARRAY | #VT_I2
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarArray = variant\parray
Else
*VarArray = variant\pparray\i
EndIf
If *VarArray
BufferArrayDimensions = SafeArrayGetDim_(*VarArray)
If BufferArrayDimensions = 1 And SafeArrayGetLBound_(*VarArray, BufferArrayDimensions, @BufferArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*VarArray, BufferArrayDimensions, @BufferArraySize) = #ERROR_SUCCESS
BufferArrayElement$ = ""
For BufferArrayIndex = BufferArrayOffset To BufferArraySize
If SafeArrayGetElement_(*VarArray, @BufferArrayIndex, @VarWord) = #ERROR_SUCCESS
BufferArrayElement$+Str(VarWord)+#US$
EndIf
Next
Result$+PropertyListElement$+"="+BufferArrayElement$+#CRLF$
EndIf
EndIf
Case #VT_ARRAY | #VT_UI2, #VT_BYREF | #VT_ARRAY | #VT_UI2
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarArray = variant\parray
Else
*VarArray = variant\pparray\i
EndIf
If *VarArray
BufferArrayDimensions = SafeArrayGetDim_(*VarArray)
If BufferArrayDimensions = 1 And SafeArrayGetLBound_(*VarArray, BufferArrayDimensions, @BufferArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*VarArray, BufferArrayDimensions, @BufferArraySize) = #ERROR_SUCCESS
BufferArrayElement$ = ""
For BufferArrayIndex = BufferArrayOffset To BufferArraySize
If SafeArrayGetElement_(*VarArray, @BufferArrayIndex, @VarWord) = #ERROR_SUCCESS
BufferArrayElement$+StrU(VarWord, #PB_Word)+#US$
EndIf
Next
Result$+PropertyListElement$+"="+BufferArrayElement$+#CRLF$
EndIf
EndIf
Case #VT_ARRAY | #VT_I4, #VT_ARRAY | #VT_INT, #VT_BYREF | #VT_ARRAY | #VT_I4, #VT_BYREF | #VT_ARRAY | #VT_INT
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarArray = variant\parray
Else
*VarArray = variant\pparray\i
EndIf
If *VarArray
BufferArrayDimensions = SafeArrayGetDim_(*VarArray)
If BufferArrayDimensions = 1 And SafeArrayGetLBound_(*VarArray, BufferArrayDimensions, @BufferArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*VarArray, BufferArrayDimensions, @BufferArraySize) = #ERROR_SUCCESS
BufferArrayElement$ = ""
For BufferArrayIndex = BufferArrayOffset To BufferArraySize
If SafeArrayGetElement_(*VarArray, @BufferArrayIndex, @VarLong) = #ERROR_SUCCESS
BufferArrayElement$+Str(VarLong)+#US$
EndIf
Next
Result$+PropertyListElement$+"="+BufferArrayElement$+#CRLF$
EndIf
EndIf
Case #VT_ARRAY | #VT_UI4, #VT_ARRAY | #VT_UINT, #VT_ARRAY | #VT_ERROR, #VT_BYREF | #VT_ARRAY | #VT_UI4, #VT_BYREF | #VT_ARRAY | #VT_UINT, #VT_BYREF | #VT_ARRAY | #VT_ERROR
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarArray = variant\parray
Else
*VarArray = variant\pparray\i
EndIf
If *VarArray
BufferArrayDimensions = SafeArrayGetDim_(*VarArray)
If BufferArrayDimensions = 1 And SafeArrayGetLBound_(*VarArray, BufferArrayDimensions, @BufferArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*VarArray, BufferArrayDimensions, @BufferArraySize) = #ERROR_SUCCESS
BufferArrayElement$ = ""
For BufferArrayIndex = BufferArrayOffset To BufferArraySize
If SafeArrayGetElement_(*VarArray, @BufferArrayIndex, @VarLong) = #ERROR_SUCCESS
BufferArrayElement$+StrU(VarLong, #PB_Local)+#US$
EndIf
Next
Result$+PropertyListElement$+"="+BufferArrayElement$+#CRLF$
EndIf
EndIf
Case #VT_ARRAY | #VT_I8, #VT_ARRAY | #VT_CY, #VT_BYREF | #VT_ARRAY | #VT_I8, #VT_BYREF | #VT_ARRAY | #VT_CY
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarArray = variant\parray
Else
*VarArray = variant\pparray\i
EndIf
If *VarArray
BufferArrayDimensions = SafeArrayGetDim_(*VarArray)
If BufferArrayDimensions = 1 And SafeArrayGetLBound_(*VarArray, BufferArrayDimensions, @BufferArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*VarArray, BufferArrayDimensions, @BufferArraySize) = #ERROR_SUCCESS
BufferArrayElement$ = ""
For BufferArrayIndex = BufferArrayOffset To BufferArraySize
If SafeArrayGetElement_(*VarArray, @BufferArrayIndex, @VarQuad) = #ERROR_SUCCESS
BufferArrayElement$+Str(VarQuad)+#US$
EndIf
Next
Result$+PropertyListElement$+"="+BufferArrayElement$+#CRLF$
EndIf
EndIf
Case #VT_ARRAY | #VT_UI8, #VT_BYREF | #VT_ARRAY | #VT_UI8
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarArray = variant\parray
Else
*VarArray = variant\pparray\i
EndIf
If *VarArray
BufferArrayDimensions = SafeArrayGetDim_(*VarArray)
If BufferArrayDimensions = 1 And SafeArrayGetLBound_(*VarArray, BufferArrayDimensions, @BufferArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*VarArray, BufferArrayDimensions, @BufferArraySize) = #ERROR_SUCCESS
BufferArrayElement$ = ""
For BufferArrayIndex = BufferArrayOffset To BufferArraySize
If SafeArrayGetElement_(*VarArray, @BufferArrayIndex, @VarQuad) = #ERROR_SUCCESS
BufferArrayElement$+StrU(VarQuad, #PB_Quad)+#US$
EndIf
Next
Result$+PropertyListElement$+"="+BufferArrayElement$+#CRLF$
EndIf
EndIf
Case #VT_ARRAY | #VT_R4, #VT_BYREF | #VT_ARRAY | #VT_R4
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarArray = variant\parray
Else
*VarArray = variant\pparray\i
EndIf
If *VarArray
BufferArrayDimensions = SafeArrayGetDim_(*VarArray)
If BufferArrayDimensions = 1 And SafeArrayGetLBound_(*VarArray, BufferArrayDimensions, @BufferArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*VarArray, BufferArrayDimensions, @BufferArraySize) = #ERROR_SUCCESS
BufferArrayElement$ = ""
For BufferArrayIndex = BufferArrayOffset To BufferArraySize
If SafeArrayGetElement_(*VarArray, @BufferArrayIndex, @VarFloat) = #ERROR_SUCCESS
BufferArrayElement$+StrF(VarFloat)+#US$
EndIf
Next
Result$+PropertyListElement$+"="+BufferArrayElement$+#CRLF$
EndIf
EndIf
Case #VT_ARRAY | #VT_R8, #VT_ARRAY | #VT_DATE, #VT_BYREF | #VT_ARRAY | #VT_R8, #VT_BYREF | #VT_ARRAY | #VT_DATE
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarArray = variant\parray
Else
*VarArray = variant\pparray\i
EndIf
If *VarArray
BufferArrayDimensions = SafeArrayGetDim_(*VarArray)
If BufferArrayDimensions = 1 And SafeArrayGetLBound_(*VarArray, BufferArrayDimensions, @BufferArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*VarArray, BufferArrayDimensions, @BufferArraySize) = #ERROR_SUCCESS
BufferArrayElement$ = ""
For BufferArrayIndex = BufferArrayOffset To BufferArraySize
If SafeArrayGetElement_(*VarArray, @BufferArrayIndex, @VarDouble) = #ERROR_SUCCESS
BufferArrayElement$+StrD(VarDouble)+#US$
EndIf
Next
Result$+PropertyListElement$+"="+BufferArrayElement$+#CRLF$
EndIf
EndIf
Case #VT_ARRAY | #VT_LPSTR, #VT_BYREF | #VT_ARRAY | #VT_LPSTR
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarArray = variant\parray
Else
*VarArray = variant\pparray\i
EndIf
If *VarArray
BufferArrayDimensions = SafeArrayGetDim_(*VarArray)
If BufferArrayDimensions = 1 And SafeArrayGetLBound_(*VarArray, BufferArrayDimensions, @BufferArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*VarArray, BufferArrayDimensions, @BufferArraySize) = #ERROR_SUCCESS
BufferArrayElement$ = ""
For BufferArrayIndex = BufferArrayOffset To BufferArraySize
If SafeArrayGetElement_(*VarArray, @BufferArrayIndex, @*VarString) = #ERROR_SUCCESS
If *VarString
BufferArrayElement$+PeekS(*VarString, -1, #PB_Ascii)+#US$
SysFreeString2_(*VarString)
Else
BufferArrayElement$+#US$
EndIf
EndIf
Next
Result$+PropertyListElement$+"="+BufferArrayElement$+#CRLF$
EndIf
EndIf
Case #VT_ARRAY | #VT_LPWSTR, #VT_ARRAY | #VT_BSTR, #VT_BYREF | #VT_ARRAY | #VT_LPWSTR, #VT_BYREF | #VT_ARRAY | #VT_BSTR
If variant\vt & #VT_BYREF <> #VT_BYREF
*VarArray = variant\parray
Else
*VarArray = variant\pparray\i
EndIf
If *VarArray
BufferArrayDimensions = SafeArrayGetDim_(*VarArray)
If BufferArrayDimensions = 1 And SafeArrayGetLBound_(*VarArray, BufferArrayDimensions, @BufferArrayOffset) = #ERROR_SUCCESS And SafeArrayGetUBound_(*VarArray, BufferArrayDimensions, @BufferArraySize) = #ERROR_SUCCESS
BufferArrayElement$ = ""
For BufferArrayIndex = BufferArrayOffset To BufferArraySize
If SafeArrayGetElement_(*VarArray, @BufferArrayIndex, @*VarString) = #ERROR_SUCCESS
If *VarString
BufferArrayElement$+PeekS(*VarString, -1, #PB_Unicode)+#US$
SysFreeString2_(*VarString)
Else
BufferArrayElement$+#US$
EndIf
EndIf
Next
Result$+PropertyListElement$+"="+BufferArrayElement$+#CRLF$
EndIf
EndIf
EndSelect
VariantClear_(variant)
EndIf
SysFreeString2_(*SysList)
EndIf
EndIf
Next
EndIf
Wend
ienumwbemclassobject\Release()
EndIf
SysFreeString2_(*SysQuery)
EndIf
SysFreeString2_(*SysLanguage)
EndIf
EndIf
iwbemservices\Release()
EndIf
SysFreeString2_(*SysRoot)
EndIf
iwbemlocator\Release()
EndIf
; If CoInit <> #RPC_E_CHANGED_MODE
CoUninitialize_()
; EndIf
EndIf
EndIf
ProcedureReturn Result$
DataSection
CLSID_WbemLocator:
Data.l $4590F811
Data.w $1D3A, $11D0
Data.b $89, $1F, $00, $AA, $00, $4B, $2E, $24
IID_IWbemLocator:
Data.l $DC12A687
Data.w $737F, $11CF
Data.b $88, $4D, $00, $AA, $00, $4B, $2E, $24
EndDataSection
EndProcedure
Debug WMI("SELECT * FROM Win32_DisplayConfiguration")
PureBasic 5.73 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Re: GPU card info ...
just run it
Code: Select all
;Coder celtic88 2015(c)
DataSection
CLSID_WbemLocator:
Data.l $4590F811
Data.w $1D3A
Data.w $11D0
Data.b $89, $1F, $0, $AA, $0, $4B, $2E, $24
IID_IWbemLocator:
Data.l $DC12A687
Data.w $737F
Data.w $11CF
Data.b $88, $4D, $0, $AA, $0, $4B, $2E, $24
EndDataSection
#CLSCTX_INPROC_SERVER = $1
#WBEM_FLAG_RETURN_IMMEDIATELY = $10
#WBEM_FLAG_FORWARD_ONLY = $20
; #WBEM_INFINITE = $FFFFFFFF
#RPC_C_IMP_LEVEL_IMPERSONATE = 3
#RPC_C_AUTHN_LEVEL_DEFAULT = 0
#RPC_C_AUTHN_WINNT = 10
#RPC_C_AUTHZ_NONE = 0
#RPC_C_AUTHN_LEVEL_CALL=3
#EOAC_NONE = 0
;https://msdn.microsoft.com/en-us/library/aa394512(v=vs.85).aspx
Dim Win32_VideoController_class_Syntax.s(58)
Win32_VideoController_class_Syntax.s(0) = "AcceleratorCapabilities[]"
Win32_VideoController_class_Syntax.s(1) = "AdapterCompatibility"
Win32_VideoController_class_Syntax.s(2) = "AdapterDACType"
Win32_VideoController_class_Syntax.s(3) = "AdapterRAM"
Win32_VideoController_class_Syntax.s(4) = "Availability"
Win32_VideoController_class_Syntax.s(5) = "CapabilityDescriptions[]"
Win32_VideoController_class_Syntax.s(6) = "Caption"
Win32_VideoController_class_Syntax.s(7) = "ColorTableEntries"
Win32_VideoController_class_Syntax.s(8) = "ConfigManagerErrorCode"
Win32_VideoController_class_Syntax.s(9) = "ConfigManagerUserConfig"
Win32_VideoController_class_Syntax.s(10) = "CreationClassName"
Win32_VideoController_class_Syntax.s(11) = "CurrentBitsPerPixel"
Win32_VideoController_class_Syntax.s(12) = "CurrentHorizontalResolution"
Win32_VideoController_class_Syntax.s(13) = "CurrentNumberOfColors"
Win32_VideoController_class_Syntax.s(14) = "CurrentNumberOfColumns"
Win32_VideoController_class_Syntax.s(15) = "CurrentNumberOfRows"
Win32_VideoController_class_Syntax.s(16) = "CurrentRefreshRate"
Win32_VideoController_class_Syntax.s(17) = "CurrentScanMode"
Win32_VideoController_class_Syntax.s(18) = "CurrentVerticalResolution"
Win32_VideoController_class_Syntax.s(19) = "Description"
Win32_VideoController_class_Syntax.s(20) = "DeviceID"
Win32_VideoController_class_Syntax.s(21) = "DeviceSpecificPens"
Win32_VideoController_class_Syntax.s(22) = "DitherType"
Win32_VideoController_class_Syntax.s(23) = "DriverDate"
Win32_VideoController_class_Syntax.s(24) = "DriverVersion"
Win32_VideoController_class_Syntax.s(25) = "ErrorCleared"
Win32_VideoController_class_Syntax.s(26) = "ErrorDescription"
Win32_VideoController_class_Syntax.s(27) = "ICMIntent"
Win32_VideoController_class_Syntax.s(28) = "ICMMethod"
Win32_VideoController_class_Syntax.s(29) = "InfFilename"
Win32_VideoController_class_Syntax.s(30) = "InfSection"
Win32_VideoController_class_Syntax.s(31) = "InstallDate"
Win32_VideoController_class_Syntax.s(32) = "InstalledDisplayDrivers"
Win32_VideoController_class_Syntax.s(33) = "LastErrorCode"
Win32_VideoController_class_Syntax.s(34) = "MaxMemorySupported"
Win32_VideoController_class_Syntax.s(35) = "MaxNumberControlled"
Win32_VideoController_class_Syntax.s(36) = "MaxRefreshRate"
Win32_VideoController_class_Syntax.s(37) = "MinRefreshRate"
Win32_VideoController_class_Syntax.s(38) = "Monochrome"
Win32_VideoController_class_Syntax.s(39) = "Name"
Win32_VideoController_class_Syntax.s(40) = "NumberOfColorPlanes"
Win32_VideoController_class_Syntax.s(41) = "NumberOfVideoPages"
Win32_VideoController_class_Syntax.s(42) = "PNPDeviceID"
Win32_VideoController_class_Syntax.s(43) = "PowerManagementCapabilities[]"
Win32_VideoController_class_Syntax.s(44) = "PowerManagementSupported"
Win32_VideoController_class_Syntax.s(45) = "ProtocolSupported"
Win32_VideoController_class_Syntax.s(46) = "ReservedSystemPaletteEntries"
Win32_VideoController_class_Syntax.s(47) = "SpecificationVersion"
Win32_VideoController_class_Syntax.s(48) = "Status"
Win32_VideoController_class_Syntax.s(49) = "StatusInfo"
Win32_VideoController_class_Syntax.s(50) = "SystemCreationClassName"
Win32_VideoController_class_Syntax.s(51) = "SystemName"
Win32_VideoController_class_Syntax.s(52) = "SystemPaletteEntries"
Win32_VideoController_class_Syntax.s(53) = "TimeOfLastReset"
Win32_VideoController_class_Syntax.s(54) = "VideoArchitecture"
Win32_VideoController_class_Syntax.s(55) = "VideoMemoryType"
Win32_VideoController_class_Syntax.s(56) = "VideoMode"
Win32_VideoController_class_Syntax.s(57) = "VideoModeDescription"
Win32_VideoController_class_Syntax.s(58) = "VideoProcessor"
If CoInitializeEx_(0, #COINIT_MULTITHREADED) = #S_OK
If CoInitializeSecurity_(0, -1, 0, 0, #RPC_C_AUTHN_LEVEL_DEFAULT, #RPC_C_IMP_LEVEL_IMPERSONATE, 0, 0, 0) = #S_OK
locator.IWbemLocator
If CoCreateInstance_(?CLSID_WbemLocator, 0, #CLSCTX_INPROC_SERVER, ?IID_IWbemLocator, @locator) = #S_OK
services.IWbemServices
If locator\ConnectServer(@"ROOT\CIMV2", 0, 0, 0, 0, 0, 0, @services) = #S_OK
CoSetProxyBlanket_(services, #RPC_C_AUTHN_WINNT, #RPC_C_AUTHZ_NONE, 0, #RPC_C_AUTHN_LEVEL_CALL, #RPC_C_IMP_LEVEL_IMPERSONATE, 0, #EOAC_NONE);
e.IEnumWbemClassObject
If services\ExecQuery(@"WQL", @"SELECT * FROM Win32_VideoController", #WBEM_FLAG_RETURN_IMMEDIATELY | #WBEM_FLAG_FORWARD_ONLY, 0, @e) = #S_OK
Var.VARIANT
u.l
object.IWbemClassObject
While (e\Next(#WBEM_INFINITE, 1, @object, @u) = #S_OK)
For gg=0 To 58
CalssPro.s = Win32_VideoController_class_Syntax(gg)
VariantInit_(@Var);
If object\Get(@CalssPro, 0, @Var, 0, 0) = #S_OK
Select Var\vt
Case #VT_I4
Debug CalssPro + " : " + Str(Var\lVal)
Case #VT_DISPATCH
;
Case #VT_BSTR
Debug CalssPro + " : " + PeekS(Var\bstrVal)
Case #VT_EMPTY
;
EndSelect
VariantClear_(@Var);
EndIf
Next
object\Release()
Wend
e\Release()
EndIf
services\Release()
EndIf
locator\Release()
EndIf
EndIf
CoUninitialize_();
EndIf
interested in Cybersecurity..
Re: GPU card info ...
@ts-soft
you should only call CoUninitialize_() on success (#S_OK or #S_FALSE) and never on #RPC_E_CHANGED_MODE etc.
and why are you using #COINIT_MULTITHREADED? with a code like this, it doesnt make much sense to be honest.
c ya,
nco2k
you should only call CoUninitialize_() on success (#S_OK or #S_FALSE) and never on #RPC_E_CHANGED_MODE etc.
and why are you using #COINIT_MULTITHREADED? with a code like this, it doesnt make much sense to be honest.
oh and btw, you dont need WMI just for the caption: http://www.purebasic.fr/english/viewtop ... 45#p517445MSDN wrote:Apartment-threading, while allowing for multiple threads of execution, serializes all incoming calls by requiring that calls to methods of objects created by this thread always run on the same thread – the apartment/thread that created them. In addition, calls can arrive only at message-queue boundaries. Because of this serialization, it is not typically necessary to write concurrency control into the code for the object, other than to avoid calls to PeekMessage and SendMessage during processing that must not be interrupted by other method invocations or calls to other objects in the same apartment/thread.
Multi-threading (also called free-threading) allows calls to methods of objects created by this thread to be run on any thread. There is no serialization of calls – many calls may occur to the same method or to the same object or simultaneously. Multi-threaded object concurrency offers the highest performance and takes the best advantage of multiprocessor hardware for cross-thread, cross-process, and cross-machine calling, since calls to objects are not serialized in any way. This means, however, that the code for objects must enforce its own concurrency model, typically through the use of synchronization primitives, such as critical sections, semaphores, or mutexes. In addition, because the object doesn't control the lifetime of the threads that are accessing it, no thread-specific state may be stored in the object (in Thread Local Storage).
Note The multi-threaded apartment is intended for use by non-GUI threads. Threads in multi-threaded apartments should not perform UI actions. This is because UI threads require a message pump, and COM does not pump messages for threads in a multi-threaded apartment.
c ya,
nco2k
If OSVersion() = #PB_OS_Windows_ME : End : EndIf
Re: GPU card info ...
@CELTIC88
Thanks for this informative piece of code
Simple and clean
Tested with AMD Radeon HD for your information
Thanks for this informative piece of code
Simple and clean
Tested with AMD Radeon HD for your information
Egypt my love
Re: GPU card info ...
WAW ...
When I'm seeing this, I realize that I'm a little programmer.
I know something about 2D/3D design, but this ...
thanks for this, nice work.
marc,
When I'm seeing this, I realize that I'm a little programmer.
I know something about 2D/3D design, but this ...
thanks for this, nice work.
marc,
- every professional was once an amateur - greetings from Pajottenland - Belgium -
PS: sorry for my english I speak flemish ...
PS: sorry for my english I speak flemish ...
Re: GPU card info ...
To the clipboard:marc_256 wrote:Is it possible to read GPU card info in a windos computer
to know what GPU card is installed, Manufacture, Model, Type ...
Code: Select all
RunProgram("cmd.exe","/c wmic path win32_VideoController | clip","",#PB_Program_Hide)
Code: Select all
RunProgram("cmd.exe","/c wmic path win32_VideoController >C:\CardInfo.txt","",#PB_Program_Hide)