Ссылка на GUID

Я пытаюсь захватить событие и сослаться на 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?

Заранее спасибо за помощь.

Ура,

Нил

 Luke11 июн. 2012 г., 16:01
Я думаю, что обычно GUID объявляются в заголовочных файлах, но определяются во внешней библиотеке. Чтобы решить проблему, вам просто нужно связать библиотеку с вашей программой. Другой вариант - включить & lt; initguid.h & gt; перед включением этого заголовочного файла; это изменяет макрос DEFINE_GUID, чтобы фактически определять GUID встроенными, а не внешними.

Ответы на вопрос(2)

DEFINE_GUID макрос либо определяет именованныйGUID как статический, или просто делает предварительное объявление, которое фактически должно быть сделано где-то еще. Ваш код, возможно, имеет только последнее, а символы не имеют фактической инициализации в рамках проекта.

Увидеть:

How to avoid error "LNK2001 unresolved external" by using DEFINE_GUID INITGUID: An Explanation How does the DEFINE_GUID macro work? - at the bottom of the page
Решение Вопроса

#include <initguid.h>должны быть добавлены. Это поможет

 11 мар. 2017 г., 20:53
Это правильный ответ.
 03 сент. 2015 г., 17:56
Эта информация была чрезвычайно полезной!
 06 июн. 2018 г., 17:03
сработало, хотя оно было помечено как возможно неиспользуемая директива включения

Ваш ответ на вопрос