Вот тестовый пример. Возникла очередная трудность:
когда дело доходит до непосредственного получения интересующих полей через метод ::Get
возвращаются коды ошибок.
При вызове слова GetClass, код ошибки: WBEM_E_SYSTEM_PROPERTY = 0x80041030
при вызове слова GetDay, код ошибки: WBEM_E_FAILED = 0x80041001
Подскажите, что не так.
Все предыдущие слова работают без проблем.
Код:
.( Test1...) CR
REQUIRE CoInitializeEx ~ac/lib/win/com/com.f
WINAPI: CoInitializeSecurity OLE32.DLL
WINAPI: CoSetProxyBlanket OLE32.DLL
\ RPCDCE.H
0 CONSTANT RPC_C_AUTHN_LEVEL_DEFAULT \ Default authentication
3 CONSTANT RPC_C_IMP_LEVEL_IMPERSONATE \
0 CONSTANT EOAC_NONE \ objidl.h
3 CONSTANT RPC_C_AUTHN_LEVEL_CALL
0 CONSTANT RPC_C_AUTHZ_NONE
10 CONSTANT RPC_C_AUTHN_WINNT
0x20 CONSTANT WBEM_FLAG_FORWARD_ONLY
0x10 CONSTANT WBEM_FLAG_RETURN_IMMEDIATELY
0xFFFFFFFF CONSTANT WBEM_INFINITE
0 CONSTANT NULL
CREATE CLSID_WbemLocator S" {4590F811-1D3A-11D0-891F-00AA004B2E24}" CLSID, 0 , 0 , 0 ,
IID_IUnknown
Interface: IID_IWbemLocator {DC12A687-737F-11CF-884D-00AA004B2E24}
Method: ::ConnectServer
Interface;
IID_IUnknown
Interface: IID_IWbemServices {9556DC99-828C-11CF-A37E-00AA003240C7}
Method: ::OpenNamespace
Method: ::CancelAsyncCall
Method: ::QueryObjectSink
Method: ::GetObject
Method: ::GetObjectAsync
Method: ::PutClass
Method: ::PutClassAsync
Method: ::DeleteClass
Method: ::DeleteClassAsync
Method: ::CreateClassEnum
Method: ::CreateClassEnumAsync
Method: ::PutInstance
Method: ::PutInstanceAsync
Method: ::DeleteInstance
Method: ::DeleteInstanceAsync
Method: ::CreateInstanceEnum
Method: ::CreateInstanceEnumAsync
Method: ::ExecQuery
Method: ::ExecQueryAsync
Method: ::ExecNotificationQuery
Method: ::ExecNotificationQueryAsync
Method: ::ExecMethod
Method: ::ExecMethodAsync
Interface;
\ IEnumWbemClassObject *pEnumerator
IID_IUnknown
Interface: IID_IEnumWbemClassObject {027947E1-D731-11CE-A357-000000000001}
Method: ::CloneEnum
Method: ::NextEnum
Method: ::NextAsync
Method: ::Reset
Method: ::Skip
Interface;
\ IWbemClassObject *pclsObj;
IID_IUnknown
Interface: IID_IWbemClassObject {DC12A681-737F-11CF-884D-00AA004B2E24}
Method: ::BeginEnumeration
Method: ::BeginMethodEnumeration
Method: ::CloneClass
Method: ::CompareTo
Method: ::Delete
Method: ::DeleteMethod
Method: ::EndEnumeration
Method: ::EndMethodEnumeration
Method: ::Get
Method: ::GetMethod
Method: ::GetMethodOrigin
Method: ::GetMethodQualifierSet
Method: ::GetNames
Method: ::GetObjectText
Method: ::GetPropertyOrigin
Method: ::GetPropertyQualifierSet
Method: ::GetQualifierSet
Method: ::InheritsFrom
Method: ::NextClass
Method: ::NextMethod
Method: ::Put
Method: ::PutMethod
Method: ::SpawnDerivedClass
Method: ::SpawnInstance
Interface;
: .h ( x -- )
BASE @ SWAP
HEX
8 .0
BASE !
;
0 VALUE MYVAR
VARIABLE pLoc
VARIABLE pSvc
VARIABLE pEnumerator
VARIABLE pclsObj
VARIABLE uReturn
VARIABLE vtProp
: SecurInit ( -- ior )
NULL
EOAC_NONE
NULL
RPC_C_IMP_LEVEL_IMPERSONATE
RPC_C_AUTHN_LEVEL_DEFAULT
NULL
NULL
-1
NULL
CoInitializeSecurity
;
\ hres = CoCreateInstance(
\ CLSID_WbemLocator,
\ 0,
\ CLSCTX_INPROC_SERVER,
\ IID_IWbemLocator, (LPVOID *) &pLoc);
: CoCreateInstanceF ( -- x )
pLoc
IID_IWbemLocator
CLSCTX_INPROC_SERVER
0
CLSID_WbemLocator
CoCreateInstance
;
\ =================================
\ IWbemServices *pSvc = NULL;
\ // Connect to the root\cimv2 namespace with
\ // the current user and obtain pointer pSvc
\ // to make IWbemServices calls.
\ hres = pLoc->ConnectServer(
\ _bstr_t(L"ROOT\\WMI"), // Object path of WMI namespace
\ NULL, // User name. NULL = current user
\ NULL, // User password. NULL = current
\ 0, // Locale. NULL indicates current
\ NULL, // Security flags.
\ 0, // Authority (e.g. Kerberos)
\ 0, // Context object
\ &pSvc // pointer to IWbemServices proxy
\ );
: ConnectServerF ( -- )
pSvc \ &pSvc // pointer to IWbemServices proxy
0 \ 0, // Context object
0 \ 0, // Authority (e.g. Kerberos)
NULL \ NULL, // Security flags.
0 \ 0, // Locale. NULL indicates current
NULL \ NULL, // User password. NULL = current
NULL \ NULL, // User name. NULL = current user
\ S" ROOT\WMI" >BSTR \ _bstr_t(L"ROOT\\WMI"), // Object path of WMI namespace
S" ROOT\CIMV2" >BSTR \ _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
pLoc @ ::ConnectServer
;
\ // Step 5: --------------------------------------------------
\ // Set security levels on the proxy -------------------------
\
\ hres = CoSetProxyBlanket(
\ pSvc, // Indicates the proxy to set
\ RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
\ RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
\ NULL, // Server principal name
\ RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
\ RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
\ NULL, // client identity
\ EOAC_NONE // proxy capabilities
\ );
: CoSetProxyBlanketF ( -- x )
EOAC_NONE \ EOAC_NONE // proxy capabilities
NULL \ NULL, // client identity
RPC_C_IMP_LEVEL_IMPERSONATE \ // RPC_C_IMP_LEVEL_xxx
RPC_C_AUTHN_LEVEL_CALL \ // RPC_C_AUTHN_LEVEL_xxx
NULL \ // Server principal name
RPC_C_AUTHZ_NONE \ // RPC_C_AUTHZ_xxx
RPC_C_AUTHN_WINNT \ // RPC_C_AUTHN_xxx
pSvc @ \ // Indicates the proxy to set
CoSetProxyBlanket
;
\ hres = pSvc->ExecQuery(
\ bstr_t("WQL"),
\ bstr_t("SELECT * FROM XSIA01STAT_OID"),
\ WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
\ NULL,
\ &pEnumerator);
: ExecQueryF ( -- x )
pEnumerator
NULL
WBEM_FLAG_FORWARD_ONLY WBEM_FLAG_RETURN_IMMEDIATELY OR
S" SELECT * FROM Win32_CurrentTime" >BSTR
S" WQL" >BSTR
pSvc @ ::ExecQuery
;
\ -----------------------------------------------
\ HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
\ &pclsObj, &uReturn);
: Enumerator_Next ( -- x )
uReturn
pclsObj
1
WBEM_INFINITE
pEnumerator @ ::NextEnum
;
\ -----------------------------------------------
\ hr = pclsObj->Get(strClassProp, 0, &v, 0, 0);
: GetClass ( -- x )
0
0
vtProp
S" __CLASS" >BSTR
pclsObj @ ::Get
;
\ -----------------------------------------------
\ hr = pclsObj->Get(L"Day", 0, &vtProp, 0, 0);
: GetDay ( -- x )
0
0
vtProp
0
S" Day" >BSTR
pclsObj @ ::Get
;
: TEST3
0 pLoc !
0 pSvc !
0 pEnumerator !
0 pclsObj !
0 uReturn !
HERE TO MYVAR
MYVAR vtProp !
64 ALLOT
vtProp @ 64 0 FILL
ComInit DUP ." ComInit = " .h CR
IF
." Can not ComInit" CR EXIT
THEN
SecurInit DUP ." CoInitializeSecurity = " .h CR
IF
." Can not CoInitializeSecurity" CR EXIT
THEN
CoCreateInstanceF ." CreateInstance = " .h ." pLoc = " pLoc @ .h CR
pLoc @ 0= IF
." Can not CreateInstance" CR EXIT
THEN
ConnectServerF ." ConnectServer = " .h SPACE ." pSvc = " pSvc @ .h CR
pSvc @ 0= IF
." Can not ConnectServer" CR EXIT
THEN
CoSetProxyBlanketF DUP ." CoSetProxyBlanket = " .h SPACE ." pSvc = " pSvc @ .h CR
IF
." Can not CoSetProxyBlanket" CR EXIT
THEN
ExecQueryF ." ExecQueryF = " .h SPACE ." pEnumerator = " pEnumerator @ .h CR
pEnumerator @ 0= IF
." Can not ExecQueryF" CR EXIT
THEN
Enumerator_Next ." Enumerator_Next = " .h SPACE ." uReturn = " uReturn @ .h
SPACE ." pclsObj = " pclsObj @ .h CR
uReturn @ 0= IF
." Can not Enumerator_Next" CR EXIT
THEN
\ WBEM_E_SYSTEM_PROPERTY = 0x80041030
GetClass DUP ." GetCLASS = " .h SPACE ." vtProp = " vtProp @ .h CR
IF
." Can not GetClass" CR EXIT
THEN
\ WBEM_E_FAILED = 0x80041001
GetDay DUP ." Get33 = " .h SPACE ." vtProp = " vtProp @ .h CR
IF
." Can not GetDay" CR EXIT
THEN
;
S" TEST.EXE" SAVE
BYE