Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт апр 16, 2024 23:08

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Вызов WMI в SP-Forth
Автор Сообщение
  Заголовок сообщения:   Ответить с цитатой
Код:
hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, ( LPVOID* ) &pLoc );

Возвращает ошибку: 0x80040154 (класс не зарегистрирован )
Действительно такого класса в реестре нет. Как его зарегистрировать?
Сообщение Добавлено: Чт апр 30, 2009 11:17
  Заголовок сообщения:   Ответить с цитатой
spf писал(а):
Вызывает подозрение алфавитный порядок методов в IID_IWbemClassObject.
Это же VMT, и каждый метод имеет в ней свой номер — с ним должен совпадать и порядковый номер метода при описании интерфейса (именно этим путем он и вычисляется, см. определение слова "Method:" в COM.F).


Да, спасибо. После правильного перечисления методов все заработало.
Дополнительно понадобилось перейти на использование структуры VARIANT,
как это описано в файле variant.f

Вообще, странно: в SDK идущего вместе с Visual C 6.0 методы перечислены
в правильном порядке, а в SDK от 2003 сервера (скачан с сайта Microsoft)
методы перечислены в алфавитном порядке.
Сообщение Добавлено: Чт июн 12, 2008 09:16
  Заголовок сообщения:   Ответить с цитатой
Вызывает подозрение алфавитный порядок методов в IID_IWbemClassObject.
Это же VMT, и каждый метод имеет в ней свой номер — с ним должен совпадать и порядковый номер метода при описании интерфейса (именно этим путем он и вычисляется, см. определение слова "Method:" в COM.F).
Сообщение Добавлено: Вт июн 10, 2008 18:53
  Заголовок сообщения:   Ответить с цитатой
Вот тестовый пример. Возникла очередная трудность:
когда дело доходит до непосредственного получения интересующих полей через метод ::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
Сообщение Добавлено: Вт июн 10, 2008 16:29
  Заголовок сообщения:   Ответить с цитатой
Поиск "variant" по devel дает десяток либ или примеров.
Сообщение Добавлено: Вт июн 10, 2008 00:00
  Заголовок сообщения:   Ответить с цитатой
Avchent писал(а):
А как можно в SP-Forth использовать структуру С типа VARIANT ?

Думаю также как и любую другую структуру/объединение :)
Сообщение Добавлено: Пн июн 09, 2008 23:47
  Заголовок сообщения:   Ответить с цитатой
spf писал(а):
А как может быть вызван метод ConnectServer, который работает? :)

Думаю, дело в некорректом объявлении IID_IWbemServices. По идее, если пойти через IID_IDispatch — будет проще: тогда не надо объявлять все методы интерфейса, а вызов делается через позднее связывание.


Спасибо, когда добавил все методы в объявление IID_IWbemServices, сразу стал корректно вызываться и метод ::ExecQuery.

А как можно в SP-Forth использовать структуру С типа VARIANT ?
(c IID_IDispatch позже разберусь)
Сообщение Добавлено: Пн июн 09, 2008 20:25
  Заголовок сообщения:   Ответить с цитатой
[Quote]мне не понятно как может быть вызван метод ::ExecQuery [/Quote]
А как может быть вызван метод ConnectServer, который работает? :)

Думаю, дело в некорректом объявлении IID_IWbemServices. По идее, если пойти через IID_IDispatch — будет проще: тогда не надо объявлять все методы интерфейса, а вызов делается через позднее связывание.
Сообщение Добавлено: Вс июн 08, 2008 21:07
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
подозреваю, надо порядо следования параметров реверсировать (или проверить), наиболее вероятная причина.


Действительно, был неправильный порядок параметров при вызове ConnectServer.
Спасибо.

Теперь новая беда :)

Ошибка при вызове ExecQueryF (метод ::ExecQuery)
Выдается ошибка 0xC0000005.

Когда на C я объявляю объект pSvc, то я указываю его тип (от кого он унаследован) и при вызове метода ExecQuery ясно к какому классу его относить.

Здесь же я объявил VARIABLE pSvc и никакой связи, с IID_IWbemServices нет, поэтому мне не понятно как может быть вызван метод ::ExecQuery

Код:
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



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 ( a b -- x y )
Interface;

IID_IUnknown
Interface: IID_IWbemServices {9556dc99-828c-11cf-a37e-00aa003240c7}
  Method: ::ExecQuery
Interface;


VARIABLE pLoc
VARIABLE pSvc
VARIABLE pEnumerator

: .h ( x -- )
  BASE @ SWAP
  HEX
  8 .0
  BASE !
;


: SecurInit ( -- ior )
   NULL
   EOAC_NONE
   NULL
   RPC_C_IMP_LEVEL_IMPERSONATE
   RPC_C_AUTHN_LEVEL_DEFAULT
   NULL
   NULL
   -1
   NULL
  CoInitializeSecurity
;


