[COM+] jak użyć aplikacji com+, czyli dostęp do interfejsów itd

0

cos tam robię z COM+, poznaję itd
zrobiłem sobie przykładową znalezioną aplikację, która dodaje liczby

jest OK jest zarejestrowana jest w rejestrach, jest w Aplikacjach COM+

jak napisać klienta, który by korzystał z tej aplikacji com+?

na razie coś kombinuję takiego

hr = CLSIDFromProgID(L"addcomponent.DodawanieLiczb.1", &clsid);
if(SUCCEEDED(hr))
{
      hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER,IID_IUnknown, (void **)&pUnk);
}

no i jakoś tam działa

  • jedna i druga funkcja zwraca S_OK
  • pUnk wskazuje na interfejs IUnknown

ale jak się dostać do interfejsu dodawania liczb i jak wywołać funkcje interfejsowe
co trzeba dołączyć do projektu, aby to działało?

0

Mniej więcej w ten sposób:

IMojInterfejs *piMoj;
hr = CoCreateInstance(__uuidof(clsid), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMojInterfejs), (LPVOID*)&piMoj);

do tego wypada zaimportować com'a do projektu np. tak:

#import "sciezka/dllka_com.dll" no_namespace named_guids
0
byku_guzio napisał(a)

Mniej więcej w ten sposób:

IMojInterfejs *piMoj;
hr = CoCreateInstance(__uuidof(clsid), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMojInterfejs), (LPVOID*)&piMoj);

do tego wypada zaimportować com'a do projektu np. tak:

#import "sciezka/dllka_com.dll" no_namespace named_guids

dzięki za odpowiedź
ale tu zaczynają się schody

o ile

#import "sciezka/dllka_com.dll" 
  • tego nie miałem, dodałem i jest OK

to w przypadku

IMojInterfejs *piMoj;
  • mam błąd kompilacji

widziałem mniej więcej w jakiś przykładach, ze tak się robi, ale kurde jak zrobić, żeby przy **IMojInterfejs ** nie mieć błędu
undeclared identifier d:\c++\comclient\comclient\comclient.cpp 19 comclient

0

A dopisałeś no_namespace i name_guids ? Pokaż kod

0

dziękuję Ci bardzo za pomoc

nie napisałem, bo zwyczajnie nie wiedziałem

cienki jestem w temacie no i się motam, teraz napisałeś coś tam znalazłem zobaczyłem jak to jest dodałem u siebie i jest OK, czyli już nie jest undeclared identifier

mam nadzieję, że dalej pójdzie z górki

0

no_namespace oznacza, że interfejsy com'a nie są wrzucane do osobnej przestrzeni nazw, która jest związana z którymś tam identyfikatorem(już nie pamiętam, którym).
name_guids pozwala na używanie przez __uuidof nazwy interfejsu zamiast guid'u

0

jeśli można inne zagadnienie

znalazłem przykład przesyłania tablic przez COM-a, o ile ze stałym rozmiarem jest OK to ze zmiennym jest problem (jakieś tablice zgodne to jest)

funkcja interfejsowa

HRESULT    SumArray([in] int cMax, [in, size_is(cMax)] long* numbers, [out] long*suma);
HRESULT __stdcall SumArray(int cMax, long* numbers, long*suma);

m,3
normalne przechodzenie po petli z sumowaniem - nic wielkiego

po stronie klienta

if(SUCCEEDED(hr))
{
      long suma;
      long tab1[] = {1,2,3,4,5,6,7,8,9,10};
      arrayOprs->SetDynamicArray(10, tab1, &suma);
      cout<<suma<<"\n";
   }

nic wielkiego jak widać, a nie sumuje

0

A po zmianie na zmienny rozmiar zbudowałeś od nowa proxy/stub'a?
Ewentualnie ustaw breakpoint'a w funkcji sumującej w tym com'ie i sprawdź debuggerem co się tam w niej dzieje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1