Пытаюсь сделать, чтобы ActiveX-control кидал событие о том, что ему нужны данные,
а container (с#) ловил это событие и заполнял структуру, передаваемую в параметре.
В TLB описано примерно следующее:
library ATLNEWGRIDLib
{
// Horizontal Text Alignmenttypedef enum
{
grOrizAlignLeft = 0, //DT_LEFT
grOrizAlignRight = 1, //DT_RIGHT
grOrizAlignCenter = 2 //DT_CENTER
} grOrizontalAlignment;
// Vertical Text Alignmenttypedef enum
{
grVertAlignBottom = 0, //DT_BOTTOM
grVertAlignTop = 1, //DT_TOP
grVertAlignCenter = 2 //DT_VCENTER
} grVerticalAlignment;
typedef
[uuid(1A6B865F-58C4-11D3-B221-006097FEBF00)]
struct LOGFONTNEW
{
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
BYTE lfFaceName[32];
} LOGFONTNEW;
typedef
[uuid(1A6B865E-58C4-11D3-B221-006097FEBF00)]
struct GV_ITEM
{
int row; // Row and int col; // Column of item
UINT mask; // Mask for use in getting/setting cell data
UINT nState; // cell state (focus/hilighted etc)
DWORD nFormat; // Format of cellint iImage; // index of the list view item’s icon
COLORREF crBkClr; // Background colour (or CLR_DEFAULT)
COLORREF crFgClr; // Forground colour (or CLR_DEFAULT)
COLORREF crHlBkClr; // Highlight background colour (or CLR_DEFAULT)
COLORREF crHlFgClr; // Highlight forground colour (or CLR_DEFAULT)
grOrizontalAlignment hAlign;
grVerticalAlignment vAlign;
LPARAM lParam; // 32-bit value to associate with item
LOGFONTNEW lfFont; // Cell font
UINT nMargin; // Internal cell marginint * strText; // Text in cell
} GV_ITEM;
[
uuid(466C80A1-58C4-11D3-B221-006097FEBF00),
helpstring("_IGridEvents Interface")
]
dispinterface _IGridEvents
{
methods:
[id(11), helpstring("method GetVirtual")] HRESULT GetVirtual(int row, int col, GV_ITEM* item);
};
}
Соответсвенно Proxy-класс для того, чтобы "fire"-ить событие:
вот там, где отмечено — возникает проблема.
hr == 0x80028019 [Old format or invalid type library.]
пробовал менять определения структуры в TLB, потому что где-то читал, что может глючить MIDL-compiler, и что надо повесить uuid не на typedef, а на саму структуру. но это дает лишь
hr == 0x8002802b [Element not found.]
есть идеи? может можно вообще обойтись без IRecordInfo?
пробовал делать это не Event-ом, а просто CALLBACK-функцией, но видимо это не предусмотренный способ, потому что возникали непонятные run-time first chance exceptions где-то внутри COM объекта, видимо, связанные с работой GC в C#.
Re: пеередача структуры через VARIANT (VT_RECORD | VT_BYREF)
Это известная бага в МИДЛе — при объявлении структуры через typedef Guid будет проассоциирован с typedef а не со структурой.
Проверь — если дело в этом, то при сборке должен валиться warning MIDL2368.
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re: пеередача структуры через VARIANT (VT_RECORD | VT_BYREF)
Привет
2>Пытаюсь сделать, чтобы ActiveX-control кидал событие о том, что ему нужны данные, 2>а container (с#) ловил это событие и заполнял структуру, передаваемую в параметре.
В свое время отказался от использования структур, всюду перешел на полноценные объекты. Остался доволен, как слон
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Re[2]: пеередача структуры через VARIANT (VT_RECORD | VT_BYR
Здравствуйте, EM, Вы писали:
EM>Здравствуйте, 2can, Вы писали:
EM>...
EM>Это известная бага в МИДЛе — при объявлении структуры через typedef Guid будет проассоциирован с typedef а не со структурой. EM>Проверь — если дело в этом, то при сборке должен валиться warning MIDL2368.
Да, я читал про эот баг, но MIDL молчит. Тем более я пробовал и так:
typedef
[uuid(1A6B865E-58C4-11D3-B221-006097FEBF00)]
struct GV_ITEM
{
int row; // Row and int col; // Column of item
UINT mask; // Mask for use in getting/setting cell data
UINT nState; // cell state (focus/hilighted etc)
DWORD nFormat; // Format of cellint iImage; // index of the list view item’s icon
COLORREF crBkClr; // Background colour (or CLR_DEFAULT)
COLORREF crFgClr; // Forground colour (or CLR_DEFAULT)
COLORREF crHlBkClr; // Highlight background colour (or CLR_DEFAULT)
COLORREF crHlFgClr; // Highlight forground colour (or CLR_DEFAULT)
grOrizontalAlignment hAlign;
grVerticalAlignment vAlign;
LPARAM lParam; // 32-bit value to associate with item
LOGFONTNEW lfFont; // Cell font
UINT nMargin; // Internal cell marginint * strText; // Text in cell
} GV_ITEM;
и так
[uuid(1A6B865E-58C4-11D3-B221-006097FEBF00)]
struct GV_ITEM
{
int row; // Row and int col; // Column of item
UINT mask; // Mask for use in getting/setting cell data
UINT nState; // cell state (focus/hilighted etc)
DWORD nFormat; // Format of cellint iImage; // index of the list view item’s icon
COLORREF crBkClr; // Background colour (or CLR_DEFAULT)
COLORREF crFgClr; // Forground colour (or CLR_DEFAULT)
COLORREF crHlBkClr; // Highlight background colour (or CLR_DEFAULT)
COLORREF crHlFgClr; // Highlight forground colour (or CLR_DEFAULT)
grOrizontalAlignment hAlign;
grVerticalAlignment vAlign;
LPARAM lParam; // 32-bit value to associate with item
LOGFONTNEW lfFont; // Cell font
UINT nMargin; // Internal cell marginint * strText; // Text in cell
};
typedef struct GV_ITEM GV_ITEM;
и монопенисуально. разница есть (я писал уже — разный код ошибки на выходе GetRecordInfoFromGuids), но всё равно не работает.
Re[2]: пеередача структуры через VARIANT (VT_RECORD | VT_BYR
От:
Аноним
Дата:
10.01.05 11:12
Оценка:
Здравствуйте, Den Raskovalov, Вы писали:
DR>Привет
2>>Пытаюсь сделать, чтобы ActiveX-control кидал событие о том, что ему нужны данные, 2>>а container (с#) ловил это событие и заполнял структуру, передаваемую в параметре.
DR>В свое время отказался от использования структур, всюду перешел на полноценные объекты. Остался доволен, как слон
2>>>Пытаюсь сделать, чтобы ActiveX-control кидал событие о том, что ему нужны данные, 2>>>а container (с#) ловил это событие и заполнял структуру, передаваемую в параметре.
DR>>В свое время отказался от использования структур, всюду перешел на полноценные объекты. Остался доволен, как слон
Здравствуйте, Den Raskovalov, Вы писали:
2>>Так нужно VT_DISPATCH или VT_DISPATCH | VT_BYREF ???
DR>Если ты передаешь интерфейс (и не возвращаешь), тогда конечно VT_DISPATCH
а, значит всё таки BYREF — я как раз возвращаю...
ок. спасибо!
Re[4]: пеередача структуры через VARIANT (VT_RECORD | VT_BYR
Здравствуйте, Den Raskovalov, Вы писали:
2>>>>Пытаюсь сделать, чтобы ActiveX-control кидал событие о том, что ему нужны данные, 2>>>>а container (с#) ловил это событие и заполнял структуру, передаваемую в параметре.
DR>>>В свое время отказался от использования структур, всюду перешел на полноценные объекты. Остался доволен, как слон