Среда VC 6.0
Контрол для использования в приложения VB.
Вот такой вопрос.
Есть два ATL модуля завязаные в один контророл. Нужно передовать данные из одного модуля в другой. В отладочной версии (когда именя все крутилось в одном модуле ) данные передовались как указательна структуру
struct _Lines
{double Min,Max,Count,Average;
CPen * Pen;
CString Name;
long X;
long Y;
bool isBind;
};
Терерь нужно организовать передачу через ганицу модуля.
1. Как это лучше сделать.
2. Можноли както оформить эту структуру чтоб ее можно было передовать как пораметр внешнему методу COM объекта. Например чтоб при подключении обекта в проект VB, можно было на писать
dim ls as _Lines
ls.Min=10
ls.Max= 12
MyObj.SetLine(ls)
3. Как оформить константы чтоб их было видно при подключении модуля
Папример в VB мы пишим
if adodc.recordset.fields(0).type=adTinyInt then
....
как создать свои константы доступные таким образом.
Здравствуйте, PSD, Вы писали:
По первым двум вопросам точно ничего ответить не могу. Давненько я не брал в руки шашек

. Я с COM уже года два как не работаю.
PSD>3. Как оформить константы чтоб их было видно при подключении модуля
В свое время в .odl писал так
[
uuid(...),
version(1.0),
helpstring("...")
]
library LibraryName
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
typedef enum
{
valueName1 = 0,
valueName2 = 1,
...
valueNameN = N
} TypeName;
...
}
Здравствуйте, PSD, Вы писали:
PSD>2. Можноли както оформить эту структуру чтоб ее можно было передовать как пораметр внешнему методу COM объекта. Например чтоб при подключении обекта в проект VB, можно было на писать
PSD>PSD>dim ls as _Lines
PSD>ls.Min=10
PSD>ls.Max= 12
PSD>MyObj.SetLine(ls)
PSD>
Можно. Такие структуры называются UDT — User Defined Type. В IDL описываешь так:
typedef [uuid(C1D3A8C0-A4AA-11D0-819C-00A0C90FFFC3)] struct UDT
{
unsigned long a1;
BSTR pbstr;
} UDT;
Описывать параметры метода надо как VARIANT и тогда придется работать с IRecordInfo или как UDT:
Do([in]UDT* pIn, [in,out] pOut);
Передать UDT в такой метод проще простого:
UDT some_data, some_returned_data;
p->Do(&some_data, some_returned_data);
Членами UDT могут быть другие UDT или oleautomation-совместимые типы.
Здравствуйте, PSD, Вы писали:
PSD>В VC 6.0(7.0) это какнибудь автоматизировано? А то он не очень любит когда ручками лазаешь, автматизация отваливается.
Не-а, добавляешь вручную описание UDT в IDL, а в коде работаешь как с обычной структурой:
создаешь на стеке, заполняешь поля и переадешь, куда нужно:
UDT u;
a.a1 =1
p->Do(&u);
Если надо передавать через VARIANT, то придется еще и IRecordInfo для UDT получать. Используй поиск — в этом форуме есть пример передачи UDT через VARIANT.