Ładny brzuch
Witam,
mam taki program:
#include "stdafx.h" typedef HICON (*fun)(); LRESULT CALLBACK PetlaKomunikatow(HWND, UINT, WPARAM, LPARAM); char AppName[] = "WinApi"; int WINAPI WinMain(HINSTANCE Okno, HINSTANCE, LPSTR, int tryb) { HMODULE hModule = LoadLibrary("Biblioteka.dll"); if(hModule==NULL) return 0; fun laduj; laduj = (fun)GetProcAddress(hModule,"DllLoadIcon"); if (laduj == NULL) { FreeLibrary(hModule); return 0; } WNDCLASS KlasaOkna; KlasaOkna.style = 0; KlasaOkna.hInstance = Okno; KlasaOkna.lpszClassName = AppName; KlasaOkna.lpfnWndProc = PetlaKomunikatow; KlasaOkna.hIcon = laduj(); KlasaOkna.hCursor = LoadCursor(NULL, IDC_ARROW); KlasaOkna.lpszMenuName = NULL; KlasaOkna.cbClsExtra = 0; KlasaOkna.cbWndExtra = 0; KlasaOkna.hbrBackground = (HBRUSH)(COLOR_WINDOW); FreeLibrary(hModule); if (!RegisterClass(&KlasaOkna)) return 0; HWND hOkno = CreateWindowEx( WS_EX_TOPMOST, AppName, "WinApi", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU, 0, 0, 640, 480, NULL, NULL, Okno, NULL); ShowWindow(hOkno, tryb); UpdateWindow(hOkno); MSG Komunikat; while (GetMessage(&Komunikat, NULL, 0, 0)) { TranslateMessage(&Komunikat); DispatchMessage(&Komunikat); } return Komunikat.wParam; } LRESULT CALLBACK PetlaKomunikatow(HWND hOkno, UINT Komunikat, WPARAM wParam, LPARAM lParam) { switch (Komunikat) { case WM_DESTROY: PostQuitMessage(0); return 0; break; default: return DefWindowProc(hOkno, Komunikat, wParam, lParam); } return 0; }
i dll'a do niego:
# include <Windows.h> extern "C" { __declspec (dllexport) HICON DllLoadIcon (); } # include "resource.h" // IDI_ICON1 HINSTANCE hInst; HICON DllLoadIcon () { return LoadIcon (hInst, MAKEINTRESOURCE (IDI_ICON1)); } BOOL WINAPI DllMain (HINSTANCE hInstance, DWORD dwReason, LPVOID pVoid) { switch (dwReason) { case DLL_PROCESS_ATTACH: hInst = hInstance; MessageBox (0, "Biblioteka zaadowana poprawnie.", "Komunikat", MB_OK | MB_ICONINFORMATION); break; case DLL_PROCESS_DETACH: MessageBox (0, "Biblioteka zostaa usunita z pamici.", "Komunikat", MB_OK | MB_ICONINFORMATION); break; } return true; }
Chodzi mi o to e ikona ktra jest w bibliotece nie chce mi si pojawi w programie
(tak samo mam z bitmapami), zamiast tej ikony wywietla si standardowa ikona " :excl: "(bitmapy si w ogle nie wywietlaj).
Uywam VC++6.
Co powinienem zmieni??
Uytkownik M@rio edytowa ten post 17 lipiec 2005, 16:00
Witam
Sama funkcja DllLoadIcon wydaje si teoretycznie by poprawna, jednak myl, e problem wynika z tego e znajduje si ona w bibliotece DLL. Biblioteki DLL inaczej traktuj zmienne ni aplikacje. Dziki temu mog one by wspdzielone pomidzy aplikacje (kod w nich zawarty moe by niezalenie wywoywany), jednak w Twoim przypadku zaleta ta wydaje si by wad...
S sposoby na to eby to zmieni, gdzie widziaem jak to zrobi ale nie pamitam jak to si robio (zreszt pisz w innych jzykach). Jednak proponuj sprbowa, zrobi funkcj ktrej parametrami wywoania byo hInstance i IconID np.:
HICON DllLoadIcon (HINSTANCE hDLLInstance, DWORD IconID) { return LoadIcon (hDLLInstance, MAKEINTRESOURCE (IconID)); }
hInstance zwraca funkcja LoadLibrary ktrej uywasz do zaadowania biblioteki wic moesz to wykorzysta, gdyby jednak adowa bibliotek statycznie uchwyt biblioteki moesz uzyska wywoujc funkcj GetModuleHandle. Oczywicie nie jestem na 100% pewien e to zadziaa, ale wydaje mi si e tak.
Pozdrawiam
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
mam taki program:
#include "stdafx.h" typedef HICON (*fun)(); LRESULT CALLBACK PetlaKomunikatow(HWND, UINT, WPARAM, LPARAM); char AppName[] = "WinApi"; int WINAPI WinMain(HINSTANCE Okno, HINSTANCE, LPSTR, int tryb) { HMODULE hModule = LoadLibrary("Biblioteka.dll"); if(hModule==NULL) return 0; fun laduj; laduj = (fun)GetProcAddress(hModule,"DllLoadIcon"); if (laduj == NULL) { FreeLibrary(hModule); return 0; } WNDCLASS KlasaOkna; KlasaOkna.style = 0; KlasaOkna.hInstance = Okno; KlasaOkna.lpszClassName = AppName; KlasaOkna.lpfnWndProc = PetlaKomunikatow; KlasaOkna.hIcon = laduj(); KlasaOkna.hCursor = LoadCursor(NULL, IDC_ARROW); KlasaOkna.lpszMenuName = NULL; KlasaOkna.cbClsExtra = 0; KlasaOkna.cbWndExtra = 0; KlasaOkna.hbrBackground = (HBRUSH)(COLOR_WINDOW); FreeLibrary(hModule); if (!RegisterClass(&KlasaOkna)) return 0; HWND hOkno = CreateWindowEx( WS_EX_TOPMOST, AppName, "WinApi", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU, 0, 0, 640, 480, NULL, NULL, Okno, NULL); ShowWindow(hOkno, tryb); UpdateWindow(hOkno); MSG Komunikat; while (GetMessage(&Komunikat, NULL, 0, 0)) { TranslateMessage(&Komunikat); DispatchMessage(&Komunikat); } return Komunikat.wParam; } LRESULT CALLBACK PetlaKomunikatow(HWND hOkno, UINT Komunikat, WPARAM wParam, LPARAM lParam) { switch (Komunikat) { case WM_DESTROY: PostQuitMessage(0); return 0; break; default: return DefWindowProc(hOkno, Komunikat, wParam, lParam); } return 0; }
i dll'a do niego:
# include <Windows.h> extern "C" { __declspec (dllexport) HICON DllLoadIcon (); } # include "resource.h" // IDI_ICON1 HINSTANCE hInst; HICON DllLoadIcon () { return LoadIcon (hInst, MAKEINTRESOURCE (IDI_ICON1)); } BOOL WINAPI DllMain (HINSTANCE hInstance, DWORD dwReason, LPVOID pVoid) { switch (dwReason) { case DLL_PROCESS_ATTACH: hInst = hInstance; MessageBox (0, "Biblioteka zaadowana poprawnie.", "Komunikat", MB_OK | MB_ICONINFORMATION); break; case DLL_PROCESS_DETACH: MessageBox (0, "Biblioteka zostaa usunita z pamici.", "Komunikat", MB_OK | MB_ICONINFORMATION); break; } return true; }
Chodzi mi o to e ikona ktra jest w bibliotece nie chce mi si pojawi w programie
(tak samo mam z bitmapami), zamiast tej ikony wywietla si standardowa ikona " :excl: "(bitmapy si w ogle nie wywietlaj).
Uywam VC++6.
Co powinienem zmieni??
Uytkownik M@rio edytowa ten post 17 lipiec 2005, 16:00
Witam
Sama funkcja DllLoadIcon wydaje si teoretycznie by poprawna, jednak myl, e problem wynika z tego e znajduje si ona w bibliotece DLL. Biblioteki DLL inaczej traktuj zmienne ni aplikacje. Dziki temu mog one by wspdzielone pomidzy aplikacje (kod w nich zawarty moe by niezalenie wywoywany), jednak w Twoim przypadku zaleta ta wydaje si by wad...
S sposoby na to eby to zmieni, gdzie widziaem jak to zrobi ale nie pamitam jak to si robio (zreszt pisz w innych jzykach). Jednak proponuj sprbowa, zrobi funkcj ktrej parametrami wywoania byo hInstance i IconID np.:
HICON DllLoadIcon (HINSTANCE hDLLInstance, DWORD IconID) { return LoadIcon (hDLLInstance, MAKEINTRESOURCE (IconID)); }
hInstance zwraca funkcja LoadLibrary ktrej uywasz do zaadowania biblioteki wic moesz to wykorzysta, gdyby jednak adowa bibliotek statycznie uchwyt biblioteki moesz uzyska wywoujc funkcj GetModuleHandle. Oczywicie nie jestem na 100% pewien e to zadziaa, ale wydaje mi si e tak.
Pozdrawiam