【问题标题】:Referencing GUIDs引用 GUID
【发布时间】:2012-06-14 09:45:00
【问题描述】:

我正在尝试捕获一个事件并引用一个 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

“如果已定义”行是否停止了对 GUID 的引用(我正在编写一个 win32 控制台应用程序),还是因为对 GUID 缺乏了解,我在这里有一些更根本的问题?

提前感谢您的帮助。

干杯,

尼尔

【问题讨论】:

  • 我认为 GUID 通常在头文件中声明,但在外部库中定义。要解决这个问题,您只需要将库链接到您的程序中。另一种选择是在包含该头文件之前包含 ;这会将 DEFINE_GUID 宏更改为实际定义 GUID 内联而不是外部。

标签: winapi guid


【解决方案1】:

DEFINE_GUID 宏或者将命名的GUID 定义为静态,或者只是进行前向声明以实际在其他地方完成。您的代码可能只有后者,并且符号在项目中没有实际初始化。

见:

【讨论】:

    【解决方案2】:

    应该添加#include &lt;initguid.h&gt;。这会有所帮助。

    【讨论】:

    • 工作,尽管它被标记为可能未使用的包含指令
    • 注意,它应该在一个且只有一个编译单元中添加,否则会开始出现多个定义错误。
    • @ben GUID 被定义为具有外部链接的常量。我相信这些可以被引入任意数量的编译单元而不会导致 ODR 违规,只要他们都同意。
    • @IInspectable:外部链接不会创建规则的例外“每个程序都应包含在该程序中使用的每个非内联函数或变量的一个定义语句”,虽然保持不变有时会导致 odr-unused,但 GUID 经常通过地址传递。
    • @IInspectable: 它最终被允许的原因是initguid.hDEFINE_GUID 的定义中添加了DECLSPEC_SELECTANY 宏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2012-11-25
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多