/*++ * * WOW v1.0 * * Copyright (c) 1991, Microsoft Corporation * * FASTRES.C * WOW16 user resource services * * History: * * Created 12-Jan-1993 by Chandan Chuahan (ChandanC) * * This file provides the Win 3.1 routines for loading BITMAP, MENU, ICON, * CURSOR, and DIALOG resources. These routines load the resources from the * App EXE and then pass the pointers to the corresponding 32 bit WOW * thunks. Thus saving the call backs from USER client to find, load, lock, * size, unlock, and free the resources. * --*/ #include "user.h" HBITMAP FAR PASCAL WOWLoadBitmap (HINSTANCE hInst, LPCSTR lpszBitmap, LPBYTE lpByte, DWORD ResSize); HMENU FAR PASCAL WOWLoadMenu (HINSTANCE hInst, LPCSTR lpszMenuName, LPBYTE lpByte, DWORD ResSize, WORD WinVer); HCURSOR FAR PASCAL WOWLoadCursorIcon (HINSTANCE hInst, LPCSTR lpszCursor, LPBYTE lpByte, DWORD ResSize, HGLOBAL hGbl, WORD WinVer, WORD wRttype); // // fDialogApi is TRUE for DialogBox* apis // fDialogApi is FALSE for CreateDialog* apis // HWND FAR PASCAL WOWDialogBoxParam (HINSTANCE hInst, LPBYTE lpByte, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit, DWORD ResSize, WORD fDialogApi); DWORD FAR PASCAL NotifyWOW (WORD Id, LPBYTE pData); #define LR_DEFAULTSIZE 0x0040 // from \nt\public\sdk\inc\winuser.h int FAR PASCAL LookupIconIdFromDirectoryEx(LPBYTE lpByte, BOOL fIcon, int cxDesired, int cyDesired, WORD wFlags); HANDLE FAR PASCAL WOWSetClipboardData (UINT, HANDLE); typedef struct _ICONCUR16 { /* iconcur */ WORD hInst; DWORD lpStr; } ICONCUR16; /* These must match counterparts in mvdm\inc\wowusr.h */ #define NW_LOADICON 1 // Internal #define NW_LOADCURSOR 2 // Internal HINSTANCE CheckDispHandle (HINSTANCE hInst) { HMODULE hIns; if (hInst) { hIns = GetModuleHandle ("DISPLAY"); return ((hInst == (HINSTANCE) hIns) ? 0:hInst); } else { return (0); } } HBITMAP API ILoadBitmap (HINSTANCE hInst, LPCSTR lpszBitmap) { HRSRC hRsrc = 0; HGLOBAL hGbl = 0; DWORD ResSize = 0; LPBYTE lpByte = (LPBYTE) NULL; HBITMAP ul = (HBITMAP)0; if (hInst = CheckDispHandle (hInst)) { hRsrc = FindResource (hInst, lpszBitmap, RT_BITMAP); if (!hRsrc) { goto lbm_exit; } ResSize = SizeofResource (hInst, hRsrc); if (!ResSize) { goto lbm_exit; } hGbl = LoadResource (hInst, hRsrc); if (!hGbl) { goto lbm_exit; } lpByte = LockResource (hGbl); if (!lpByte) { goto lbm_exit; } } ul = (HBITMAP) WOWLoadBitmap (hInst, lpszBitmap, lpByte, ResSize); lbm_exit: if (lpByte) { GlobalUnlock (hGbl); } if (hGbl) { FreeResource(hGbl); } return (ul); } HMENU API ILoadMenu (HINSTANCE hInst, LPCSTR lpszMenuName) { HRSRC hRsrc; HGLOBAL hGbl; DWORD ResSize = 0; LPBYTE lpByte = (LPBYTE) NULL; HMENU ul; WORD WinVer; if (hRsrc = FindResource (hInst, lpszMenuName, RT_MENU)) { if (ResSize = SizeofResource (hInst, hRsrc)) if (hGbl = LoadResource (hInst, hRsrc)) if (lpByte = LockResource (hGbl)) WinVer = GetExpWinVer (hInst); } if (!lpByte) { return (NULL); } ul = (HMENU) WOWLoadMenu (hInst, lpszMenuName, lpByte, ResSize, WinVer); if (hInst) { GlobalUnlock (hGbl); } return (ul); } HICON API ILoadIcon (HINSTANCE hInst, LPCSTR lpszIcon) { HRSRC hRsrc; HGLOBAL hGbl; DWORD ResSize = 0; LPBYTE lpByte = (LPBYTE) NULL; HICON ul; DWORD IconId; WORD WinVer; ICONCUR16 IconCur; WinVer = GetExpWinVer (hInst); if (!(hInst = CheckDispHandle (hInst))) { ul = WOWLoadCursorIcon (hInst, lpszIcon, lpByte, ResSize, NULL, WinVer, (WORD)RT_ICON); } else { IconCur.hInst = (WORD) hInst; IconCur.lpStr = (DWORD) lpszIcon; if (!(ul = (HICON) NotifyWOW (NW_LOADICON, (LPBYTE) &IconCur))) { if (WinVer >= VER30) { if (hRsrc = FindResource (hInst, lpszIcon, RT_GROUP_ICON)) { if (ResSize = SizeofResource (hInst, hRsrc)) if (hGbl = LoadResource (hInst, hRsrc)) lpByte = LockResource (hGbl); } if (!lpByte) { return (NULL); } IconId = LookupIconIdFromDirectoryEx(lpByte, TRUE, 0, 0, LR_DEFAULTSIZE); GlobalUnlock (hGbl); } else { IconId = (DWORD)lpszIcon; } if (hRsrc = FindResource (hInst, (LPCSTR) IconId, RT_ICON)) { if (ResSize = SizeofResource (hInst, hRsrc)) if (hGbl = LoadResource (hInst, hRsrc)) lpByte = LockResource (hGbl); } if (!lpByte) { return (NULL); } ul = WOWLoadCursorIcon (hInst, lpszIcon, lpByte, ResSize, hGbl, WinVer, (WORD)RT_ICON); GlobalUnlock (hGbl); } } return (ul); } HCURSOR API ILoadCursor (HINSTANCE hInst, LPCSTR lpszCursor) { HRSRC hRsrc; HGLOBAL hGbl; DWORD ResSize = 0; LPBYTE lpByte = (LPBYTE) NULL; HCURSOR ul; DWORD CursorId; WORD WinVer; ICONCUR16 IconCur; WinVer = GetExpWinVer (hInst); if (!(hInst = CheckDispHandle (hInst))) { ul = WOWLoadCursorIcon (hInst, lpszCursor, lpByte, ResSize, NULL, WinVer, (WORD)RT_CURSOR); } else { IconCur.hInst = (WORD) hInst; IconCur.lpStr = (DWORD) lpszCursor; if (!(ul = (HICON) NotifyWOW (NW_LOADCURSOR, (LPBYTE) &IconCur))) { if (WinVer >= VER30) { if (hRsrc = FindResource (hInst, lpszCursor, RT_GROUP_CURSOR)) { if (ResSize = SizeofResource (hInst, hRsrc)) if (hGbl = LoadResource (hInst, hRsrc)) lpByte = LockResource (hGbl); } if (!lpByte) { return (NULL); } CursorId = LookupIconIdFromDirectoryEx((LPBYTE)lpByte, FALSE, 0, 0, LR_DEFAULTSIZE); GlobalUnlock (hGbl); } else { CursorId = (DWORD)lpszCursor; } if (hRsrc = FindResource (hInst, (LPCSTR) CursorId, RT_CURSOR)) { if (ResSize = SizeofResource (hInst, hRsrc)) if (hGbl = LoadResource (hInst, hRsrc)) if (lpByte = LockResource (hGbl)) WinVer = GetExpWinVer (hInst); } if (!lpByte) { return (NULL); } ul = WOWLoadCursorIcon (hInst, lpszCursor, lpByte, ResSize, hGbl, WinVer, (WORD)RT_CURSOR); GlobalUnlock (hGbl); } } return (ul); } HWND API ICreateDialogParam (HINSTANCE hInst, LPCSTR lpszDlgTemp, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit) { HRSRC hRsrc; HGLOBAL hGbl; DWORD ResSize = 0; LPBYTE lpByte = (LPBYTE) NULL; HWND ul; if (hRsrc = FindResource (hInst, lpszDlgTemp, RT_DIALOG)) { if (ResSize = SizeofResource (hInst, hRsrc)) if (hGbl = LoadResource (hInst, hRsrc)) lpByte = LockResource (hGbl); } if (!lpByte) { return (NULL); } ul = (HWND) WOWDialogBoxParam (hInst, lpByte, hwndOwner, dlgprc, lParamInit, ResSize, FALSE); if (hInst) { GlobalUnlock (hGbl); } return (ul); } HWND API ICreateDialog (HINSTANCE hInst, LPCSTR lpszDlgTemp, HWND hwndOwner, DLGPROC dlgprc) { return (ICreateDialogParam (hInst, lpszDlgTemp, hwndOwner, dlgprc, 0L)); } HWND API ICreateDialogIndirectParam (HINSTANCE hInst, LPCSTR lpszDlgTemp, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit) { return WOWDialogBoxParam (hInst, (LPBYTE)lpszDlgTemp, hwndOwner, dlgprc, lParamInit, 0, FALSE); } HWND API ICreateDialogIndirect (HINSTANCE hInst, LPCSTR lpszDlgTemp, HWND hwndOwner, DLGPROC dlgprc) { return WOWDialogBoxParam (hInst, (LPBYTE)lpszDlgTemp, hwndOwner, dlgprc, 0, 0, FALSE); } int API IDialogBoxParam (HINSTANCE hInst, LPCSTR lpszDlgTemp, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit) { HRSRC hRsrc; HGLOBAL hGbl; DWORD ResSize = 0; LPBYTE lpByte = (LPBYTE) NULL; int ul; if (hRsrc = FindResource (hInst, lpszDlgTemp, RT_DIALOG)) { if (ResSize = SizeofResource (hInst, hRsrc)) if (hGbl = LoadResource (hInst, hRsrc)) lpByte = LockResource (hGbl); } if (!lpByte) { return (-1); } ul = (int)WOWDialogBoxParam (hInst, lpByte, hwndOwner, dlgprc, lParamInit, ResSize, TRUE); if (hInst) { GlobalUnlock (hGbl); } return (ul); } int API IDialogBox (HINSTANCE hInst, LPCSTR lpszDlgTemp, HWND hwndOwner, DLGPROC dlgprc) { return (IDialogBoxParam (hInst, lpszDlgTemp, hwndOwner, dlgprc, 0L)); } int API IDialogBoxIndirectParam (HINSTANCE hInst, HGLOBAL hGbl, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit) { DWORD ResSize; LPBYTE lpByte; int ul; if (lpByte = LockResource (hGbl)) { ResSize = GlobalSize(hGbl); ul = (int)WOWDialogBoxParam (hInst, lpByte, hwndOwner, dlgprc, lParamInit, ResSize, TRUE); GlobalUnlock (hGbl); } else { ul = -1; } return (ul); } int API IDialogBoxIndirect(HINSTANCE hInst, HGLOBAL hGbl, HWND hwndOwner, DLGPROC dlgprc) { return IDialogBoxIndirectParam (hInst, hGbl, hwndOwner, dlgprc, 0); } HANDLE API SetClipboardData (UINT cbformat, HANDLE hMem) { HANDLE ul; LPMETAFILEPICT lpMf; switch (cbformat) { case CF_DSPMETAFILEPICT: case CF_METAFILEPICT: if (hMem) { lpMf = (LPMETAFILEPICT) GlobalLock(hMem); if (lpMf) { /* If the handle is bad make hMF = NULL. This is needed * for Micrograpfx. They don't check for failure when rendering * data */ if (!(GlobalReAlloc (lpMf->hMF, 0L, GMEM_MODIFY | GMEM_SHARE))) { lpMf->hMF = NULL; } } GlobalUnlock(hMem); } // It is intentional to let it thru to the "case statements". // ChandanC 5/11/92. /* * These are the defaults. * * case CF_DIB: * case CF_TEXT: * case CF_DSPTEXT: * case CF_SYLK: * case CF_DIF: * case CF_TIFF: * case CF_OEMTEXT: * case CF_PENDATA: * case CF_RIFF: * case CF_WAVE: * case CF_OWNERDISPLAY: */ default: if (hMem) { hMem = GlobalReAlloc (hMem, 0L, GMEM_MODIFY | GMEM_DDESHARE); } break; case CF_DSPBITMAP: case CF_BITMAP: case CF_PALETTE: break; } ul = WOWSetClipboardData (cbformat, hMem); return (ul); }