簡體   English   中英

WinAPI ReportEvent-未安​​裝組件

[英]WinAPI ReportEvent - component not installed

我實現了一個簡單的功能,可以從應用程序登錄事件查看器。 但是,無論錯誤級別如何,每次登錄時都會收到以下消息:

找不到源MyAppEvents中事件ID 0的描述。 引發此事件的組件未安裝在本地計算機上,或者安裝已損壞。 您可以在本地計算機上安裝或修復組件。

如果事件起源於另一台計算機,則顯示信息必須與事件一起保存。

我不是事件日志的專家,實際上,這是我第一次在C ++中使用它,並且文檔令人困惑和誤導...

這是我實現的用於封裝事件日志調用的方法:

HANDLE source = NULL;

void app_log(std::string m, WORD level) {
    std::wstring msg_temp (m.begin(), m.end());
    LPCWSTR msg = msg_temp.c_str();

    std::wstring name(L"MyAppEvents");
    if (source == NULL) 
        source = RegisterEventSource(NULL, name.c_str());
    if (source) {
        if (!ReportEvent(source, level, 0, 0, NULL, 1, 0, &msg, NULL))
            std::cerr << "Error when logging";
    }
    else 
        std::cerr << "Error when logging";
}

我有一個使用WIX構建的應用程序安裝程序(此安裝程序創建登錄事件查看器所需的密鑰-Application的子項),並且運行順利。 但是,我不明白該消息,也不知道如何將已安裝的應用程序附加到事件日志中-我什至不確定這是否是問題所在,或者它可能不是我的參數之一傳遞為NULL0

我調試時也會顯示此消息(無需安裝,但手動創建了“應用程序子項”)。

你可以幫幫我嗎?

我不能使用C ++托管代碼...

您的日志記錄代碼沒有任何問題。 該警告消息僅表示您沒有在注冊表中正確注冊MyAppEvents事件源。 這記錄在MSDN上:

RegisterEventSource函數

pSourceName [輸入]
要獲取其句柄的事件源的名稱。 源名稱必須是Eventlog注冊表項下的日志的子項 請注意,安全日志僅供系統使用。

事件來源

事件源的結構如下:

\n HKEY_LOCAL_MACHINE\n    系統\n       CurrentControlSet\n          服務\n             事件日志\n                應用\n                   應用名稱\n                安全\n                系統\n                   驅動名稱\n                自定義日志\n                   應用名稱\n

...

每個事件源均包含特定於將記錄事件的軟件的信息(例如消息文件

...

應用程序可以使用應用程序日志,而無需向注冊表添加新的事件源。 如果應用程序調用RegisterEventSource並傳遞在注冊表中找不到的源名稱,則事件記錄服務默認情況下使用應用程序日志。 但是,因為沒有消息文件,所以事件查看器無法將任何事件標識符或事件類別映射到描述字符串,並且將顯示錯誤 因此,您應該為應用程序的注冊表添加唯一的事件源,並指定一個消息文件。

僅創建MyAppEvents子項是不夠的,您還必須將其指向應用程序的消息文件。 如果將事件日志類別和事件消息存儲為應用程序可執行文件的資源,則子項可以將可執行文件本身注冊為消息文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM