Win32(EvtSubscribe)回调适用于.exe但不适用于dll

时间:2016-05-17 06:01:15

标签: winapi dll

我有一个小代码,它解析系统的事件查看器以查找所需的数据。现在这个代码在.exe创建时工作正常但在.dll中没有。 我如何收听我在dll中订阅的事件。

有没有更好的方法在.dll中实现EvtSubscribe()和SubscriptionCallback()?

Full Source Code on Github

这是因为我跳过了DllMain()函数吗?

主要()

DWORD status = ERROR_SUCCESS;
EVT_HANDLE hSubscription = NULL;

hSubscription = EvtSubscribe(NULL, NULL, pwsPath, pwsQuery, NULL, NULL,
    (EVT_SUBSCRIBE_CALLBACK)SubscriptionCallback, EvtSubscribeStartAtOldestRecord);
if (NULL == hSubscription)
{       
    //some code
    return;
}

回调  在.exe构建但不在.dll

时调用
// The callback that receives the events that match the query criteria. 
DWORD WINAPI SubscriptionCallback(EVT_SUBSCRIBE_NOTIFY_ACTION action, PVOID pContext, EVT_HANDLE hEvent)
{
    DWORD status = ERROR_SUCCESS;

    switch (action)
    {
        //some code

    case EvtSubscribeActionDeliver:
        if (ERROR_SUCCESS != (status = PrintEvent(hEvent)))
        {
            goto cleanup;
        }
        break;
    }

cleanup:
        return status; // The service ignores the returned status.
}

 DWORD PrintEvent(EVT_HANDLE hEvent)
{
 // print
}

1 个答案:

答案 0 :(得分:0)

我认为您需要仔细检查调用EvtClose。如果您调用此方法,则不会调用订阅回调。

与DllMain无关。