Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Late binding na COM

[es] :: .NET :: Late binding na COM

[ Pregleda: 1187 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Nidza2010
Nemam
Srbija, Zemun

Član broj: 302579
Poruke: 2
*.dynamic.isp.telekom.rs.



Profil

icon Late binding na COM02.05.2012. u 18:03 - pre 146 meseci
Da li moze neko da mi kaze kako uraditi late binding na COM? Znaci ne na Automation, tj objekat koji nema IDispatch interface. Ja sam napravio interfejs klase koju zelim da koristim, marshalling je ispravan, ali kada pokusam da castujem objekat koji sam dobio sa CreateInstance dobijam run-time gresku da nema podrske za IDispatch. Kako pristupiti metodama ako postoji samo IUnknown interfejs?

PS trazio sam po internetu, nisam nasao nista, pa ako nekoga mrzi da mi objasnjava bicu zahvalan i za link.

Hvala
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Late binding na COM02.05.2012. u 18:25 - pre 146 meseci
Daj malo koda. Kako izmgleda ComImport klasa? Kako si je generisao (tlbimp?)

Btw, late binding je nesto drugo (kad pozivas elemente objekta preko IDispatch), late binding jer se bindujes na elemente u momentu poziva. Ono sto ti pretpostavljam hoces je da instanciras objekat, dobijes IUnknown i da iz njega uradis QueryInterface?
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Nidza2010
Nemam
Srbija, Zemun

Član broj: 302579
Poruke: 2
*.dynamic.isp.telekom.rs.



Profil

icon Re: Late binding na COM02.05.2012. u 23:42 - pre 146 meseci
Nisam znao da je sve sto ide preko IDispatch-a late binding, mislio sam da je to sve sto u Run-time-u povezes na COM. Da Early Binding koristi isti metod na napravi proxy/stub?!
Pa nema nesto koda, sve se svelo na Type.GetTypeFromProgID, Activator.CreateInstance, Marshal.GetIUnknownForObject od instanciranog objekta i Marshal.QueryInterface za IUnknown. Interfejs koji sam rucno pravio je klasican (nema tlibimp, ali je marshalovan):
Code:
interface IServerList
    {
        int EnumClassesOfCategories([In] int cImplemented, [In, MarshalAs(UnmanagedType.LPArray)] Guid[] catidImpl, [In] int cRequired, [In] Guid[] catidReq, [MarshalAs(UnmanagedType.IUnknown)] out object ppUnk);
        int GetClassDetails([In] ref Guid clsid, [MarshalAs(UnmanagedType.LPWStr)] out string ppszProgID, [MarshalAs(UnmanagedType.LPWStr)] out string ppszUserType);
        int CLSIDFromProgID([In, MarshalAs(UnmanagedType.LPWStr)] string szProgId, out Guid clsid);
    }

Na osnovu prethodnog posta, mislim da je mozda stvar u GUID-u interfejsa klase koju zelim, ali ne znam kako to da izvucem. Mozda je nebitno, ali zapravo hocu da se povezem sa DCOM, tako da iz Registry-a ne mogu da procitam ID.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Late binding na COM03.05.2012. u 07:57 - pre 146 meseci
Interface GUID (IID) je zapravo najvaznija stvar, perko njega QueryInterfejs vraca interface. I sam COM activator koristi CLSID (Class ID) a n ProgID za ucitavanje i instanciranje objekta, progID je samo programer firendly name iz dana VB6 za koje mora da postoji mapitanje u CLSID u registry-u.

Iskreno nisam bas isguran kako bi ovo mogao da koristis na jednostavan nacin, Marshal.QueryInterface je cisto interop fora (da ti nekome prosledis COM interface, ne da ga zoves iz c# koda) sto se vidi i iz povratnog tipa u koji smesta interface (IntPtr). Tebi treba RCW (Runtime Callable Wrapper) a da bi njega dobio treba ti minimum IDL file, a za njega ti opet treba GUID i objekta i interface-a.

Meni je veoma cudno da taj COM objekat nema svoj type lib, cak i da ne podrzava IDispatch kako je registrovan u DCOM ako nema typelib?

Na osnovu progID, lociraj u registriju koji DLL ga sadrzi (ako vec ne znas), i probaj da pozoves tlbimp na tom DLLu. Ako nema, moja preporuka ti ej da sam napravis repliku IDL fajla za taj objekat.


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

[es] :: .NET :: Late binding na COM

[ Pregleda: 1187 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.