определение интерфесов в IDL файле
От: dima_gf  
Дата: 24.09.03 08:54
Оценка: 7 (1)
При создании idl файла, определения интерфейсов можно
поместить как в блок библиотеки library:

library DDD
{
[...]
interface d1 : IUnknown {...};
};

так и перед библиотекой:

[...]
interface d1 : IUnknown{...};

library DDD
{
};

Если описание поместить в билиотеку,
то компилятор НЕ генерит proxy заглушки. Вопрос — почему? И как его
заставить генерить их.
Может, то что помещено в билиотеку имеет какие-то свои proxy
заглушки и не стоит об этом беспокоиться?
Re: определение интерфесов в IDL файле
От: Аноним  
Дата: 24.09.03 09:11
Оценка:
Здравствуйте, dima_gf, Вы писали:

_>При создании idl файла, определения интерфейсов можно

_> поместить как в блок библиотеки library:

_>library DDD

_>{
_> [...]
_> interface d1 : IUnknown {...};
_>};

_>так и перед библиотекой:


_>[...]

_>interface d1 : IUnknown{...};

_>library DDD

_>{
_>};

_>Если описание поместить в билиотеку,

_>то компилятор НЕ генерит proxy заглушки. Вопрос — почему? И как его
_>заставить генерить их.
_>Может, то что помещено в билиотеку имеет какие-то свои proxy
_>заглушки и не стоит об этом беспокоиться?

Я не большой спец в MIDL, но насколко знаю, все, что объявляется внутри оператора library, не будет учитываться при генерации файлов с определениями типов С++. Помещение объявления внутрь оператора library говорит о том, что этот тип будет скомпилирован в библиотеку типов. Однако его не обязательно явно определять внутри. Достаточно, чтобы внутри оператора library была ссылка на этот тип, ин он будет включен.

Так что при создании сових библиотек просто старайся описывать типы вне оператора library, это может пригодиться
Re: определение интерфесов в IDL файле
От: DrMom  
Дата: 24.09.03 09:17
Оценка:
Здравствуйте, dima_gf, Вы писали:

_>При создании idl файла, определения интерфейсов можно

_> поместить как в блок библиотеки library:

_>library DDD

_>{
_> [...]
_> interface d1 : IUnknown {...};
_>};

_>так и перед библиотекой:


_>[...]

_>interface d1 : IUnknown{...};

_>library DDD

_>{
_>};

_>Если описание поместить в билиотеку,

_>то компилятор НЕ генерит proxy заглушки. Вопрос — почему? И как его
_>заставить генерить их.
_>Может, то что помещено в билиотеку имеет какие-то свои proxy
_>заглушки и не стоит об этом беспокоиться?

Что значит не генерит? Очень даже генерит. Может просто ты не включал интерфейс в кокласс, тогда вполне возможно, что не генерит. А вобще очень важно как описан интерфейс точно. Например наличие атрибута oleautomation говорит, что используется стандартная ps.
Re[2]: определение интерфесов в IDL файле
От: dima_gf  
Дата: 24.09.03 09:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, dima_gf, Вы писали:


_>>При создании idl файла, определения интерфейсов можно

_>> поместить как в блок библиотеки library:

_>>library DDD

_>>{
_>> [...]
_>> interface d1 : IUnknown {...};
_>>};

_>>так и перед библиотекой:


_>>[...]

_>>interface d1 : IUnknown{...};

_>>library DDD

_>>{
_>>};

_>>Если описание поместить в билиотеку,

_>>то компилятор НЕ генерит proxy заглушки. Вопрос — почему? И как его
_>>заставить генерить их.
_>>Может, то что помещено в билиотеку имеет какие-то свои proxy
_>>заглушки и не стоит об этом беспокоиться?

А>Я не большой спец в MIDL, но насколко знаю, все, что объявляется внутри оператора library, не будет учитываться при генерации файлов с определениями типов С++. Помещение объявления внутрь оператора library говорит о том, что этот тип будет скомпилирован в библиотеку типов. Однако его не обязательно явно определять внутри. Достаточно, чтобы внутри оператора library была ссылка на этот тип, ин он будет включен.


А>Так что при создании сових библиотек просто старайся описывать типы вне оператора library, это может пригодиться




Списибо за ответ. Но дело в том, что при опиании интерфейса перед библиотекой — производится вставка описания интерфеса в заголовочнв\ый файл — что не всегда удобно — а именно, когда приходится ссылаться на другие интерфейсы. При этом могут получиться перекрестные ссылки и переопределеня интерфесов. Если все описывать внутри библиотеки — то можно очень комфортно использовать директиву import — без проблем.
Re[2]: определение интерфесов в IDL файле
От: dima_gf  
Дата: 24.09.03 09:47
Оценка:
Здравствуйте, DrMom, Вы писали:

DM>Здравствуйте, dima_gf, Вы писали:


_>>При создании idl файла, определения интерфейсов можно

_>> поместить как в блок библиотеки library:

_>>library DDD

_>>{
_>> [...]
_>> interface d1 : IUnknown {...};
_>>};

_>>так и перед библиотекой:


_>>[...]

_>>interface d1 : IUnknown{...};

_>>library DDD

_>>{
_>>};

_>>Если описание поместить в билиотеку,

_>>то компилятор НЕ генерит proxy заглушки. Вопрос — почему? И как его
_>>заставить генерить их.
_>>Может, то что помещено в билиотеку имеет какие-то свои proxy
_>>заглушки и не стоит об этом беспокоиться?

DM>Что значит не генерит? Очень даже генерит. Может просто ты не включал интерфейс в кокласс, тогда вполне возможно, что не генерит. А вобще очень важно как описан интерфейс точно. Например наличие атрибута oleautomation говорит, что используется стандартная ps.



Спасибо за ответ. не генерит — значит не генрит — вот пример когда генерится заглушка:

файл iobj.idl
-----------------------------------------------------------

[
object,
uuid(021C86F6-F92D-496a-90A4-D32C1D524A48),
helpstring("IGF_Object Interface"),
pointer_default(unique)
]
interface IGF_Object : IUnknown
{
HRESULT IdObject([out, retval] BSTR *pVal);
}

--------------------------------------------------------------

файл lib.idl

-----------------------------------------------------

#include iobj.idl;

[
uuid(6AEA4D7A-F567-407E-8CA4-D71B73CAF4AA),
version(1.0),
helpstring("xl_common 1.0 Type Library")
]
library XL_CommonLib
{
[
uuid(989AB07A-26A1-4333-8595-6C6A6469BCFF),
helpstring("GF_AlarmClock Class")
]
coclass GF_AlarmClock
{
[default] interface IGF_AlarmClockDisp;
[default, source] dispinterface _IGF_Events;
interface IGF_AlarmClock;
interface IGF_Object;
};
};

-------------------------------------------------------------


вот пример когда НЕ генерится заглушка:

------------------------------------------------------


[
uuid(6AEA4D7A-F567-407E-8CA4-D71B73CAF4AA),
version(1.0),
helpstring("xl_common 1.0 Type Library")
]
library XL_CommonLib
{


#include iobj.idl;

[
uuid(989AB07A-26A1-4333-8595-6C6A6469BCFF),
helpstring("GF_AlarmClock Class")
]
coclass GF_AlarmClock
{
[default] interface IGF_AlarmClockDisp;
[default, source] dispinterface _IGF_Events;
interface IGF_AlarmClock;
interface IGF_Object;
};
};

------------------------------------------------------------------------
Re[3]: определение интерфесов в IDL файле
От: dima_gf  
Дата: 24.09.03 09:55
Оценка:
Здравствуйте, dima_gf, Вы писали:

_>Здравствуйте, DrMom, Вы писали:


DM>>Здравствуйте, dima_gf, Вы писали:


_>>>При создании idl файла, определения интерфейсов можно

_>>> поместить как в блок библиотеки library:

_>>>library DDD

_>>>{
_>>> [...]
_>>> interface d1 : IUnknown {...};
_>>>};

_>>>так и перед библиотекой:


_>>>[...]

_>>>interface d1 : IUnknown{...};

_>>>library DDD

_>>>{
_>>>};

_>>>Если описание поместить в билиотеку,

_>>>то компилятор НЕ генерит proxy заглушки. Вопрос — почему? И как его
_>>>заставить генерить их.
_>>>Может, то что помещено в билиотеку имеет какие-то свои proxy
_>>>заглушки и не стоит об этом беспокоиться?

DM>>Что значит не генерит? Очень даже генерит. Может просто ты не включал интерфейс в кокласс, тогда вполне возможно, что не генерит. А вобще очень важно как описан интерфейс точно. Например наличие атрибута oleautomation говорит, что используется стандартная ps.



_>Спасибо за ответ. не генерит — значит не генрит — вот пример когда генерится заглушка:


_>файл iobj.idl

_>-----------------------------------------------------------

_>[

_> object,
_> uuid(021C86F6-F92D-496a-90A4-D32C1D524A48),
_> helpstring("IGF_Object Interface"),
_> pointer_default(unique)
_>]
_>interface IGF_Object : IUnknown
_>{
_> HRESULT IdObject([out, retval] BSTR *pVal);
_>}

_>--------------------------------------------------------------


_>файл lib.idl


_>-----------------------------------------------------


_>#include iobj.idl;


_>[

_> uuid(6AEA4D7A-F567-407E-8CA4-D71B73CAF4AA),
_> version(1.0),
_> helpstring("xl_common 1.0 Type Library")
_>]
_>library XL_CommonLib
_>{
_> [
_> uuid(989AB07A-26A1-4333-8595-6C6A6469BCFF),
_> helpstring("GF_AlarmClock Class")
_> ]
_> coclass GF_AlarmClock
_> {
_> [default] interface IGF_AlarmClockDisp;
_> [default, source] dispinterface _IGF_Events;
_> interface IGF_AlarmClock;
_> interface IGF_Object;
_> };
_>};

_>-------------------------------------------------------------



_>вот пример когда НЕ генерится заглушка:


_>------------------------------------------------------



_>[

_> uuid(6AEA4D7A-F567-407E-8CA4-D71B73CAF4AA),
_> version(1.0),
_> helpstring("xl_common 1.0 Type Library")
_>]
_>library XL_CommonLib
_>{


_>#include iobj.idl;


_> [

_> uuid(989AB07A-26A1-4333-8595-6C6A6469BCFF),
_> helpstring("GF_AlarmClock Class")
_> ]
_> coclass GF_AlarmClock
_> {
_> [default] interface IGF_AlarmClockDisp;
_> [default, source] dispinterface _IGF_Events;
_> interface IGF_AlarmClock;
_> interface IGF_Object;
_> };
_>};

_>------------------------------------------------------------------------


В догонку:
Если заменить include на явное объявление интерфеса — то ничего не изменится. Include применяется только
для читабельности текстов.
Re[3]: определение интерфесов в IDL файле
От: DrMom  
Дата: 24.09.03 10:22
Оценка:
Здравствуйте, dima_gf, Вы писали:

_>Здравствуйте, DrMom, Вы писали:


DM>>Здравствуйте, dima_gf, Вы писали:


_>>>При создании idl файла, определения интерфейсов можно

_>>> поместить как в блок библиотеки library:

_>>>library DDD

_>>>{
_>>> [...]
_>>> interface d1 : IUnknown {...};
_>>>};

_>>>так и перед библиотекой:


_>>>[...]

_>>>interface d1 : IUnknown{...};

_>>>library DDD

_>>>{
_>>>};

_>>>Если описание поместить в билиотеку,

_>>>то компилятор НЕ генерит proxy заглушки. Вопрос — почему? И как его
_>>>заставить генерить их.
_>>>Может, то что помещено в билиотеку имеет какие-то свои proxy
_>>>заглушки и не стоит об этом беспокоиться?

DM>>Что значит не генерит? Очень даже генерит. Может просто ты не включал интерфейс в кокласс, тогда вполне возможно, что не генерит. А вобще очень важно как описан интерфейс точно. Например наличие атрибута oleautomation говорит, что используется стандартная ps.



_>Спасибо за ответ. не генерит — значит не генрит — вот пример когда генерится заглушка:


_>файл iobj.idl

_>-----------------------------------------------------------

_>[

_> object,
_> uuid(021C86F6-F92D-496a-90A4-D32C1D524A48),
_> helpstring("IGF_Object Interface"),
_> pointer_default(unique)
_>]
_>interface IGF_Object : IUnknown
_>{
_> HRESULT IdObject([out, retval] BSTR *pVal);
_>}

_>--------------------------------------------------------------


_>файл lib.idl


_>-----------------------------------------------------


_>#include iobj.idl;


_>[

_> uuid(6AEA4D7A-F567-407E-8CA4-D71B73CAF4AA),
_> version(1.0),
_> helpstring("xl_common 1.0 Type Library")
_>]
_>library XL_CommonLib
_>{
_> [
_> uuid(989AB07A-26A1-4333-8595-6C6A6469BCFF),
_> helpstring("GF_AlarmClock Class")
_> ]
_> coclass GF_AlarmClock
_> {
_> [default] interface IGF_AlarmClockDisp;
_> [default, source] dispinterface _IGF_Events;
_> interface IGF_AlarmClock;
_> interface IGF_Object;
_> };
_>};

_>-------------------------------------------------------------



_>вот пример когда НЕ генерится заглушка:


_>------------------------------------------------------



_>[

_> uuid(6AEA4D7A-F567-407E-8CA4-D71B73CAF4AA),
_> version(1.0),
_> helpstring("xl_common 1.0 Type Library")
_>]
_>library XL_CommonLib
_>{


_>#include iobj.idl;


_> [

_> uuid(989AB07A-26A1-4333-8595-6C6A6469BCFF),
_> helpstring("GF_AlarmClock Class")
_> ]
_> coclass GF_AlarmClock
_> {
_> [default] interface IGF_AlarmClockDisp;
_> [default, source] dispinterface _IGF_Events;
_> interface IGF_AlarmClock;
_> interface IGF_Object;
_> };
_>};

_>------------------------------------------------------------------------


Ну так, на сколько я понимаю, для этого интерфейса и не надо генерить заглушку. Здесь ведь все типы стандартные. Просто запускаешь nmake -f *.mak и все. Может я чего не понял, то просьбы пояснить.

ЗЫ И еще я снова не понял, что значит не генерится заглушка? Типа даже сишные файлы не создаются? Сейчас попробую.
Re[4]: определение интерфесов в IDL файле
От: dima_gf  
Дата: 24.09.03 10:49
Оценка:
Здравствуйте, DrMom, Вы писали:

DM>Здравствуйте, dima_gf, Вы писали:


_>>Здравствуйте, DrMom, Вы писали:


DM>>>Здравствуйте, dima_gf, Вы писали:


_>>>>При создании idl файла, определения интерфейсов можно

_>>>> поместить как в блок библиотеки library:

_>>>>library DDD

_>>>>{
_>>>> [...]
_>>>> interface d1 : IUnknown {...};
_>>>>};

_>>>>так и перед библиотекой:


_>>>>[...]

_>>>>interface d1 : IUnknown{...};

_>>>>library DDD

_>>>>{
_>>>>};

_>>>>Если описание поместить в билиотеку,

_>>>>то компилятор НЕ генерит proxy заглушки. Вопрос — почему? И как его
_>>>>заставить генерить их.
_>>>>Может, то что помещено в билиотеку имеет какие-то свои proxy
_>>>>заглушки и не стоит об этом беспокоиться?

DM>>>Что значит не генерит? Очень даже генерит. Может просто ты не включал интерфейс в кокласс, тогда вполне возможно, что не генерит. А вобще очень важно как описан интерфейс точно. Например наличие атрибута oleautomation говорит, что используется стандартная ps.



_>>Спасибо за ответ. не генерит — значит не генрит — вот пример когда генерится заглушка:


_>>файл iobj.idl

_>>-----------------------------------------------------------

_>>[

_>> object,
_>> uuid(021C86F6-F92D-496a-90A4-D32C1D524A48),
_>> helpstring("IGF_Object Interface"),
_>> pointer_default(unique)
_>>]
_>>interface IGF_Object : IUnknown
_>>{
_>> HRESULT IdObject([out, retval] BSTR *pVal);
_>>}

_>>--------------------------------------------------------------


_>>файл lib.idl


_>>-----------------------------------------------------


_>>#include iobj.idl;


_>>[

_>> uuid(6AEA4D7A-F567-407E-8CA4-D71B73CAF4AA),
_>> version(1.0),
_>> helpstring("xl_common 1.0 Type Library")
_>>]
_>>library XL_CommonLib
_>>{
_>> [
_>> uuid(989AB07A-26A1-4333-8595-6C6A6469BCFF),
_>> helpstring("GF_AlarmClock Class")
_>> ]
_>> coclass GF_AlarmClock
_>> {
_>> [default] interface IGF_AlarmClockDisp;
_>> [default, source] dispinterface _IGF_Events;
_>> interface IGF_AlarmClock;
_>> interface IGF_Object;
_>> };
_>>};

_>>-------------------------------------------------------------



_>>вот пример когда НЕ генерится заглушка:


_>>------------------------------------------------------



_>>[

_>> uuid(6AEA4D7A-F567-407E-8CA4-D71B73CAF4AA),
_>> version(1.0),
_>> helpstring("xl_common 1.0 Type Library")
_>>]
_>>library XL_CommonLib
_>>{


_>>#include iobj.idl;


_>> [

_>> uuid(989AB07A-26A1-4333-8595-6C6A6469BCFF),
_>> helpstring("GF_AlarmClock Class")
_>> ]
_>> coclass GF_AlarmClock
_>> {
_>> [default] interface IGF_AlarmClockDisp;
_>> [default, source] dispinterface _IGF_Events;
_>> interface IGF_AlarmClock;
_>> interface IGF_Object;
_>> };
_>>};

_>>------------------------------------------------------------------------


DM>Ну так, на сколько я понимаю, для этого интерфейса и не надо генерить заглушку. Здесь ведь все типы стандартные. Просто запускаешь nmake -f *.mak и все. Может я чего не понял, то просьбы пояснить.


DM>ЗЫ И еще я снова не понял, что значит не генерится заглушка? Типа даже сишные файлы не создаются? Сейчас попробую.



Спасибо за участие.
По поводу стандартных типов — дело в том, что заглушка генерируется и для них (если посмотреть результирующий
сишный файл). А не генерится — именно сишные файлы. Др. словами все что указано за библиотекой — проксится (не зависимо от типа параметров).
Вот что получается по приведенной функции:

