Ł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
  •