引用GUIDs

11
我正在尝试捕获一个事件并引用GUID来确定它是哪个事件。以下是代码:
DWORD WINAPI AvisionEventProc(LPVOID lpParam){
    //HANDLE hEvent = * (HANDLE *) lpParam;   // This thread's read event
    STINOTIFY pStiNotify;

    if (debug){
        wprintf(L"Avision Event\n");
    }
    while(true){
        WaitForSingleObject(hAvisionEvent, INFINITE);
        wprintf(L"Event");
        pStiDevice->GetLastNotificationData(&pStiNotify);
        if (pStiNotify.guidNotificationCode == GUID_STIUserDefined1){
            wprintf(L"User defined 1");
        }else if (pStiNotify.guidNotificationCode == GUID_STIUserDefined2){
            wprintf(L"User defined 2");
        }else if (pStiNotify.guidNotificationCode == GUID_STIUserDefined3){
            wprintf(L"User defined 3");
        }

        ResetEvent(hAvisionEvent);
    }
    return 1;
}

这段代码可以成功编译,但在链接时出现以下错误:

1>sti.obj : error LNK2001: unresolved external symbol _GUID_STIUserDefined3
1>sti.obj : error LNK2001: unresolved external symbol _GUID_STIUserDefined2
1>sti.obj : error LNK2001: unresolved external symbol _GUID_STIUserDefined1

奇怪的是,我从中获取了其他常量,但sti.h被链接了。 通过GUID声明,我注意到以下内容:

#if defined( _WIN32 ) && !defined( _NO_COM)

/*
 * Class IID's
 */

// B323F8E0-2E68-11D0-90EA-00AA0060F86C
DEFINE_GUID(CLSID_Sti, 0xB323F8E0L, 0x2E68, 0x11D0, 0x90, 0xEA, 0x00, 0xAA, 0x00, 0x60, 0xF8, 0x6C);

/*
 * Interface IID's
 */

// {641BD880-2DC8-11D0-90EA-00AA0060F86C}
DEFINE_GUID(IID_IStillImageW, 0x641BD880L, 0x2DC8, 0x11D0, 0x90, 0xEA, 0x00, 0xAA, 0x00, 0x60, 0xF8, 0x6C);

<snip>

/*
 * Standard event GUIDs
 */

// {740D9EE6-70F1-11d1-AD10-00A02438AD48}
DEFINE_GUID(GUID_DeviceArrivedLaunch, 0x740d9ee6, 0x70f1, 0x11d1, 0xad, 0x10, 0x0, 0xa0, 0x24, 0x38, 0xad, 0x48);

<snip>

#endif

"if defined" 这行代码是否会阻止引用 GUID(我正在编写一个 win32 控制台应用程序),或者我的理解上有一些更基础的错误导致无法正确使用 GUID?

非常感谢您的帮助。

谢谢,

Neil


我认为通常GUID是在头文件中声明但在外部库中定义的。要解决这个问题,您只需要将库链接到程序中即可。另一个选项是在包含该头文件之前包含<initguid.h>;这将使DEFINE_GUID宏实际上内联定义GUID,而不是作为extern定义。 - Luke
2个回答

44

#include <initguid.h> 应该被添加。这将有所帮助。


尽管被标记为可能未使用的包含指令,但它仍然起作用。 - serup
注意,它应该添加在一个编译单元中,否则您将开始收到多重定义错误。 - Ben Voigt
@ben GUID被定义为具有外部链接的常量。我相信只要它们都一致,就可以将它们引入任意数量的编译单元中,而不会导致ODR违规。 - IInspectable
@IInspectable:外部链接不会对规则“每个程序必须包含在该程序中使用的每个非内联函数或变量的确切定义,除了废弃语句之外”产生例外,并且尽管常数有时会导致odr-unused,但GUID通常通过地址传递。 - Ben Voigt
@IInspectable:之所以最终被允许,是因为initguid.hDECLSPEC_SELECTANY宏添加到DEFINE_GUID的定义中。 - Ben Voigt

9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接