Korzystanie z kontrolek COM

0

Chciałbym w C++ napisać program korzystający z kontrolek COM w Wndows.

Na przykład istnieje kontrolka COM, która zawiera klasę TestC, interfejs ITestC, a klasa zawiera metodę TestStr, która jako parametr wejściowy przyjmuje typ BSTR, zwraca wartość typu BSTR. Sama funkcja robi jakąś prostą operację, np. zamiana liter na wielkie.

Kontrolka figuruje w systemie, jest w rejestrze pod numerem GUID "{1D9F859D-10FF-4827-A341-4A8B8E318A61}", wersja to 1.0.

W aplikacji mając dane numer GUID i numer wersji chciałbym skorzystać z kontrolki, stworzyć instancję obiektu klasy TestC, a aplikacja powinna uruchomić metodę TestStr('AbcXyz') i wypisać na ekranie wynik działania tej metody. Jeżeli się do, to żeby było możliwe przejrzenie kontrolki i wyświetlenie nazw wszystkich klas, interfejsów i metod.

Jak to najprościej zrobić? Jakiś przykład wykorzystania kontrolki odpowiadający potrzebom? Słyszałem, że to się robi przez wykorzystanie ActiveX.

0

A masz gotowy nagłówek .h z tym interfejsem? Bo jeśli tak, to użycie wygląda tak:

CoInitialize(NULL);
...
ITestC *test;
HRESULT hr = CoCreateInstance(CLSID_TestC, NULL, CLSCTX_INPROC_SERVER, IID_ITestC, &test);
if (FAILED(hr))
   błąd();

test->Foobar();

test->Release();
...
CoUninitialize();

CLSID_TestC to GUID klasy, IID_ITestC to GUID interfejsu.

Dodatkowo w Visualu istnieją gotowe smartpointery do obsługi COM, pilnujące referencji (nie trzeba wtedy pamiętać o Release)

_COM_SMARTPTR_TYPEDEF(ITestC, IID_ITestC); // to robi typedefa o nazwie ITestCPtr
...
ITestCPtr test;
test.CreateInstance(CLSID_TestC, NULL, CLSCTX_INPROC_SERVER);
test->Foobar();
...
// Release wykona się automatycznie

A jak jest w C++ zdefiniowany sam interfejs, czyli w tym przypadku typ ITestC? heh, przyznam że nie wiem, nie zaglądałem zbyt szczegółowo do istniejących nagłówków. Wiem jak to zrobić w Delphi i w C#, ale w C++ korzystałem tylko z gotowych.

0
Azarien napisał(a):

A masz gotowy nagłówek .h z tym interfejsem?

Chodzi Ci o plik .h wygenerowany przy tworzeniu i kompilacji samej kontrolki? Jeżeli tak, to nie mam takiego pliku. Chodzi o to, że mem plik *.dll, który rejestruję w systemie za pomocą regsvr32 lub regasm.

Dla danej kontrolki jest znany tylko GUID i numer wersji, ewentualnie nazwa kontrolki, nic więcej. Na pewno się da, bo gdzieś miałem do czynienia z takim sposobem (widziałem skompilowany program). Słyszałem, że tam wykorzystuje się ActiveX.

Generalnie to idea jest taka, że uruchamia się kontrolkę wskazaną przez numer GUID i wersji (major i minor).

Następnie dla wczytanej kontrolki mozna odczytać dostępne klasy i interfejsy, można wybrać klasę poprzez podanie w stringu jej nazwy.

Następnie w stringu mam nazwę metody, którą chcę uruchomić i uruchamiam ją.

Coś na podobnej zasadzie, jak mechanizm refleksji dostępny w .NET i Java.

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