\ C from SDK
\    hres = CoCreateInstance(
\        CLSID_WbemLocator,
\        0,
\        CLSCTX_INPROC_SERVER,
\        IID_IWbemLocator, (LPVOID *) &pLoc);

: CoCreateInstanceF ( -- x )
  pLoc
  IID_IWbemLocator
  CLSCTX_INPROC_SERVER
  0
  CLSID_WbemLocator
  CoCreateInstance
;


\ C from SDK
\ =================================
\    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\CIMV2" >BSTR \ _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
  pLoc @ ::ConnectServer
;


\ C from SDK
\    // 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
;

\ C from SDK
\    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
;


: TEST3
  0 pLoc !
  0 pSvc !
  0 pEnumerator !

  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

;

S" EXMP3.EXE" SAVE
BYE
Сообщение Добавлено: Вс июн 08, 2008 08:52
  Заголовок сообщения:   Ответить с цитатой
Кстати, у меня похожая ошибка появлялась из-за случайно занесенных копипастом нечитабельных символов (для SPF при редактировании в FAR).
Сообщение Добавлено: Пт июн 06, 2008 15:57
  Заголовок сообщения:   Ответить с цитатой
Avchent писал(а):
Подскажите, что я неправильно делаю.

подозреваю, надо порядо следования параметров реверсировать (или проверить), наиболее вероятная причина.
второе, не советую использовать REQUIRE CASE-INS lib/ext/caseins.f - можете запросто ловить косяки в неожиданных местах.
Сообщение Добавлено: Пт июн 06, 2008 15:47
  Заголовок сообщения:   Ответить с цитатой
Я посмотрел и вот, что смог написать:
Код:
.( Test1...) CR

REQUIRE CASE-INS lib/ext/caseins.f
REQUIRE CoInitializeEx ~ac/lib/win/com/com.f


: Q  BYE ;

: .h ( x -- )
  BASE @ SWAP
  HEX
  8 .0
  BASE !
;

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;



\ C from SDK
\    hres = CoCreateInstance(
\        CLSID_WbemLocator,
\        0,
\        CLSCTX_INPROC_SERVER,
\        IID_IWbemLocator, (LPVOID *) &pLoc);


VARIABLE pLoc
VARIABLE pSvc

: TEST3
  0 pLoc !
  0 pSvc !

  ComInit ." ComInit = " DUP .h CR
  0=
  IF
    pLoc
    IID_IWbemLocator
    CLSCTX_INPROC_SERVER
    0
    CLSID_WbemLocator
    CoCreateInstance ." CreateInstance = " .h ."  pLoc = " pLoc @ .h CR
  ELSE
    ." Can not ComInit" CR EXIT
  THEN

  pLoc @ 0= IF
    ." Can not CreateInstance" CR EXIT
  THEN

  S" ROOT\WMI" >BSTR \ , 0 ,
  DUP 20 DUMP CR
            \ _bstr_t(L"ROOT\\WMI"), // Object path of WMI namespace
  NULL      \ NULL, // User name. NULL = current user
  NULL      \ NULL, // User password. NULL = current
  0         \ 0,    // Locale. NULL indicates current
  NULL      \ NULL, // Security flags.
  0         \ 0,    // Authority (e.g. Kerberos)
  0         \ 0,    // Context object
  pSvc      \ &pSvc // pointer to IWbemServices proxy

  pLoc @ ::ConnectServer
  ." ConnectServer = " .h space .h space ." pSvc = " pSvc @ .h CR
;


\ C from SDK
\ =================================
\    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
\         );

S" EXMP2.EXE" SAVE
BYE


При попытке вызвать метод ConnectServer выдается ошибка 0x8004100E, что вроде соответствует
"некорректное имя" - надо думать имя ROOT\\WMI.
Подскажите, что я неправильно делаю.
Сообщение Добавлено: Пт июн 06, 2008 14:53
  Заголовок сообщения:   Ответить с цитатой
Общий совет:
Посмотрите в spf4, как организован интерфейс с COM интерфейсом.
произведя поиск исходников, например, по CLSID

P.S. Возможно этого хватит:)
Сообщение Добавлено: Пн июн 02, 2008 11:41
  Заголовок сообщения:  Вызов WMI в SP-Forth  Ответить с цитатой
Привет всем!

Не подскажете как организовать обращение к сервису WMI ?

Вот фрагмент на C:
Код:
    IWbemLocator *pLoc = NULL;

    hres = CoCreateInstance(
        CLSID_WbemLocator,             
        0,
        CLSCTX_INPROC_SERVER,
        IID_IWbemLocator, (LPVOID *) &pLoc);


Как его же реализовать на SP-Forth ?

Особенно интересует обращение к методам, а именно:

Код:
    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\\CIMV2"), // 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
         );


Как то же самое сделать на Forth ?
Сообщение Добавлено: Пн июн 02, 2008 11:02

Часовой пояс: UTC + 3 часа [ Летнее время ]


cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB