請問 ISAPI FILTER 中 可否加上定時器,及如何加上
使用(MFC C++)請各位高手幫忙
多謝

解决方案 »

  1.   

    完全可以:
    m_iTimerID=SetTimer(NULL,1,60*60*1000,TimerProc);
      

  2.   

    謝謝您的回覆,但接收的函式如何編寫 onTimer因為都會出現
    WPS.cpp(68): error C2664: 'SetTimer' : 無法將參數 4 從 'void (UINT)' 轉換成 'TIMERPROC'
    範圍中沒有符合目標類型的函式 (使用此名稱)多謝各位高手
      

  3.   

    定义一个全局的定时器事件处理函数
    样子就是这样的:VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
    {
        //做你想做的事情
        //个参数的含义参考MSDN
        //Filter的全局变量(theFilter)是可以方便引用的
        ....
    }
      

  4.   

    謝謝高手回覆
    但目前測試定時器並沒有作用
    不知那裡寫錯,請您告知
    多謝了...編碼如下:int View_N;
    int m_iTimerID;VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) 

    char szSize[10];
    View_N=View_N+1;
    itoa(View_N,szSize,10);
    CWPSFilter::WriteLog(szSize,"1","2","3","up_VariableName","agent_VariableName","TEST","aa","22");
    }// 僅有的一個 CWinApp 物件
    // 注意: 如果您將專案變更為在 DLL 中不再使用 MFC,您可以移除這個物件。
    CWinApp theApp;
    // 僅有的一個 CWPSFilter 物件
    CWPSFilter theFilter;
    // CWPSFilter 實作
    CWPSFilter::CWPSFilter(){}
    CWPSFilter::~CWPSFilter(){}BOOL CWPSFilter::GetFilterVersion(PHTTP_FILTER_VERSION pVer)
    {
    // 呼叫初始設定的預設實作
    CHttpFilter::GetFilterVersion(pVer); // 清除由基底類別設定的旗標
    pVer->dwFlags &= ~SF_NOTIFY_ORDER_MASK; // 設定我們想要的旗標
    pVer->dwFlags |= SF_NOTIFY_SECURE_PORT | SF_NOTIFY_NONSECURE_PORT | SF_NOTIFY_URL_MAP | SF_NOTIFY_SEND_RAW_DATA | SF_NOTIFY_END_OF_NET_SESSION; // 設定優先權
    pVer->dwFlags |= SF_NOTIFY_ORDER_HIGH; // 載入描述字串
    TCHAR sz[SF_MAX_FILTER_DESC_LEN+1];
    ISAPIVERIFY(::LoadString(AfxGetResourceHandle(),
    IDS_FILTER, sz, SF_MAX_FILTER_DESC_LEN));
    _tcscpy(pVer->lpszFilterDesc, sz);m_iTimerID=SetTimer(NULL,1,3000,TimerProc); 
    return true;
    }
      

  5.   

    定时器的启动应该没有问题
    检查一下静态函数WriteLog是否正常,包括目录的写访问控制是否对SYSTEM开放
      

  6.   

    非常感謝高手您的回覆 
    但目前測試測試的結果定時器還是沒有作用 
    不知那裡寫錯,請您告知 
    多謝了... int View_N;
    int m_iTimerID;VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) 

    char szSize[10];
    View_N=View_N+1;
    itoa(View_N,szSize,10);
    CWPSFilter::WriteLog("Step 3",szSize,"2","3","up_VariableName","agent_VariableName","TEST","aa","22");
    }BOOL CWPSFilter::GetFilterVersion(PHTTP_FILTER_VERSION pVer)
    {
    // 呼叫初始設定的預設實作
    CHttpFilter::GetFilterVersion(pVer); // 清除由基底類別設定的旗標
    pVer->dwFlags &= ~SF_NOTIFY_ORDER_MASK; // 設定我們想要的旗標
    pVer->dwFlags |= SF_NOTIFY_SECURE_PORT | SF_NOTIFY_NONSECURE_PORT | SF_NOTIFY_URL_MAP | SF_NOTIFY_SEND_RAW_DATA | SF_NOTIFY_END_OF_NET_SESSION; // 設定優先權
    pVer->dwFlags |= SF_NOTIFY_ORDER_HIGH; // 載入描述字串
    TCHAR sz[SF_MAX_FILTER_DESC_LEN+1];
    ISAPIVERIFY(::LoadString(AfxGetResourceHandle(),
    IDS_FILTER, sz, SF_MAX_FILTER_DESC_LEN));
    _tcscpy(pVer->lpszFilterDesc, sz);char szSize[10];
    itoa(View_N,szSize,10);
    CWPSFilter::WriteLog("Step 1",szSize,"2","3","up_VariableName","agent_VariableName","TEST","aa","22");m_iTimerID=SetTimer(NULL,1,3000,TimerProc); return true;
    }DWORD CWPSFilter::OnUrlMap(CHttpFilterContext* pCtxt,PHTTP_FILTER_URL_MAP pMapInfo)
    {
    char szSize[10];
    itoa(View_N,szSize,10);
    CWPSFilter::WriteLog("Step 2",szSize,"2","3","up_VariableName","agent_VariableName","TEST","aa","22");
    }MS ACCESS 存入內容如下:
    log_date ip url Post_str website referer agent status send_type
    2008/7/7 上午 10:18:56 Step 1 0 2 3 up_VariableName agent_VariableName TEST aa(GetFilterVersion 中存入)
    2008/7/7 上午 10:18:56 Step 2 0 2 3 up_VariableName agent_VariableName TEST aa(OnUrlMap 中存入)過了3秒後並沒有產生Step 3因此定時器並沒有作用
    我目前使用IIS7,VS.NET 2003不知那裡疏漏,煩請告知,非常感謝您
      

  7.   

    補充:IIS7與IIS6
    測試時都一樣無法存入Step 3 
    這代表並沒有跑TimerProc()不知那裡疏漏,煩請告知,非常感謝您 
      

  8.   

    我手头没有IIS6和7,在5下是没有问题
    IIS从6开始对于Filter进行了一系列的控制,部分特性已经不再支持
    是否还支持定时器中断很难说如果其他地址Step 2...有写入,那就不会是文件访问权限的问题了
      

  9.   

    非常感謝您的回答
    我已經試出來了
    使用多線程配合Sleep
    CWinThread* pWinThread = AfxBeginThread((AFX_THREADPROC)ThreadProc, NULL);便可達到相同效果..多謝