ошибки линковщика

80
23 ноября 2020, 05:10

Пишу простое консольное приложение
При попытке скомпилировать проект линковщик выдает следующее:

Соответствующие переменные валяются в IIndexer.h

#pragma once
#include <Windows.h>
 DEFINE_GUID(CLSID_Indexer,
    0xa888f560, 0x58e4, 0x11d0, 0xa6, 0x8a, 0x0, 0x0, 0x83, 0x7e, 0x31, 0x0);
DEFINE_GUID(IID_IIndexer,
    0xa888f561, 0x58e4, 0x11d0, 0xa6, 0x8a, 0x0, 0x0, 0x83, 0x7e, 0x31, 0x0);

class IIndexer : public IUnknown
{
public:
};

От интерфейса наследуется класс Indexer(файл Indexer.h)

#pragma once
#include "IIndexer.h"
class Indexer : public IIndexer
{
public:
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv);
    virtual ULONG   STDMETHODCALLTYPE AddRef();
    virtual ULONG   STDMETHODCALLTYPE Release();
private:
    DWORD m_lRef;
public:
    Indexer();
    ~Indexer();
};

Нужные мне переменные CLSID_Indexer и IID_IIndexer используются в Indexer.cpp

#include "Indexer.h"
Indexer::Indexer()
{
    m_lRef = 0;
}
Indexer::~Indexer()
{
}
ULONG Indexer::AddRef()
{
    InterlockedIncrement(&m_lRef);
    return m_lRef;
}
ULONG Indexer::Release()
{
    InterlockedDecrement(&m_lRef);
    if (m_lRef == 0)
    {
        delete this;
        return 0;
    }
    else
    {
        return m_lRef;
    }
}
HRESULT Indexer::QueryInterface(REFIID riid, void **ppv)
{
    *ppv = 0;
    if (riid == IID_IUnknown || riid == IID_IIndexer)
    {
        *ppv = this;
    }
    if (*ppv)
    {
        AddRef();
        return S_OK;
    }
    else
    {
        return E_NOINTERFACE;
    }
}

В main.cpp лежит следующий код

#include <iostream>
#include "IIndexer.h"
int main()
{
    IIndexer *indexer;
    CoInitialize(NULL);
    HRESULT res = CoCreateInstance(CLSID_Indexer,
        NULL,
        CLSCTX_INPROC,
        IID_IIndexer,
        (LPVOID*)&indexer);
    if (indexer == NULL) std::cout << "FAILED TO CREATE OBJECT" << std::endl;
    else std::cout << "SUCCESS" << std::endl;
    return EXIT_SUCCESS;
}

Попробовал решение по коду ошибки, но не особо получилось. Подскажите,пожалуйста, почему проект не собирается?

Answer 1

Ошибка возникает из-за того, что вы не определили GUID'ы. Дело в том, что макрос DEFINE_GUID необязательно определяет GUID. Если не подключен заголовок initguid.h, то этот макрос объявляет GUID как внешний символ. То есть этот макрос должен вызываться как минимум два раза, причем идентичным образом - один или более раз в файлах .h для объявления, и ровно один раз в одном из .cpp файлов для собственно определения.

Решение тут такое: добавьте в один из ваших .cpp файлов следующий код:

#include <initguid.h>
DEFINE_GUID(CLSID_Indexer,
    0xa888f560, 0x58e4, 0x11d0, 0xa6, 0x8a, 0x0, 0x0, 0x83, 0x7e, 0x31, 0x0);
DEFINE_GUID(IID_IIndexer,
    0xa888f561, 0x58e4, 0x11d0, 0xa6, 0x8a, 0x0, 0x0, 0x83, 0x7e, 0x31, 0x0);

и все заработает.

READ ALSO
Программа виснет после вызова метода while(true)

Программа виснет после вызова метода while(true)

Решил я программу написать которая выводит время и каждую 1 секунду обновляет форму Label1 но вот случилась проблема, после вызова while true программа...

100