[ cubicle @ 22.11.2004. 14:09 ] @
| Da li postoji nacin da definisem ToolBar u DLL-u (bitmap, bugmice, i sve ostalo) i da ga ucitam i prikazem na glavnom okviru (MainFrame).
Okruzenje je MS VC++6.0.
Ne mogu pribavom handle na resource toolbara koji su definisani u DLL-u, a pokusaj kreriranja toolbara u dll-u i vracanje pokazivaca frameu beznadezno propada:
evtToolBar = new CToolBar;
evtToolBar->CreateEx(wnd); // <-- puca ovde (wnd je validan pokazivac na CMainFrame)
evtToolBar->LoadToolBar(IDR_TOOLBAR_EVENTS);
return evtToolBar;
POMAGAJTE....
p.s. dll je dinamicki ucitan (AfxLoadLibrary ili LoadLibrary)... |
[ Dragi Tata @ 22.11.2004. 14:35 ] @
Nadam se da si dinamički linkovao MFC i CRT?
[ cubicle @ 22.11.2004. 14:53 ] @
Citat:
Dragi Tata: Nadam se da si dinamički linkovao MFC i CRT?
Naravno...
Problem izgleda nastaje kod AfxGetInstanceHandle() koju pozivaju CreateEx i LoadToolBar metode MFC klase CToolBar. Naime, resultat je uvek NULL iako MSDN tvrdi da ce AfxGetInstanceHandle() vratiti handle instance dll-a ukoliko se radi o MFC dll-u (a radi se).
Ocigledno negde gresim... ne znam gde...
AfxGetInstanceHandle() vraca AfxGetModuleState()->m_hCurrentInstanceHandle ukoliko nije NULL inace ASSERT makro vrati gresku. A AfxGetModuleState()->m_hCurrentInstanceHandle je uvek NULL, sto je detalj koji mi nije do kraja jasan...
[ milanche @ 22.11.2004. 18:21 ] @
Koristiti MFC klase iz DLL-a nije nemoguce, ali ima nekoliko opakih problema koji te mogu
sacekati na krivini:
1) Resource ID tvog toolbar-a ne sme da ima istu vrednost kao i neki drugi resource ID
od aplikacije. Razne seme postoje da se ovo izbegne, ali sve one podrazumevaju da
korisnik tvog DLL-a zna resource koje koristis (sto se lako provaljuje).
Ako se desi preklapanje iste resource ID vrednosti, aplikacija crash-uje.
2) Release verzija MFC aplikacije vrlo cesto (da ne kazem: uvek) zahteva release
verziju MFC Dll-a, u protivnom nece da se startuje. Debug verzija MFC aplikacije
(koliko se secam) je bila nesto manje zahtevna.
3) Promena layout-a klase (dodas bilo koji metod ili public varijablu) automatski
zahteva rekompajliranje klijent aplikacije. Za ovo postoji lek (kreiranje interface klase
koja izvozi samo ono sto treba).
Pravo, elegantno resenje za to sto hoces je da napravis ActiveX kontrolu. Ona je
imuna na sve ove probleme, i lako je distribuirati drugim korisnicima. Ako pravis toolbar
za browser, moraces da je pises u ATL-u, a ako je pravis samo za desktop standalone
('fat client') aplikacije, mozes da napravis i MFC ActiveX kontrolu).
P.S. Staticko vs. dinamicko linkovanje mislim da ne igra mnogo u problemu koji imas.
Na kraju da te pitam i ovo:
Ima li tvoja CToolBar-derived klasa keyword AFX_EXT_CLASS, tj. imas li ovo u definiciji
klase:
class AFX_EXT_CLASS CMojToolbar_iliKakoLiSeVecZove: public CToolBar
Bez toga nece biti lako vidljiva klijent aplikaciji.
[ milanche @ 22.11.2004. 19:56 ] @
Citat:
milanche:
1) Resource ID tvog toolbar-a ne sme da ima istu vrednost kao i neki drugi resource ID
od aplikacije. Razne seme postoje da se ovo izbegne, ali sve one podrazumevaju da
korisnik tvog DLL-a zna resource koje koristis (sto se lako provaljuje).
Ako se desi preklapanje iste resource ID vrednosti, aplikacija crash-uje.
Ovo vazi za bilo koji resource. Toolbar je malo specijalniji slucaj jer dugmad na njemu
moraju da imaju identicne resource ID-s sa elementima Menu-a glavne aplikacije (sto
mu dodje ista stvar, samo malo uzi problem - striktno match-ovanje vrednosti umesto
striktno izbegavanje duplikata)
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.