własna kontrolka +dll

0

Witam.
Zrobiłem sobie własna kontrolkę i chcę ją zapiąć w dll. Mam więc tak:
-PlikDll.cpp z którego chcę zrobić dll o zawartości:
#include"Plik.h"
ATOM RegisterZegarek(HINSTANCE hInstance,WNDPROC ZegarekProc1){....}
LRESULT CALLBACK ZegarekProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){...}

-Plik.h o zawartosci:
extern "C" LRESULT CALLBACK __declspec(dllexport) ZegarekProc(HWND, UINT, WPARAM , LPARAM );
extern "C" ATOM __declspec(dllexport) RegisterZegarek(HINSTANCE,WNDPROC);

-Plik.cpp wykonawczy o standardowej zawartości:
#include<windows.h>
#include"Plik.h"
typedef ATOM __declspec(dllexport) RegisterZegarekTyp(HINSTANCE,WNDPROC);
typedef LRESULT CALLBACK __declspec(dllexport) ZegarekProcTyp(HWND, UINT, WPARAM, LPARAM );
WinMain(...){....} ...

W momencie użycia której kolwiek z zaimportowanych funkcji program się wywala. Funkcję mam dobrze popisane, bo jeżeli robię to bez użycia Plik.dll tylko używam PlikDll.cpp to wszytko chodzi dobrze.
Gdzie robię błąd?
Dodam że testując program na innych funkcjach(testowych) zaimportowanych w ten sposób z dll wszystko działa.

0

Hmm.... nie wiem czy to na pewno pomoze, ale jak rejestrujesz klase okna? Sprobuj dodac flage CS_GLOBALCLASS, czyli:

wc.style = CS_GLOBALCLASS;

Jezeli wrzucasz kod do do dll-ki, musi to byc (tylko mi sie wydaje, bo sam nie robilem kontrolek w dll).

MSDN napisał(a)

CS_GLOBALCLASS style means that this window class is an application global class. An application global class is a window class registered by an executable or dynamic-link library (.dll) that is available to all other modules in the process. ...A process that loads the .dll can create instances of the custom control.

Jezeli to nie pomoze, to znaczy ze namieszales cos jeszcze, moze podaj wiecej kodu.

[edit]
Zreszta, jezeli piszesz w C++, to lepiej napisz klase i ja wyeksportuj, w konstruktorze mozesz na przyklad rejestrowac klase okna.
Uzycie klasy bedzie potem duzo wygodniejsze ;-)

I jeszcze jedno - po co eksportujesz CALLBACK kontrolki? W programie uzywajacym kontrolki nie powinienes sie do tej funkcji odwolywac. Zdefiniuj wlasne komunikaty, ktore bedziesz wysylac do kontrolki, zeby sterowac jej dzialaniem.
No chyba ze napiszesz klase tak jak ci mowilem, wtedy funkcje skladowe klasy moga przejac wysylanie komunikatow.

0

Witam.
Zrobiłem tak(moje błędy):
-w pliku który miał być dll-ką nie umieściłem w definicji funkcji słów : extern "C" __declspec (dllexport)
przez co miałem źle kompilowaną bibliotekę.

  • funkcja która rejestrowała okno, przyjmowała dwa argumenty: HINSTANCE, WNDPROC. Pozbyłem się argumentu WNDPROC , a procedure przekazywałem przez nazwe globalną procedury w pliku dll.

Zaczeło mi to działac. Mam za to kolejny problem: jeżeli w komunikacie WM_DESTROY umieściłem funkcje FreeLibrary(..) to program się kończy ale wyżuca błąd. bez tej funkcji nie mam tago błędu.
Spodziewam się ze ma to związek z oknem które cały czas próbuje kokoRZystaćystać z procedury, której nie ma, ale nie wiem na pewno czy o to chodzi. Jakieś wskazówki mile widziane.

0

Po otrzymanieu WM_DESTROY przez kontrolke ? Jeśli tak to wyrzuciłbym FreeLibrary(...), zawsze można pokazać jeszcze raz kontrolke. Umieść FreeLibrary(...) na końcu programu wykożystującego dll'ke.

Jeśli dopuszczasz kilkakrotne wykorzystanie kontrolki, to rejestuj klase podczas inicjalizacji dll'ki.

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