Пишу простое консольное приложение
При попытке скомпилировать проект линковщик выдает следующее:
Соответствующие переменные валяются в 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;
}
Попробовал решение по коду ошибки, но не особо получилось. Подскажите,пожалуйста, почему проект не собирается?
Ошибка возникает из-за того, что вы не определили 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);
и все заработает.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Решил я программу написать которая выводит время и каждую 1 секунду обновляет форму Label1 но вот случилась проблема, после вызова while true программа...