static const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString =
{
0,
{

/* Procedure get_IdObject */

0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 2 */ NdrFcLong( 0x0 ), /* 0 */
/* 6 */ NdrFcShort( 0x3 ), /* 3 */
/* 8 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */
/* 10 */ NdrFcShort( 0x0 ), /* 0 */
/* 12 */ NdrFcShort( 0x8 ), /* 8 */
/* 14 */ 0x5, /* Oi2 Flags: srv must size, has return, */
0x2, /* 2 */

/* Parameter pVal */

/* 16 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */
/* 18 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */
/* 20 */ NdrFcShort( 0x1e ), /* Type Offset=30 */

/* Return value */

/* 22 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 24 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */
/* 26 */ 0x8, /* FC_LONG */
0x0, /* 0 */

конец


Хотя — по поводу стандартности парамкетров я не подумал, впрочем зачем тогда генерировать?
Re[4]: определение интерфесов в IDL файле
От: dima_gf  
Дата: 24.09.03 10:57
Оценка:
Здравствуйте, DrMom, Вы писали:

DM>Здравствуйте, dima_gf, Вы писали:


_>>Здравствуйте, DrMom, Вы писали:


DM>>>Здравствуйте, dima_gf, Вы писали:


_>>>>При создании idl файла, определения интерфейсов можно

_>>>> поместить как в блок библиотеки library:

_>>>>library DDD

_>>>>{
_>>>> [...]
_>>>> interface d1 : IUnknown {...};
_>>>>};

_>>>>так и перед библиотекой:


_>>>>[...]

_>>>>interface d1 : IUnknown{...};

_>>>>library DDD

_>>>>{
_>>>>};

_>>>>Если описание поместить в билиотеку,

_>>>>то компилятор НЕ генерит proxy заглушки. Вопрос — почему? И как его
_>>>>заставить генерить их.
_>>>>Может, то что помещено в билиотеку имеет какие-то свои proxy
_>>>>заглушки и не стоит об этом беспокоиться?

DM>>>Что значит не генерит? Очень даже генерит. Может просто ты не включал интерфейс в кокласс, тогда вполне возможно, что не генерит. А вобще очень важно как описан интерфейс точно. Например наличие атрибута oleautomation говорит, что используется стандартная ps.



_>>Спасибо за ответ. не генерит — значит не генрит — вот пример когда генерится заглушка:


_>>файл iobj.idl

_>>-----------------------------------------------------------

_>>[

_>> object,
_>> uuid(021C86F6-F92D-496a-90A4-D32C1D524A48),
_>> helpstring("IGF_Object Interface"),
_>> pointer_default(unique)
_>>]
_>>interface IGF_Object : IUnknown
_>>{
_>> HRESULT IdObject([out, retval] BSTR *pVal);
_>>}

_>>--------------------------------------------------------------


_>>файл lib.idl


_>>-----------------------------------------------------


_>>#include iobj.idl;


_>>[

_>> uuid(6AEA4D7A-F567-407E-8CA4-D71B73CAF4AA),
_>> version(1.0),
_>> helpstring("xl_common 1.0 Type Library")
_>>]
_>>library XL_CommonLib
_>>{
_>> [
_>> uuid(989AB07A-26A1-4333-8595-6C6A6469BCFF),
_>> helpstring("GF_AlarmClock Class")
_>> ]
_>> coclass GF_AlarmClock
_>> {
_>> [default] interface IGF_AlarmClockDisp;
_>> [default, source] dispinterface _IGF_Events;
_>> interface IGF_AlarmClock;
_>> interface IGF_Object;
_>> };
_>>};

_>>-------------------------------------------------------------



_>>вот пример когда НЕ генерится заглушка:


_>>------------------------------------------------------



_>>[

_>> uuid(6AEA4D7A-F567-407E-8CA4-D71B73CAF4AA),
_>> version(1.0),
_>> helpstring("xl_common 1.0 Type Library")
_>>]
_>>library XL_CommonLib
_>>{


_>>#include iobj.idl;


_>> [

_>> uuid(989AB07A-26A1-4333-8595-6C6A6469BCFF),
_>> helpstring("GF_AlarmClock Class")
_>> ]
_>> coclass GF_AlarmClock
_>> {
_>> [default] interface IGF_AlarmClockDisp;
_>> [default, source] dispinterface _IGF_Events;
_>> interface IGF_AlarmClock;
_>> interface IGF_Object;
_>> };
_>>};

_>>------------------------------------------------------------------------


DM>Ну так, на сколько я понимаю, для этого интерфейса и не надо генерить заглушку. Здесь ведь все типы стандартные. Просто запускаешь nmake -f *.mak и все. Может я чего не понял, то просьбы пояснить.


DM>ЗЫ И еще я снова не понял, что значит не генерится заглушка? Типа даже сишные файлы не создаются? Сейчас попробую.



Не генерится ни сишный файл ни dll. А работаю я из оболчки VC 7.
Re[5]: определение интерфесов в IDL файле
От: DrMom  
Дата: 24.09.03 11:00
Оценка:
Здравствуйте, dima_gf, Вы писали:


_>Хотя — по поводу стандартности парамкетров я не подумал, впрочем зачем тогда генерировать?


Незачем. Все и так работать будет. Обычно озаглушке вспоминают тогда когда методы с нестандартными параметрами выпоняться перестают. (сам так все время вспоминаю)
Re[6]: определение интерфесов в IDL файле
От: DrMom  
Дата: 24.09.03 11:48
Оценка:
Здравствуйте, DrMom, Вы писали:

DM>Здравствуйте, dima_gf, Вы писали:



_>>Хотя — по поводу стандартности парамкетров я не подумал, впрочем зачем тогда генерировать?


DM>Незачем. Все и так работать будет. Обычно озаглушке вспоминают тогда когда методы с нестандартными параметрами выпоняться перестают. (сам так все время вспоминаю)


Да уж, нафилиздипил я здесь... Вобщем так. Если все параметры стандартные, то используй атрибут oleautomation и не парься с заглушкой. Если нет, то заглушка нужна. Вот почему сишные файлы не генерятся это для меня загадка, т.к. использование объектов становится возможным только в пределах одного апартамента. Вобще я всегда описывал интерфейсы за приделами библиотеки, т.к. давно сталкивался с этой проблемой. Тогда я выяснил, что если на интерфейс нет ссылок в library XXXLib, то и в библиотеку типов он не попадет.
Re[6]: определение интерфесов в IDL файле
От: dima_gf  
Дата: 24.09.03 11:51
Оценка:
Здравствуйте, DrMom, Вы писали:

DM>Здравствуйте, dima_gf, Вы писали:



_>>Хотя — по поводу стандартности парамкетров я не подумал, впрочем зачем тогда генерировать?


DM>Незачем. Все и так работать будет. Обычно озаглушке вспоминают тогда когда методы с нестандартными параметрами выпоняться перестают. (сам так все время вспоминаю)


Согласен. Но что же делать с НЕСТАНДАРТНЫМИ данными — они же тоже не "озаглушиваются". Тогда придется думать — какие у тебя данные — стандартные или нет. Хотя все эти рассуждения не имеют смысла. Факт остается — почему-то не строятся заглушки — это вы тоже поняли.
Re: определение интерфесов в IDL файле
От: DrMom  
Дата: 24.09.03 12:02
Оценка:
Здравствуйте, dima_gf, Вы писали:

_>При создании idl файла, определения интерфейсов можно

_> поместить как в блок библиотеки library:

_>library DDD

_>{
_> [...]
_> interface d1 : IUnknown {...};
_>};

_>так и перед библиотекой:


_>[...]

_>interface d1 : IUnknown{...};

_>library DDD

_>{
_>};

_>Если описание поместить в билиотеку,

_>то компилятор НЕ генерит proxy заглушки. Вопрос — почему? И как его
_>заставить генерить их.
_>Может, то что помещено в билиотеку имеет какие-то свои proxy
_>заглушки и не стоит об этом беспокоиться?

А вот я например сделал PS для такого файла:


// MIDLTest.idl : IDL source for MIDLTest.dll
//

// This file will be processed by the MIDL tool to
// produce the type library (MIDLTest.tlb) and marshalling code.

import "oaidl.idl";
import "ocidl.idl";
[
    uuid(D9EC3169-EFAA-42B8-B731-EE244D566D34),
    version(1.0),
    helpstring("MIDLTest 1.0 Type Library")
]
library MIDLTESTLib
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");

    [
        object,
        uuid(89E8C244-75BE-41F2-BA08-B4D3492533E5),
    
        helpstring("IObj Interface"),
        pointer_default(unique)
    ]
    interface IObj : IUnknown
    {
        [propget, helpstring("property Func")] HRESULT Func([out, retval] long *pVal);
        [propput, helpstring("property Func")] HRESULT Func([in] long newVal);
    };

    [
        uuid(4C7F475E-5D7E-4AFF-B437-D619520EFA4E),
        helpstring("Obj Class")
    ]
    coclass Obj
    {
        [default] interface IObj;
    };
};


Вобщем я так понимаю, что мой VC6 глючит и от раза к разу если тосовать idl файл то генерит, то нет заглушку. Вот такая вот фигня. Кстати у меня еще ни всегда генерится заглушка в противоположенном варианте! Причем я все время перекомпилю библиотеку заново и удаляю все файлы компилера (сишные тоже).
Re[7]: определение интерфесов в IDL файле
От: dima_gf  
Дата: 24.09.03 12:25
Оценка:
Здравствуйте, DrMom, Вы писали:

DM>Здравствуйте, DrMom, Вы писали:


DM>>Здравствуйте, dima_gf, Вы писали:



_>>>Хотя — по поводу стандартности парамкетров я не подумал, впрочем зачем тогда генерировать?


DM>>Незачем. Все и так работать будет. Обычно озаглушке вспоминают тогда когда методы с нестандартными параметрами выпоняться перестают. (сам так все время вспоминаю)


DM>Да уж, нафилиздипил я здесь... Вобщем так. Если все параметры стандартные, то используй атрибут oleautomation и не парься с заглушкой. Если нет, то заглушка нужна. Вот почему сишные файлы не генерятся это для меня загадка, т.к. использование объектов становится возможным только в пределах одного апартамента. Вобще я всегда описывал интерфейсы за приделами библиотеки, т.к. давно сталкивался с этой проблемой. Тогда я выяснил, что если на интерфейс нет ссылок в library XXXLib, то и в библиотеку типов он не попадет.


Вообще то я тоже все описывал за библиотекой и не о чем не думал. Но пришло время наводить порядок в написанных интерфейсах, т.е. одни проекты ссылаются на интерфейсы, определенные в других проектах и пошла чехарда. Идут перекрестные ссылки и все время приходится изголяться, но в результате все равно приходится впихивать файлы xxx_i.x.c — определение IID и CLSID. А хотелось бы обойтись директивой import "...dll" и/или importlib(....dll).
Все это получается, если интерфейсы описывать в библиотеке. Но тогда возникает отсутствие заглушок. А программы у меня таковы, что я работаю в смешаной модели памяти — поэтому без proxy не обойтись. Вот откуда растут ноги этой в общем — то пустяковой заморочке. Обойти можно, но с помощью накруток. Кстати просматривая idl в SDK я так и не понял по какому принципу они их строят — есть файлы полностью в либах (как IWebBrowser), есть частично, а есть вообще по одному коклассу в либе.
Re[2]: определение интерфесов в IDL файле
От: dima_gf  
Дата: 24.09.03 12:45
Оценка:
Здравствуйте, DrMom, Вы писали:

DM>Здравствуйте, dima_gf, Вы писали:


_>>При создании idl файла, определения интерфейсов можно

_>> поместить как в блок библиотеки library:

_>>library DDD

_>>{
_>> [...]
_>> interface d1 : IUnknown {...};
_>>};

_>>так и перед библиотекой:


_>>[...]

_>>interface d1 : IUnknown{...};

_>>library DDD

_>>{
_>>};

_>>Если описание поместить в билиотеку,

_>>то компилятор НЕ генерит proxy заглушки. Вопрос — почему? И как его
_>>заставить генерить их.
_>>Может, то что помещено в билиотеку имеет какие-то свои proxy
_>>заглушки и не стоит об этом беспокоиться?

DM>А вот я например сделал PS для такого файла:



DM>
DM>// MIDLTest.idl : IDL source for MIDLTest.dll
DM>//

DM>// This file will be processed by the MIDL tool to
DM>// produce the type library (MIDLTest.tlb) and marshalling code.

DM>import "oaidl.idl";
DM>import "ocidl.idl";
DM>[
DM>    uuid(D9EC3169-EFAA-42B8-B731-EE244D566D34),
DM>    version(1.0),
DM>    helpstring("MIDLTest 1.0 Type Library")
DM>]
DM>library MIDLTESTLib
DM>{
DM>    importlib("stdole32.tlb");
DM>    importlib("stdole2.tlb");

DM>    [
DM>        object,
DM>        uuid(89E8C244-75BE-41F2-BA08-B4D3492533E5),
    
DM>        helpstring("IObj Interface"),
DM>        pointer_default(unique)
DM>    ]
DM>    interface IObj : IUnknown
DM>    {
DM>        [propget, helpstring("property Func")] HRESULT Func([out, retval] long *pVal);
DM>        [propput, helpstring("property Func")] HRESULT Func([in] long newVal);
DM>    };

DM>    [
DM>        uuid(4C7F475E-5D7E-4AFF-B437-D619520EFA4E),
DM>        helpstring("Obj Class")
DM>    ]
DM>    coclass Obj
DM>    {
DM>        [default] interface IObj;
DM>    };
DM>};

DM>


DM>Вобщем я так понимаю, что мой VC6 глючит и от раза к разу если тосовать idl файл то генерит, то нет заглушку. Вот такая вот фигня. Кстати у меня еще ни всегда генерится заглушка в противоположенном варианте! Причем я все время перекомпилю библиотеку заново и удаляю все файлы компилера (сишные тоже).


Глючит не только VC6 но и VC7. Надо делать rebuild заглушки (удалять dll заглушки). А вообще я тоже наблюдал такой эффект если делать простой build — тогда он просто не генерит ничего а впитывает оставшийся файл. Дело в том, что генрация у него проходит в 2 этапа — первый он строит заглушку (сишную) а потом вызывает bat файл который на основании этой заглушки делает dll. Но bat файл тупой и он находит СТАРУЮ сишную заглушку.
Re[8]: определение интерфесов в IDL файле
От: DrMom  
Дата: 24.09.03 14:04
Оценка:
Здравствуйте, dima_gf, Вы писали:

DM>>Да уж, нафилиздипил я здесь... Вобщем так. Если все параметры стандартные, то используй атрибут oleautomation и не парься с заглушкой. Если нет, то заглушка нужна. Вот почему сишные файлы не генерятся это для меня загадка, т.к. использование объектов становится возможным только в пределах одного апартамента. Вобще я всегда описывал интерфейсы за приделами библиотеки, т.к. давно сталкивался с этой проблемой. Тогда я выяснил, что если на интерфейс нет ссылок в library XXXLib, то и в библиотеку типов он не попадет.


_>Вообще то я тоже все описывал за библиотекой и не о чем не думал. Но пришло время наводить порядок в написанных интерфейсах, т.е. одни проекты ссылаются на интерфейсы, определенные в других проектах и пошла чехарда. Идут перекрестные ссылки и все время приходится изголяться, но в результате все равно приходится впихивать файлы xxx_i.x.c — определение IID и CLSID. А хотелось бы обойтись директивой import "...dll" и/или importlib(....dll).

_>Все это получается, если интерфейсы описывать в библиотеке. Но тогда возникает отсутствие заглушок. А программы у меня таковы, что я работаю в смешаной модели памяти — поэтому без proxy не обойтись. Вот откуда растут ноги этой в общем — то пустяковой заморочке. Обойти можно, но с помощью накруток. Кстати просматривая idl в SDK я так и не понял по какому принципу они их строят — есть файлы полностью в либах (как IWebBrowser), есть частично, а есть вообще по одному коклассу в либе.

Интерфейс можно описать вне библиотеки и при этом, чтобы он вошел в нее. Для этого достаточно чтоб он был добавлен к какому нить коклассу входящему в библиотеку. Я таким методом часто пользовался правда наоборот для сокрытия интерфейса. Просто в idl файле коментарил вхождение интерфейса в кокласс, а сам интерфейс описывал вне библиотеки. Таким образом и прокси компилится и интерфейс не виден в библиотеке, но на запрос QI возвращается. В твоем варианте должна генерится прокся и интерфейс должен входить в библиотеку, т.к. он поддерживается объектом воходящим туда. Попробуй посмотреть через OleViewer. Я думаю если не сработает, то это глюки (у меня это всегда работало) и надо просто потасовать idl.
Re[9]: определение интерфесов в IDL файле
От: dima_gf  
Дата: 25.09.03 04:45
Оценка:
Здравствуйте, DrMom, Вы писали:

DM>Здравствуйте, dima_gf, Вы писали:


DM>>>Да уж, нафилиздипил я здесь... Вобщем так. Если все параметры стандартные, то используй атрибут oleautomation и не парься с заглушкой. Если нет, то заглушка нужна. Вот почему сишные файлы не генерятся это для меня загадка, т.к. использование объектов становится возможным только в пределах одного апартамента. Вобще я всегда описывал интерфейсы за приделами библиотеки, т.к. давно сталкивался с этой проблемой. Тогда я выяснил, что если на интерфейс нет ссылок в library XXXLib, то и в библиотеку типов он не попадет.


_>>Вообще то я тоже все описывал за библиотекой и не о чем не думал. Но пришло время наводить порядок в написанных интерфейсах, т.е. одни проекты ссылаются на интерфейсы, определенные в других проектах и пошла чехарда. Идут перекрестные ссылки и все время приходится изголяться, но в результате все равно приходится впихивать файлы xxx_i.x.c — определение IID и CLSID. А хотелось бы обойтись директивой import "...dll" и/или importlib(....dll).

_>>Все это получается, если интерфейсы описывать в библиотеке. Но тогда возникает отсутствие заглушок. А программы у меня таковы, что я работаю в смешаной модели памяти — поэтому без proxy не обойтись. Вот откуда растут ноги этой в общем — то пустяковой заморочке. Обойти можно, но с помощью накруток. Кстати просматривая idl в SDK я так и не понял по какому принципу они их строят — есть файлы полностью в либах (как IWebBrowser), есть частично, а есть вообще по одному коклассу в либе.

DM>Интерфейс можно описать вне библиотеки и при этом, чтобы он вошел в нее. Для этого достаточно чтоб он был добавлен к какому нить коклассу входящему в библиотеку. Я таким методом часто пользовался правда наоборот для сокрытия интерфейса. Просто в idl файле коментарил вхождение интерфейса в кокласс, а сам интерфейс описывал вне библиотеки. Таким образом и прокси компилится и интерфейс не виден в библиотеке, но на запрос QI возвращается. В твоем варианте должна генерится прокся и интерфейс должен входить в библиотеку, т.к. он поддерживается объектом воходящим туда. Попробуй посмотреть через OleViewer. Я думаю если не сработает, то это глюки (у меня это всегда работало) и надо просто потасовать idl.


Доброе утро.
Это я все знаю. Так оно и происходит. но я то добиваюсь обратного, чтобы он входил только в библиотеку (хотя понимаю, что это в общем то бред) — чтобы в генерируемом хидере он не появлялся — тогда я смогу использовать его тлько через import в stdafx.h. В противном случае, т.к. один и тотже интерфейс входит в разные хидеры разных библиотек, то при использовании их одновременно происходят проблемы переопределений. Конечно можно вообще отказаться от import в stdafx.h файле, и делать import только в idl, тогда необходимые хидеры будут итак вставлены в результирующи файл, что теоретически позволит отказаться от import в stdafx.h.
Re[10]: определение интерфесов в IDL файле
От: dima_gf  
Дата: 25.09.03 04:52
Оценка:
Здравствуйте, dima_gf, Вы писали:

_>Здравствуйте, DrMom, Вы писали:


DM>>Здравствуйте, dima_gf, Вы писали:


DM>>>>Да уж, нафилиздипил я здесь... Вобщем так. Если все параметры стандартные, то используй атрибут oleautomation и не парься с заглушкой. Если нет, то заглушка нужна. Вот почему сишные файлы не генерятся это для меня загадка, т.к. использование объектов становится возможным только в пределах одного апартамента. Вобще я всегда описывал интерфейсы за приделами библиотеки, т.к. давно сталкивался с этой проблемой. Тогда я выяснил, что если на интерфейс нет ссылок в library XXXLib, то и в библиотеку типов он не попадет.


_>>>Вообще то я тоже все описывал за библиотекой и не о чем не думал. Но пришло время наводить порядок в написанных интерфейсах, т.е. одни проекты ссылаются на интерфейсы, определенные в других проектах и пошла чехарда. Идут перекрестные ссылки и все время приходится изголяться, но в результате все равно приходится впихивать файлы xxx_i.x.c — определение IID и CLSID. А хотелось бы обойтись директивой import "...dll" и/или importlib(....dll).

_>>>Все это получается, если интерфейсы описывать в библиотеке. Но тогда возникает отсутствие заглушок. А программы у меня таковы, что я работаю в смешаной модели памяти — поэтому без proxy не обойтись. Вот откуда растут ноги этой в общем — то пустяковой заморочке. Обойти можно, но с помощью накруток. Кстати просматривая idl в SDK я так и не понял по какому принципу они их строят — есть файлы полностью в либах (как IWebBrowser), есть частично, а есть вообще по одному коклассу в либе.

DM>>Интерфейс можно описать вне библиотеки и при этом, чтобы он вошел в нее. Для этого достаточно чтоб он был добавлен к какому нить коклассу входящему в библиотеку. Я таким методом часто пользовался правда наоборот для сокрытия интерфейса. Просто в idl файле коментарил вхождение интерфейса в кокласс, а сам интерфейс описывал вне библиотеки. Таким образом и прокси компилится и интерфейс не виден в библиотеке, но на запрос QI возвращается. В твоем варианте должна генерится прокся и интерфейс должен входить в библиотеку, т.к. он поддерживается объектом воходящим туда. Попробуй посмотреть через OleViewer. Я думаю если не сработает, то это глюки (у меня это всегда работало) и надо просто потасовать idl.


_>Доброе утро.

_>Это я все знаю. Так оно и происходит. но я то добиваюсь обратного, чтобы он входил только в библиотеку (хотя понимаю, что это в общем то бред) — чтобы в генерируемом хидере он не появлялся — тогда я смогу использовать его тлько через import в stdafx.h. В противном случае, т.к. один и тотже интерфейс входит в разные хидеры разных библиотек, то при использовании их одновременно происходят проблемы переопределений. Конечно можно вообще отказаться от import в stdafx.h файле, и делать import только в idl, тогда необходимые хидеры будут итак вставлены в результирующи файл, что теоретически позволит отказаться от import в stdafx.h.
Правда в этом случае придется ПРИКОМПИЛИРОВАТЬ файлы xxx_i.c — ЧЕГО я хочу избежать с помощью импортирования библиотеки — откуда компилятор сам может взять все что ему надо. Но видимо ничего не выйдет и придется возвращаться к старому варианту.
Re[11]: определение интерфесов в IDL файле
От: Obukhov Россия  
Дата: 25.09.03 07:35
Оценка:
_>Правда в этом случае придется ПРИКОМПИЛИРОВАТЬ файлы xxx_i.c — ЧЕГО я хочу избежать с помощью импортирования библиотеки — откуда компилятор сам может взять все что ему надо. Но видимо ничего не выйдет и придется возвращаться к старому варианту.

А может попробовать oleautomation использовать ?
... << RSDN@Home 1.1 beta 2 >>
Re[12]: определение интерфесов в IDL файле
От: dima_gf  
Дата: 25.09.03 07:51
Оценка:
Здравствуйте, Obukhov, Вы писали:

_>>Правда в этом случае придется ПРИКОМПИЛИРОВАТЬ файлы xxx_i.c — ЧЕГО я хочу избежать с помощью импортирования библиотеки — откуда компилятор сам может взять все что ему надо. Но видимо ничего не выйдет и придется возвращаться к старому варианту.


O>А может попробовать oleautomation использовать ?


А что делать с не oleautomation параметрами. Например передача пользовательского интерфеса IXxx? Как он проксится COM не знает.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.