Unresolved на IID
От: JustMoose  
Дата: 14.02.08 06:39
Оценка:
Всем привет!

Ничего не понимаю.
Пишу программку, для работы с ActiveScript.
Код (урезанный) таков:

#include <activscp.h>
...
void main() {
...
    IActiveScript *isc;
    hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IActiveScript, (void **)&isc);
...
    IActiveScriptParse *isp;
    hr = isc->QueryInterface(IID_IActiveScriptParse, (void **)&isp);
}

Что интересно, IActiveScript линкер видит, а на IID_IActiveScriptParse ругается, что мол unresolved external.
Причем без разницы, писать ли IID_IActiveScriptParse, или IID_IActiveScriptParse32 (первое задефайнено как второе в activscp.h).
Ошибка такая возникает в Borland C++ Builder 6.0. В VC++ 2003 всё замечательно компилируется.
Что я делаю не так?

Спасибки.
Re: Unresolved на IID
От: Vi2 Удмуртия http://www.adem.ru
Дата: 14.02.08 07:40
Оценка:
Здравствуйте, JustMoose, Вы писали:

JM>Пишу программку, для работы с ActiveScript.

JM>Код (урезанный) таков:
JM>#include <activscp.h>
JM>...
JM>void main() {
JM>...
JM>    IActiveScript *isc;
JM>    hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IActiveScript, (void **)&isc);
JM>...
JM>    IActiveScriptParse *isp;
JM>    hr = isc->QueryInterface(IID_IActiveScriptParse, (void **)&isp);
JM>}

JM>Что интересно, IActiveScript линкер видит, а на IID_IActiveScriptParse ругается, что мол unresolved external.
JM>Причем без разницы, писать ли IID_IActiveScriptParse, или IID_IActiveScriptParse32 (первое задефайнено как второе в activscp.h).
JM>Ошибка такая возникает в Borland C++ Builder 6.0. В VC++ 2003 всё замечательно компилируется.
JM>Что я делаю не так?

// macros to define byte pattern for a GUID.
// Example: DEFINE_GUID(GUID_XXX, a, b, c, ...);
//
// Each dll/exe must initialize the GUIDs once. This is done in one of
// two ways. If you are not using precompiled headers for the file(s) which
// initializes the GUIDs, define INITGUID before including compobj.h. This
// is how OLE builds the initialized versions of the GUIDs which are included
// in ole2.lib. The GUIDs in ole2.lib are all defined in the same text
// segment GUID_TEXT.
//
// The alternative (which some versions of the compiler don't handle properly;
// they wind up with the initialized GUIDs in a data, not a text segment),
// is to use a precompiled version of compobj.h and then include initguid.h
// after compobj.h followed by one or more of the guid defintion files.

#ifndef INITGUID
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID FAR name
#else

#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID name \
= { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
#endif // INITGUID

Или использовать __uuidof(IActiveScript) или __uuidof(isc).
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Unresolved на IID
От: JustMoose  
Дата: 14.02.08 07:59
Оценка:
Йе-е-е-е-е-е!
#define INITGUID спасло отца русской демократии!
Спасибо, блин, большое! Большое, блин, спасибо! (с)...


Я вот только одного не пойму, а чем же отличаются IID_IActiveScript и IID_IActiveScriptParse32...
Потому как объявляются они в одном месте... Рыдышком... В хидере... Странненько.
Re[3]: Unresolved на IID
От: Vi2 Удмуртия http://www.adem.ru
Дата: 14.02.08 13:51
Оценка:
Здравствуйте, JustMoose, Вы писали:

JM>Я вот только одного не пойму, а чем же отличаются IID_IActiveScript и IID_IActiveScriptParse32...

JM>Потому как объявляются они в одном месте... Рыдышком... В хидере... Странненько.

Это GUIDы двух различных интерфейсов, поэтому они и различны. А что странного в этом?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: Unresolved на IID
От: JustMoose  
Дата: 15.02.08 04:58
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Это GUIDы двух различных интерфейсов, поэтому они и различны. А что странного в этом?


Странно то, что линкер видет только один из них... По крайней мере, пока не будут произведены танцы с бубнами, в виде задефайневания INITGUID.
Я ещё могу понять, если бы эти два IID жили в разных частях хидера, и один из них был бы завернут в какой-нибудь хитрый ifndef. Но нет. Между ними нет никакой разницы, не считая численного значения
Эх... Решение найдено, а понимание не пришло. Ну и ладно.
Re[5]: Unresolved на IID
От: Vi2 Удмуртия http://www.adem.ru
Дата: 15.02.08 09:08
Оценка:
Здравствуйте, JustMoose, Вы писали:

JM>Странно то, что линкер видет только один из них... По крайней мере, пока не будут произведены танцы с бубнами, в виде задефайневания INITGUID.

JM>Я ещё могу понять, если бы эти два IID жили в разных частях хидера, и один из них был бы завернут в какой-нибудь хитрый ifndef. Но нет. Между ними нет никакой разницы, не считая численного значения

Наверное, линкер грузит некий объектный файл, в котором определен IID_IActiveScript и не определен IID_IActiveScriptParse. Без INITGUID это не зависит от хидеров твоего проекта — они оба объявляются внешними.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.