从纯C订阅SENS事件

从纯C订阅SENS事件,c,windows,windows-services,com+,C,Windows,Windows Services,Com+,我想从用C编写的Windows服务订阅一些特定的SENS事件。更具体地说,我想在用户登录到桌面时收到通知。是的,迁移到C++或C++是一种选择(我在C语言中看到了很多代码示例),但是如果可以的话,我宁愿避免它,因为它是一个非常大的代码库。 我对COM或COM+一无所知(除了它的存在;D),所以做了一些详尽的研究,我开始初始化COM并实例化ISensLogon(我想我正在这么做)。不幸的是,对CoCreateInstance的调用一直返回REGDB_E_CLASSNOTREG 我并不是在要求一个现

我想从用C编写的Windows服务订阅一些特定的SENS事件。更具体地说,我想在用户登录到桌面时收到通知。是的,迁移到C++或C++是一种选择(我在C语言中看到了很多代码示例),但是如果可以的话,我宁愿避免它,因为它是一个非常大的代码库。 我对COM或COM+一无所知(除了它的存在;D),所以做了一些详尽的研究,我开始初始化COM并实例化
ISensLogon
(我想我正在这么做)。不幸的是,对
CoCreateInstance
的调用一直返回
REGDB_E_CLASSNOTREG

我并不是在要求一个现成的解决方案,如果你能给我一些建议,让我可以继续我的研究,我会很高兴的。正如我所说,C#中有很多例子,但C中的例子并不多

这是我使用的代码。很简单

HRESULT result;
ISensLogon *isens;

printf("Initializing COM... ");
result = CoInitialize(NULL);
if (result != S_OK)
{
    if (result == S_FALSE)
        printf("SKIPPED\n");
    else
    {
        printf("FAILED\n");
        exit(1);
    }
}
printf("OK\n");

printf("Creating SENS logon object... ");
result = CoCreateInstance(
    &CLSID_SENS,
    NULL,
    CLSCTX_INPROC_SERVER,
    &IID_ISensLogon,
    (LPVOID *)&isens);
if (result != S_OK)
{
    printf("FAILED\n");
    exit(1);
}
printf("OK.\n");

我想使用SENS的原因是因为我发现事件
服务\u控制\u会话更改
不可靠-它并不总是触发。我也读过有关SENS的文章,希望它能表现得更好。

对不起,我错过了一些东西。示例代码不是来自服务(我不能将printfs放在服务上),而是来自我为测试SENS编写的一个小示例应用程序。我假设如果它从应用程序工作,它将从服务工作。抱歉,我遗漏了一些东西。示例代码不是来自服务(我不能将printfs放在服务上),而是来自我为测试SENS而编写的一个小示例应用程序。我假设如果它从应用程序工作,它将从服务工作。