COM: предача данных с использованием структур.
От: PSD  
Дата: 09.01.03 11:10
Оценка:
Среда 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
....



как создать свои константы доступные таким образом.
Re: COM: предача данных с использованием структур.
От: Willi  
Дата: 09.01.03 12:38
Оценка:
Здравствуйте, 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;
...
}
\/\/i||i
Re: COM: предача данных с использованием структур.
От: Ivan Россия www.rsdn.ru
Дата: 09.01.03 16:46
Оценка:
Здравствуйте, 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-совместимые типы.
Re[2]: COM: предача данных с использованием структур.
От: PSD  
Дата: 10.01.03 06:10
Оценка:
Здравствуйте, Ivan, Вы писали:
.....
I>Членами UDT могут быть другие UDT или oleautomation-совместимые типы.

I>


В VC 6.0(7.0) это какнибудь автоматизировано? А то он не очень любит когда ручками лазаешь, автматизация отваливается.
Re[3]: COM: предача данных с использованием структур.
От: Ivan Россия www.rsdn.ru
Дата: 10.01.03 09:01
Оценка:
Здравствуйте, PSD, Вы писали:

PSD>В VC 6.0(7.0) это какнибудь автоматизировано? А то он не очень любит когда ручками лазаешь, автматизация отваливается.


Не-а, добавляешь вручную описание UDT в IDL, а в коде работаешь как с обычной структурой:
создаешь на стеке, заполняешь поля и переадешь, куда нужно:
UDT u;
a.a1 =1
p->Do(&u);


Если надо передавать через VARIANT, то придется еще и IRecordInfo для UDT получать. Используй поиск — в этом форуме есть пример передачи UDT через VARIANT.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.