Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 02:37

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Вызов WMI в SP-Forth
СообщениеДобавлено: Пн июн 02, 2008 11:02 
Не в сети

Зарегистрирован: Пн июн 02, 2008 10:55
Сообщения: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Привет всем!

Не подскажете как организовать обращение к сервису 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:41 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
Общий совет:
Посмотрите в spf4, как организован интерфейс с COM интерфейсом.
произведя поиск исходников, например, по CLSID

P.S. Возможно этого хватит:)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июн 06, 2008 14:53 
Не в сети

Зарегистрирован: Пн июн 02, 2008 10:55
Сообщения: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Я посмотрел и вот, что смог написать:
Код:
.( 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 15:47 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Avchent писал(а):
Подскажите, что я неправильно делаю.

подозреваю, надо порядо следования параметров реверсировать (или проверить), наиболее вероятная причина.
второе, не советую использовать REQUIRE CASE-INS lib/ext/caseins.f - можете запросто ловить косяки в неожиданных местах.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июн 06, 2008 15:57 
Не в сети
Аватара пользователя

Зарегистрирован: Вс май 07, 2006 11:38
Сообщения: 279
Откуда: Slavyansk, Ukraine
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Кстати, у меня похожая ошибка появлялась из-за случайно занесенных копипастом нечитабельных символов (для SPF при редактировании в FAR).

_________________
Банзай!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 08, 2008 08:52 
Не в сети

Зарегистрирован: Пн июн 02, 2008 10:55
Сообщения: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
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 21:07 
[Quote]мне не понятно как может быть вызван метод ::ExecQuery [/Quote]
А как может быть вызван метод ConnectServer, который работает? :)

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


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 09, 2008 20:25 
Не в сети

Зарегистрирован: Пн июн 02, 2008 10:55
Сообщения: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
spf писал(а):
А как может быть вызван метод ConnectServer, который работает? :)

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


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

А как можно в SP-Forth использовать структуру С типа VARIANT ?
(c IID_IDispatch позже разберусь)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 09, 2008 23:47 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Avchent писал(а):
А как можно в SP-Forth использовать структуру С типа VARIANT ?

Думаю также как и любую другую структуру/объединение :)

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт июн 10, 2008 00:00 
Поиск "variant" по devel дает десяток либ или примеров.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт июн 10, 2008 16:29 
Не в сети

Зарегистрирован: Пн июн 02, 2008 10:55
Сообщения: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Вот тестовый пример. Возникла очередная трудность:
когда дело доходит до непосредственного получения интересующих полей через метод ::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 18:53 
Вызывает подозрение алфавитный порядок методов в IID_IWbemClassObject.
Это же VMT, и каждый метод имеет в ней свой номер — с ним должен совпадать и порядковый номер метода при описании интерфейса (именно этим путем он и вычисляется, см. определение слова "Method:" в COM.F).


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 12, 2008 09:16 
Не в сети

Зарегистрирован: Пн июн 02, 2008 10:55
Сообщения: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
spf писал(а):
Вызывает подозрение алфавитный порядок методов в IID_IWbemClassObject.
Это же VMT, и каждый метод имеет в ней свой номер — с ним должен совпадать и порядковый номер метода при описании интерфейса (именно этим путем он и вычисляется, см. определение слова "Method:" в COM.F).


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

Вообще, странно: в SDK идущего вместе с Visual C 6.0 методы перечислены
в правильном порядке, а в SDK от 2003 сервера (скачан с сайта Microsoft)
методы перечислены в алфавитном порядке.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт апр 30, 2009 11:17 
Код:
hres = CoCreateInstance( CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, ( LPVOID* ) &pLoc );

Возвращает ошибку: 0x80040154 (класс не зарегистрирован )
Действительно такого класса в реестре нет. Как его зарегистрировать?


Вернуться к началу
  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

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


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

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