2010-03-04 7 views
7

Chciałbym użyć biblioteki COM dll w mojej bibliotece C++. Sposób Pomyślałem o nim dzieje, jest #import .tlb plik DLL, który robiłam:Jak używać COM dll w moim programie C++

#import "mycom.tlb" no_namespace 

Problem polega na tym, że nie bardzo wiem gdzie umieścić tę deklarację. czy powinien być w pliku H lub pliku CPP? a może plik stdafx.h? Próbowałem umieścić go w pliku .cpp, tylko do testowania.

w pliku H I to członek stwierdził:

ILogicSecuredPtr m_pbLogic; 

(gdzie ILogicSecured jest interfejs chcę pracować z moim dll COM)

Potem dodałem to w konstruktorze instancji Interfejs:

CoInitialize(NULL); 
m_pbLogic(__uuidof(LogicSecured)); 

(gdzie LogicSecured to nazwa obiektu, który realizuje interface)

W destructor I dodaje:

CoUninitialize(); 

To nie będzie kompilować jednak, bez względu na to, gdzie staram się umieścić deklarację #import. po prostu nie rozpoznaje obiektu ILogicSecured. otrzymuję ten błąd w pliku H:

Error 2 error C2146: syntax error : missing ';' before identifier 'm_pbLogic' 

Należy również wspomnieć, że kiedy F12 (w Visual Studio) w deklaracji ILogicSecuredPtr, zabiera mnie do pliku tlh dobrze. Wiem, że to rozpoznaje.

Co ja tu robię źle?

Wielkie dzięki. Roey

Odpowiedz

3

Problem polega na tym, że podczas kompilowania pliku .h kompilator nie widział jeszcze modelu #import. Ponieważ Twój projekt jest mały, najlepiej jest umieścić #import w stdafx.h.

Po naciśnięciu klawisza F12 Visual Studio używa informacji o bazie danych Intellisence, które są tworzone, analizując wszystkie źródła w kolejności, która może być inna niż kolejność kompilacji. Jest więc dość typowe, że Intellisence wie, gdzie coś jest zadeklarowane, a kompilator nie kompiluje go w tym samym czasie.

+0

Czy mogę nieco zagęścić wątek? Jeśli spróbuję dodać #import do pliku stdafx.h, m_pbLogic (__ uuidof (LogicSecured)); Kawałek kodu nie kompiluje się, mówiąc: Błąd 18 błąd C2064: termin nie jest wartościowany do funkcji przyjmującej 1 argumenty – Roey

+1

Zgadza się - próbujesz wywołać konstruktor zmiennej członkowskiej w ciele konstruktora - jest to niedozwolone. Zamiast tego należy użyć metody CreateInstance() z IWhateverPtr. – sharptooth

+0

Dzięki za szybką odpowiedź. Czy możesz podać przykład fałszywego połączenia funkcji CreateInstance w mojej sytuacji? i gdzie go umieścić? Dzięki – Roey

2

Co się dzieje, jeśli zaimportować plik DLL lub TLB jest, że preprocesor generuje tlh i plik tli. Jeśli tlb jest stabilny, możesz również wygenerować dwa pliki i dołączyć nagłówek tlh tak, jakby był normalnym nagłówkiem.

Więc odpowiedź jest umieszczona na #import, gdzie można umieścić nagłówek, ponieważ jest konwertowany na uwzględnienie pliku tlh.

Używam go w następujący sposób, aby uniezależnić się od lokalizacji pliku MSADO15.dll i dodałem plik tlh do mojej subversion.

1

Oprócz problemów z kompilacją, które występują, występują inne problemy z tym projektem.

Generalnie biblioteki C++ nie powinny inicjować COM w wątkach, które nie tworzą. Może to powodować nieprzyjemne, trudne do debugowania efekty uboczne. Rozważ zaktualizowanie specyfikacji interfejsu dla biblioteki, aby wskazać, że użycie pewnych metod lub obiektów wymaga zainicjowania COM. Powinieneś również określić wymagany model gwintowania (STA, bezpłatny).

To powiedziawszy - inną rzeczą, na którą trzeba uważać, jest wywoływanie CoUnitialize(), zanim inteligentny wskaźnik wykracza poza zakres. Może to również powodować trudne do debugowania efekty uboczne. Jeśli wywołujesz CoUnitialize() w destruktorze obiektu zawierającego inteligentny wskaźnik COM, będziesz musiał jawnie zwolnić i odłączyć wskaźnik przed wywołaniem CoUnitialize().

Miłej zabawy!

Powiązane problemy