ISensLogon事件处理程序未接收事件 [英] ISensLogon Event Handler not receiving Events

查看:174
本文介绍了ISensLogon事件处理程序未接收事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在网上找到了一些处理ISensLogon事件的代码。我正在编写服务来记录这些事件,以监控学生每月登录的时间。每个月70个小时,他们得到一个专用工作站,他们使用共享桌面另外明智


在编写服务之前,我正在编写一个代码来查看我的程序是否获得了这些事件并能够将它们写入磁盘。我在网上找到的代码编译没有错误,每个函数调用都被跟踪,返回都是S_OK但是当我锁定我的工作站
为屏幕保护程序启动/停止时,事件不会记录在文件中。 / p>

我找到了两个示例代码 对于ISensNetwork和一个ISensLogon,它们都是相似的,所以我采用并混合它们。


任何想法代码都没有得到事件。如果我可以使这个工作,我可以继续使这个服务例程


Thanx


代码跟随


// ---------


#define _WIN32_IE 0x0500

#include< windows.h>

#include< eventsys.h>

#include< Sensevts.h>

#include< stdio.h>

# include< iostream>




static wchar_t * methods [] = {L" Logon",L" Logoff",L" StartShell",L" DisplayLock" ;,L" DisplayUnlock",L QUOT; StartScreenSaver",L QUOT; StopScreenSaver"};

静态wchar_t的*名称[] = {L" HB_System_Logon",L QUOT; HB_System_Logoff",L QUOT; HB_StartShell",L QUOT ; HB_DisplayLock",L" HB_DisplayUnlock",

  L" HB_StartScreenSaver",L" HB_StopScreenSaver"};

static wchar_t * subids [] = {L" {D2FE562E -139B-490F-A31C-4F0F7CD82677}",L" {C4CEE207-5021-4948-99EA-DE6D8E537DB3}" ;,
  L" {77405340-F779-4E3C-B2D6-E9890B19333D}",L" {EFAD2171-191D-48AF-875D-7468BB3A8051}",L" {51A05BC8-BDCC -475F-BBF5-8DFCDB9C824C}",


  L" {AE090FB3-4539-4FF1-92DC-BEA7BF817A6A}",L" {2F03C69D-A22C-419D-87C8 -A2BA764D6414}",L" {E2C86015-B91F-4928-ABD6-F569064EB5F5}",


  L" {123F30C3-762B-4FAA-869B-07A50D8789D4}" ;};




void LogWrite(const char * str)

{

  FILE * fp;

  fopen_s(& fp," sens.log"," w +" );

  fprintf(fp,"%s \ n",str);

  fclose(fp);

/ *

    FILE * fp = fopen(" c:\\ temp\\sens.log"," a");

    if(fp)

  {

        fwrite(str,1,strlen(str),fp);
$
        fclose(fp);

    }
* /

}




// ********* ****************拦截拦截设施**************************** *


//界面MyISensLogon:公共IDispatch

界面MyISensLogon:public ISensLogon // IDispatch

{

private:

   长参考;

 

public:

    MyISensLogon()

    {

        ref = 1;

    }


    STDMETHODIMP QueryInterface(REFIID iid,void ** ppv)

    {

        if(IsEqualIID(iid,IID_IUnknown)|| IsEqualIID(iid,IID_IDispatch)|| IsEqualIID(iid,IID_ISensLogon)){

         &NBSP;&NBSP;&NBSP; * ppv = this;

            AddRef();

           返回S_OK;

        }


        * ppv = NULL;

       返回E_NOINTERFACE;

    }


    ULONG STDMETHODCALLTYPE AddRef()

    {

        return InterlockedIncrement(& ref);

    }


    ULONG STDMETHODCALLTYPE Release()

    {

        int tmp = InterlockedDecrement(& ref);

       返回tmp;

    }


    HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int FAR * pctinfo)

    {

       返回E_NOTIMPL;

    }


    HRESULT STDMETHODCALLTYPE GetTypeInfo(unsigned int iTInfo,LCID lcid,ITypeInfo FAR * FAR * ppTInfo)

    {

       返回E_NOTIMPL;

    }


    HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid,OLECHAR FAR * FAR * rgszNames,unsigned int cNames,LCID lcid,DISPID FAR * rgDispId)

    {

       返回E_NOTIMPL;

    }


    HRESULT STDMETHODCALLTYPE调用(DISPID dispIdMember,REFIID RIID,LCID LCID,WORD wFlags,DISPPARAMS FAR * pDispParams,VARIANT FAR * parResult,EXCEPINFO FAR * pExcepInfo,无符号整型FAR * puArgErr)

&NBSP;&NBSP;&NBSP ; {

       返回E_NOTIMPL;

    }


    // ISensLogon方法:

   虚拟HRESULT STDMETHODCALLTYPE登录(BSTR bstrUserName)

    {

        LogWrite("Logon \ n");

       返回S_OK;

    }


   虚拟HRESULT STDMETHODCALLTYPE注销(BSTR bstrUserName)

    {

        LogWrite("Logoff \ n");

       返回S_OK;

    }


    virtual HRESULT STDMETHODCALLTYPE StartShell(BSTR bstrUserName)

    {

        LogWrite("StartShell \ n");
$
       返回S_OK;

    }


    virtual HRESULT STDMETHODCALLTYPE DisplayLock(BSTR bstrUserName)

    {

        LogWrite(" DisplayLock \ n");

       返回S_OK;

    }


    virtual HRESULT STDMETHODCALLTYPE DisplayUnlock(BSTR bstrUserName)

    {

        LogWrite(" DisplayUnlock \ n");

       返回S_OK;

    }


    virtual HRESULT STDMETHODCALLTYPE StartScreenSaver(BSTR bstrUserName)

    {

        LogWrite("StartScreenSaver \ n");

       返回S_OK;

    }


    virtual HRESULT STDMETHODCALLTYPE StopScreenSaver(BSTR bstrUserName)

    {

        LogWrite("StopScreenSaver \ n");

       返回S_OK;

    }
};


// ************************** ************************************************** ****


// **************************功能WndProc  ****************************************
HRESULT CALLBACK WndProc(HWND hwnd, UINT消息,WPARAM wParam,LPARAM lParam)

{


 静态MyISensLogon * pISensLogon;

 静态IEventSystem * pIEventSystem = 0;

  static int counter = 0;

  static UINT_PTR timer_id;

  HRESULT res;

 静态HMODULE hDLL;

  int i;

  int errorIndex;

   wchar_t nom [64];


 开关(留言)

  {

   case WM_NCCREATE:

   case WM_NCACTIVATE:

    return 1;

   case WM_CREATE:

&NBSP;&NBSP;&NBSP; {

&NBSP;&NBSP;&NBSP;&NBSP; //声明:

&NBSP;&NBSP;&NBSP;&NBSP;的IEventSubscription *&NBSP;&NBSP ;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; pIEventSubscription = 0;

  

     //获取对象CEventSystem的接口:

     res = CoCreateInstance(CLSID_CEventSystem,0,CLSCTX_SERVER,IID_IEventSystem,(void **)& pIEventSystem);


     / /创建我们的界面MyISensNetwork的实例:

     pISensLogon = new MyISensLogon();


      ; //注册接收所需的通知:

     for(i = 0; i< 7; i ++)

   ;&NBSP;&NBSP; {

&NBSP;&NBSP;&NBSP;&NBSP;  //获取接口对象的IEventSubscription CEventSubscription:

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ; res = CoCreateInstance(CLSID_CEventSubscription,0,CLSCTX_SERVER,IID_IEventSubscription,(LPVOID *)& pIEventSubscription);


      //指定事件类为收到:

      re s = pIEventSubscription-> put_EventClassID(OLESTR(" {D5978620-5B9F-11D1-8DD2-00AA004ABD5E}"));


      / /指定接收通知的界面:

      res = pIEventSubscription-> put_SubscriberInterface((IUnknown *)pISensLogon);


      //表示将要调用的方法:

      res = pIEventSubscription-> put_MethodName(methods [ i]);


      //为条目命名:

       res = pIEventSubscription-> put_SubscriptionName(names [i]);


      //为活动提供唯一标识符:

      res = pIEventSubscription-> put_SubscriptionID(subids [i]);


      //来自ISensLogon代码

      res = pIEventSubscription-> put_PerUser(TRUE);

     

      //注册注册:

      res = pIEventSystem-> Store(PROGID_EventSubscription,(IUnknown *)pIEventSubscription);


       //释放界面IEventSubscription:

      res =  pIEventSubscription->推出();

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; pIEventSubscription = 0;

&NBSP;&NBSP;&NBSP;&NBSP;}


&NBSP;&NBSP;&NBSP;&NBSP; timer_id = SetTimer的(HWND,10,10000,NULL);

&NBSP;&NBSP;&NBSP;&NBSP;返回0; <无线电通信/>
&NBSP;&NBSP;&NBSP;}


&NBSP;&NBSP;壳体WM_TIMER:

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;如果(计数器++ == 2)

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; KillTimer函数(HWND,timer_id );&NBSP;

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; lstrcpyW(NOM,L" SubscriptionID = QUOT);


&NBSP;&NBSP ;     for(i = 0; i< 7; ++ i)

       {

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP; lstrcatW(NOM + 15,subids [I]);

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ; res = pIEventSystem->删除(PROGID_EventSubscription,nom和& errorIndex);

        nom [15] = 0;
      }


       pIEventSystem-> Release() ;


       delete pISensLogon;

       PostQuitMessage(0 );;
       return 1;

     }

      return 1;


  默认:

    break;

 }

 返回0;

}

// ********* ************************************************** **********************


// *************** ********* Fonction WinMain *************************************

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR cmd,int show)

{

  HRESULT res;

  // Initialiser la librairie COM:

  res = CoInitialize(0);

  //Déclareretinitialiser notre结构WNDCLASS:

  WNDCLASS wc = {0,WndProc,0,0,hInst,0,0,0,0," invisible"};

  ; RegisterClass(& wc);

  //Créerunefenêtrevisiblesurtoutpourrécupérerlesmessages de la trayicon:

  CreateWindow(" invisible", ",",0,0,0,0,0,0,0,0,0);

  // Boucle des留言:

  MSG Msg;

  while(GetMessage(& Msg,0,0,0))

  {

       ; DispatchMessage函数(安培; MSG);

&NBSP;}

//关闭LA LIBRAIRIE COM:


&NBSP; CoUninitialize() ;

 返回0;

}

// ***************** ************************************************** ***************



 

解决方案

你有没有得到这个工作?我遇到了同样的问题。



你有没有试过看看其他ISens对象是否像ISensNetwork一样看看它们是否适合你


I found some code on the Net to handle ISensLogon Events. I am in the processes of writing a service to record these events to monitor how long students remain login in on a monthly bases. 70 hours per month and they get a dedicated workstation other wise they use a shared desktop.

Before writing the service I am working an code to see if my program gets the events and is able to write them to disk. The code I found on the net compiles without errors, each function call is traced and the returns are all S_OK but when I Lock my workstation for the screen saver starts/stops, the event is not recorded in a file.

I found two sample codes  for ISensNetwork and one for ISensLogon which were every similar so I adopted and mix both.

Any idea why the code does not get the events. If I can get this working I can proceed to making this a Service routine

Thanx

Code Follows

//---------

#define _WIN32_IE 0x0500
#include <windows.h>
#include <eventsys.h>
#include <Sensevts.h>
#include <stdio.h>
#include <iostream>


static wchar_t* methods[]={L"Logon", L"Logoff", L"StartShell", L"DisplayLock", L"DisplayUnlock", L"StartScreenSaver", L"StopScreenSaver"};
static wchar_t* names[]={L"HB_System_Logon", L"HB_System_Logoff", L"HB_StartShell", L"HB_DisplayLock", L"HB_DisplayUnlock",
 L"HB_StartScreenSaver", L"HB_StopScreenSaver"};
static wchar_t* subids[]={L"{D2FE562E-139B-490F-A31C-4F0F7CD82677}", L"{C4CEE207-5021-4948-99EA-DE6D8E537DB3}",
 L"{77405340-F779-4E3C-B2D6-E9890B19333D}", L"{EFAD2171-191D-48AF-875D-7468BB3A8051}", L"{51A05BC8-BDCC-475F-BBF5-8DFCDB9C824C}",
 L"{AE090FB3-4539-4FF1-92DC-BEA7BF817A6A}", L"{2F03C69D-A22C-419D-87C8-A2BA764D6414}", L"{E2C86015-B91F-4928-ABD6-F569064EB5F5}",
 L"{123F30C3-762B-4FAA-869B-07A50D8789D4}"};


void LogWrite(const char *str)
{
 FILE *fp;
 fopen_s( &fp, "sens.log", "w+" );
 fprintf(fp,"%s\n",str);
 fclose(fp);
/*
    FILE *fp = fopen("c:\\temp\\sens.log", "a");
    if (fp)
 {
        fwrite(str, 1, strlen(str), fp);
        fclose(fp);
    }
*/
}


//************************* Interface d'interception des événements *****************************

//interface MyISensLogon : public IDispatch
interface MyISensLogon : public ISensLogon//IDispatch
{
private:
    long ref;
 
public:
    MyISensLogon()
    {
        ref = 1;
    }

    STDMETHODIMP QueryInterface(REFIID iid, void ** ppv)
    {
        if (IsEqualIID(iid, IID_IUnknown) || IsEqualIID(iid, IID_IDispatch) || IsEqualIID(iid, IID_ISensLogon)) {
            *ppv = this;
            AddRef();
            return S_OK;
        }

        *ppv = NULL;
        return E_NOINTERFACE;
    }

    ULONG STDMETHODCALLTYPE AddRef()
    {
        return InterlockedIncrement(&ref);
    }

    ULONG STDMETHODCALLTYPE Release()
    {
        int tmp = InterlockedDecrement(&ref);
        return tmp;
    }

    HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int FAR* pctinfo)
    {
        return E_NOTIMPL;
    }

    HRESULT STDMETHODCALLTYPE GetTypeInfo(unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR* ppTInfo)
    {
        return E_NOTIMPL;
    }

    HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId)
    {
        return E_NOTIMPL;
    }

    HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* parResult, EXCEPINFO FAR* pExcepInfo, unsigned int FAR* puArgErr)
    {
        return E_NOTIMPL;
    }

    // ISensLogon methods:
    virtual HRESULT STDMETHODCALLTYPE Logon(BSTR bstrUserName)
    {
        LogWrite("Logon\n");
        return S_OK;
    }

    virtual HRESULT STDMETHODCALLTYPE Logoff(BSTR bstrUserName)
    {
        LogWrite("Logoff\n");
        return S_OK;
    }

    virtual HRESULT STDMETHODCALLTYPE StartShell(BSTR bstrUserName)
    {
        LogWrite("StartShell\n");
        return S_OK;
    }

    virtual HRESULT STDMETHODCALLTYPE DisplayLock(BSTR bstrUserName)
    {
        LogWrite("DisplayLock\n");
        return S_OK;
    }

    virtual HRESULT STDMETHODCALLTYPE DisplayUnlock(BSTR bstrUserName)
    {
        LogWrite("DisplayUnlock\n");
        return S_OK;
    }

    virtual HRESULT STDMETHODCALLTYPE StartScreenSaver(BSTR bstrUserName)
    {
        LogWrite("StartScreenSaver\n");
        return S_OK;
    }

    virtual HRESULT STDMETHODCALLTYPE StopScreenSaver(BSTR bstrUserName)
    {
        LogWrite("StopScreenSaver\n");
        return S_OK;
    }
};

//********************************************************************************

//************************** Function WndProc  ***********************************
HRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

 static MyISensLogon *pISensLogon;
 static IEventSystem *pIEventSystem =0;
 static int counter = 0;
 static UINT_PTR timer_id;
 HRESULT res;
 static HMODULE hDLL;
 int i;
 int errorIndex;
  wchar_t nom[64];

 switch(message)
 {
  case WM_NCCREATE:
  case WM_NCACTIVATE:
   return 1;
  case WM_CREATE:
   {
    // Declarations:
    IEventSubscription*         pIEventSubscription = 0;
  
    // Obtain an interface of the object CEventSystem:
    res=CoCreateInstance(CLSID_CEventSystem, 0,CLSCTX_SERVER,IID_IEventSystem,(void**)&pIEventSystem);

    // Create an instance of our interface MyISensNetwork:
    pISensLogon= new MyISensLogon();

    // Sign up to receive the notifications required:
    for(i=0; i<7; i++)
    {
     // Get the interface object IEventSubscription CEventSubscription:
     res = CoCreateInstance(CLSID_CEventSubscription,0, CLSCTX_SERVER,IID_IEventSubscription,(LPVOID*)&pIEventSubscription);

     // Specify the event class to receive:
     res = pIEventSubscription->put_EventClassID(OLESTR("{D5978620-5B9F-11D1-8DD2-00AA004ABD5E}"));

     // Specify the interface to receive notifications:
     res = pIEventSubscription->put_SubscriberInterface((IUnknown*)pISensLogon);

     // Indicate the method that will be called:
     res = pIEventSubscription->put_MethodName(methods[i]);

     // Give a name to the entry:
     res = pIEventSubscription->put_SubscriptionName(names[i]);

     // Provide a unique identifier for the event:
     res = pIEventSubscription->put_SubscriptionID(subids[i]);

     // from ISensLogon Code
     res = pIEventSubscription->put_PerUser(TRUE);
     
     // Register registration:
     res = pIEventSystem->Store(PROGID_EventSubscription,(IUnknown*)pIEventSubscription);

     // Release the interface IEventSubscription:
     res =  pIEventSubscription->Release();
     pIEventSubscription=0;
    }

    timer_id = SetTimer(hwnd,10,10000,NULL);
    return 0;
   }

  case WM_TIMER:
     if (counter++ == 2)
     {
      KillTimer(hwnd,timer_id); 
      lstrcpyW(nom, L"SubscriptionID=");

      for (i = 0; i < 7; ++i)
      {
       lstrcatW(nom + 15, subids[i]);
       res = pIEventSystem->Remove(PROGID_EventSubscription, nom, &errorIndex);
       nom[15] = 0;
      }

      pIEventSystem->Release();

      delete pISensLogon;
      PostQuitMessage(0);
      return 1;
     }
     return 1;

  default:
   break;
 }
 return 0;
}
//*********************************************************************************

//************************ Fonction WinMain ***************************************
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR cmd,int show)
{
 HRESULT res;
 // Initialiser la librairie COM:
 res = CoInitialize(0);
 // Déclarer et initialiser notre structure WNDCLASS:
 WNDCLASS wc={0,WndProc,0,0,hInst,0,0,0,0,"invisible"};
 RegisterClass(&wc);
 // Créer une fenêtre invisible surtout pour récupérer les messages de la trayicon:
 CreateWindow("invisible","",0,0,0,0,0,0,0,0,0);
 // Boucle des messages:
 MSG Msg;
 while (GetMessage(&Msg, 0, 0, 0))
 {
  DispatchMessage(&Msg);
 }
// Fermer la librairie COM:

 CoUninitialize();
 return 0;
}
//**********************************************************************************

 

解决方案

Did you ever get this to work? i'm having the same problem.

Did you ever try and see if the other ISens objects like ISensNetwork to see if they worked for you?


这篇关于ISensLogon事件处理程序未接收事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