COM проблем

17 отговора 568 прегледа
#1

COM проблем

Дефинирал съм си интерфейс (без помощта на wizard-а) в отделен idl-файл, и се опитвам да го имплементирам в един клас.

Проблемът ми е следният: как да включа дефиницията на интерфейса в проекта ?

Отговор
в отговор на Ox #2

Re: COM проблем

компилирай IDL файла. (MIDL и т.н..)

Отговор
в отговор на Ox #3

Re: COM проблем

Ako mnogo dyrzish da e v otdelen file ima 2 varianta. Pyrvia e kakto kaza kolegata pogore da si go izkompilirash v otdelno TLB i da polzvash ot tam. Vtoria e da si includesh vyv tvoia IDL sys import vish MS kak go praviat. Tova obache imam spomeni che drazneshe wizarda i triabvashe da chistim raznite temporary files deto gi generira i full rebuild ne gi opravia (CLW beshe edinia ot tiah).

Отговор
в отговор на VBProgrammer #4

Re: COM проблем

освен TypeLibrary, MIDL компилатора генерира и header файл (и .c файл) който спокойно може да се ползва от С или С++.
TLB-то е за останалите езици :) (и разбира се ако искаш да го 'публикуваш' заедно с COM сървърите ти - обичайната практика)

Отговор
в отговор на Ox #5

Re: COM проблем

Абе образи, научете се да питате поне бе .... къде да го инклуднеш? С кво ИДЕ? за какъв език става дума ....

Отговор
в отговор на Ox #6

Още един COM проблем

Хайде и аз да питам нещо подобно.
Имам си един ATL контрол, който имплементва неговия си интерфейс. Искам да си направя друг ATL контрол в различен проект (задължително), чийто интерфей да наследява интерфейса на вече съществуващия контрол. Та как става това?

стой та гледай

Редактирано от lndependent на

Отговор
в отговор на lndependent #7

Re: Още един COM проблем

#import star_control.dll (ocx, tlb)

class nov_control : public IStar_control

Я вышел им наперерез!
Отговор
в отговор на Resurrector #8

Re: Още един COM проблем

Не ко-класа, а дифолтния му интерфейс...
Задължително наследяването трябва да стане при интерфейса, иначе се губи смисъла на упражнението.

стой та гледай
Отговор
в отговор на lndependent #9

Re: Още един COM проблем

Iskash vsicko da stane na 1 red :)
Ste si nasledish coclass-a i ste implemetirash vyprosnia interface v tvoia ctl i toi ste vika metodite na systia interface na unasledenia control, kogato se nalaga.
... ako sym shvanal pravilno ideata.

Отговор
в отговор на VBProgrammer #10

Re: Още един COM проблем

абе иска ако може някой да му го напише и да пейстне сорса - ама карайте :)

Отговор
в отговор на raдняp #11

Re: Още един COM проблем

Питам за принципа, гадино. Ако искам сорс, мога да си намеря в codeproject i codeguru.
А ти като си толкова отворен, защо не кажеш нещо по въпроса? М?

стой та гледай
Отговор
в отговор на lndependent #12

Re: Още един COM проблем

ми щото не мога да разбера какво питаш...

(не намеквам, че въпросът ти е оплетен и неясен)

Отговор
в отговор на lndependent #13

Re: Още един COM проблем

баси, като си толкова докачлив, що питаш?
вземи първо прочети малко а не за всеки малък проблем - нов пост.
аман от търтеи.

Отговор
в отговор на raдняp #14

Re: Още един COM проблем

Какво неясно има?
Имам си един COM обект като dll i tlb. Импортвам си tlb-то в stdafx.h и при билдване ми се генерират tlh и tli.
В моя проект имам друг COM обект. Искам интерфейса на моя COM обект да наследява интерфейса на чуждия. Обаче ако напиша само
interface IMyCOMObj : IForeignCOMObj
MIDL се оплаква, че IForeignCOMObj не е интерфейс (error MIDL2272 : interfaces must derive from another interface).

ВЪпросът е как да го накарам да разбере, че всъщност IForeignCOMObj Е интерфейс?

стой та гледай
Отговор
в отговор на lndependent #15

Re: Още един COM проблем

само малко хинт - трябва и в ТВОЙТО ТЛБ да импортнеш другото ТЛБ. с това няма да ти се реши целия проблем, но поне ша отлепиш малко. а пък аз, понеже съм гаден, нема да ти кажа точно как става, да се потрудиш а не да лежиш на гърбовете на други

Отговор
в отговор на lndependent #16

Re: Още един COM проблем

имал съм същия проблем, оправия има, прави се така:

1) изходния интерфейс трябва да се вижда! уизърда генерира малко насран код -- интерфейса е извън library блока в идл файла. просто премести дефиницията вътре. това вече го правя на всеки проект

2) във второто тлб, там дето импортираш тлб или длл файла с първия интерфейс правиш importlib

3) правиш forward декларация (тва как е на български?) на интерфейса дето ще го взимаш от базовия тлб (просто един ред interface IMyBaseInterface;)

4) дефинираш си наследяващия интерфейс, който да наследява базовия
5) получаваш глупаво предупреждение, че не ти е oleautomation съвместим интерфейса от мидл компилатора (милия, не се усеща че наследяваш от IDispatch непряко)

6) не забравяй в ком мап-а на наследяващия компонент да туриш ентрита за интерфейсите, добави и COM_INTERFACE_ENTRY2 дето да му кажеш като го питат за базовия интерфейс да връща пойнтер към наследения :)

7) оправи наследяването от IDispatchImpl<> може би ще ти се размине само с промяна на темплейт параметъра. със сигурност минава ако наследиш от 2 различни версии на класа (с различен параметър за интерфейса), мо може да не искаш да влачиш много код.


забележка: за да компилираш другия проект ще ти трябва да #import тлб или длл файла на базовия някъде дето да се вижда от всички (препоръчвам stdafx.h :)) гадното е, че не можах да го оправя да импортва с неймспейси -- тури no_namespace като импортваш

те тва е, прилагам го от доста време и работи... даже сега си имаме и default базова имплементация на методите от базовия интерфейс

ако нещо не е ясно, свиркай. OLEVIEW.EXE също помага, можеш да погледнеш други компоненти и идл-то от тлб ресурсите им. аз тоя номер го видях от компонентите на GIS библиотеката на Intergraph

ein heller Schein am Firmament
Отговор
в отговор на Meндeлeeв #17

Re: Още един COM проблем

ti kakyf software pishesh?

Отговор
в отговор на crazy #18

Re: Още един COM проблем

ми какъвто кажат :) предимно GIS чудесии.

а ти?

ein heller Schein am Firmament
Отговор