Win32 i DLL
Nå ny opgave til de kloge hoveder..Jeg skal bruge en splash screen skrevet i REN win32 der ligger i en DLL
til det formål har jeg det følgende kode :
//--------------------------------------
// DLL Kode
//--------------------------------------
#include <windows.h>
#define WIN32_LEAN_AND_MEAN
#ifdef ATOMIC_VC6 //VC++ 6.0
#define EXPORT __declspec(dllexport)
#else //Borland 5.0x
#define EXPORT _export
#endif
WNDCLASS WinClass;
HINSTANCE Inst;
HRGN hRegion;
HWND Handle;
MSG Msg;
HANDLE AppFrameLogo;
int xoff,yoff,xsize,ysize;
long bmxsize,bmysize;
PAINTSTRUCT ps;
BITMAPV4HEADER bmhdr;
int bcountx;
int bcounty;
int brestx;
int bresty;
LRESULT CALLBACK SPASHWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_PAINT:
{
BeginPaint(Handle,&ps);
RECT wr;
GetClientRect(Handle,&wr);
xoff=0;
yoff=0;
xsize=wr.right;
ysize=wr.bottom;
HDC hdc = ps.hdc;
HDC cdc = CreateCompatibleDC(hdc);
SelectObject(cdc,AppFrameLogo);
ZeroMemory(&bmhdr,sizeof(bmhdr));
bmhdr.bV4Size=sizeof(bmhdr);
GetDIBits(cdc, (HBITMAP)AppFrameLogo,0,0,0,(tagBITMAPINFO *) &bmhdr,DIB_PAL_COLORS);
bmxsize=bmhdr.bV4Width;
bmysize=bmhdr.bV4Height;
bcountx=(xsize / bmxsize)+1;
bcounty=(ysize / bmysize)+1;
brestx=(xsize % bmxsize);
bresty=(ysize % bmysize);
for (int cw=0;cw<bcountx;cw++)
for (int ch=0;ch<bcounty;ch++)
BitBlt(hdc,xoff+(cw*bmxsize),yoff+(ch*bmysize),bmxsize,bmysize,cdc,0,0,SRCCOPY);
DeleteDC(cdc);
EndPaint(Handle,&ps);
return 0;
}
/*
case WM_DESTROY:
PostQuitMessage(0);
break;
*/
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
#define BITMAPWIDTH 500
#define BITMAPHEIGHT 100
extern \"C\" int EXPORT LaunchSplashScreen(HINSTANCE hInstance)
{
Inst = hInstance;
WinClass.style = CS_CLASSDC | CS_PARENTDC;
WinClass.lpfnWndProc = &SPASHWndProc;
WinClass.hInstance = Inst;
WinClass.lpszClassName = \"KBA_SPLASH_SCREEN\";
WinClass.hCursor = LoadCursor(0, IDC_ARROW);
RegisterClass(&WinClass);
POINT ScreenCenter;
ScreenCenter.x = GetSystemMetrics(SM_CXSCREEN) /2;
ScreenCenter.y = GetSystemMetrics(SM_CYSCREEN) /2;
int Left = ScreenCenter.x - (BITMAPWIDTH / 2);
int Top = ScreenCenter.y - (BITMAPHEIGHT /2);
Handle = CreateWindowEx(WS_EX_DLGMODALFRAME, \"KBA_SPLASH_SCREEN\", \"\", WS_VISIBLE | WS_POPUP , Left, Top, BITMAPWIDTH, BITMAPHEIGHT, 0, 0, Inst, 0);
AppFrameLogo=LoadImage(0,\"KeyBalance Logo.bmp\",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
if (!AppFrameLogo)
return 0;
UpdateWindow(Handle);
while(GetMessage(&Msg, 0, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
return 0;
}
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
Til at kalde det her skidt med har jeg den følgende exe fil :
//------------------------------------------
//EXE Fil
//------------------------------------------
#include <windows.h>
typedef int (CALLBACK* LaunchSplashScreenProc)(HINSTANCE);
MSG Msg;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HMODULE DllHandle = LoadLibrary(\"SplashScreen.dll\");
LaunchSplashScreenProc LaunchSplashScreen= (LaunchSplashScreenProc)GetProcAddress(DllHandle,\"_LaunchSplashScreen\");
LaunchSplashScreen(hInstance);
FreeLibrary(DllHandle);
return 0;
}
problemet er når jeg lokker min Spash Screen, enten ved at dende en WM_DESTROY efter den eller ved at trykke ALT + F4 så dør det hele.
Jeg vil gerne vide hvad jeg gørgalt siden jeg ikke kan lukke den igen.
Jens B
