1 /* 2 * ReactOS kernel 3 * Copyright (C) 1998, 1999, 2000, 2001, 2002 ReactOS Team 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 18 */ 19 /* 20 * PROJECT: ReactOS user32.dll 21 * FILE: win32ss/user/user32/misc/winhelp.c 22 * PURPOSE: WinHelp 23 * PROGRAMMER: Robert Dickenson(robd@reactos.org) 24 * UPDATE HISTORY: 25 * 23-08-2002 RDD Created from wine sources 26 */ 27 28 #include <user32.h> 29 30 /* WinHelp internal structure */ 31 typedef struct 32 { 33 WORD size; 34 WORD command; 35 LONG data; 36 LONG reserved; 37 WORD ofsFilename; 38 WORD ofsData; 39 } WINHELP,*LPWINHELP; 40 41 42 /* FUNCTIONS *****************************************************************/ 43 44 /* 45 * @unimplemented 46 */ 47 BOOL 48 WINAPI 49 WinHelpA(HWND hWnd, LPCSTR lpszHelp, UINT uCommand, DWORD_PTR dwData) 50 { 51 static WORD WM_WINHELP = 0; 52 HWND hDest; 53 LPWINHELP lpwh; 54 HGLOBAL hwh; 55 int size,dsize,nlen; 56 57 if (!WM_WINHELP) { 58 WM_WINHELP = RegisterWindowMessageA("WM_WINHELP"); 59 if (!WM_WINHELP) 60 return FALSE; 61 } 62 63 hDest = FindWindowA("MS_WINHELP", NULL); 64 if (!hDest) { 65 if (uCommand == HELP_QUIT) return TRUE; 66 if (WinExec("winhlp32.exe -x", SW_SHOWNORMAL) < 32) { 67 //ERR("can't start winhlp32.exe -x ?\n"); 68 return FALSE; 69 } 70 if (!(hDest = FindWindowA("MS_WINHELP", NULL))) { 71 //FIXME("did not find MS_WINHELP (FindWindow() failed, maybe global window handling still unimplemented)\n"); 72 return FALSE; 73 } 74 } 75 switch (uCommand) { 76 case HELP_CONTEXT: 77 case HELP_SETCONTENTS: 78 case HELP_CONTENTS: 79 case HELP_CONTEXTPOPUP: 80 case HELP_FORCEFILE: 81 case HELP_HELPONHELP: 82 case HELP_FINDER: 83 case HELP_QUIT: 84 dsize=0; 85 break; 86 case HELP_KEY: 87 case HELP_PARTIALKEY: 88 case HELP_COMMAND: 89 dsize = dwData ? strlen( (LPSTR)dwData )+1: 0; 90 break; 91 case HELP_MULTIKEY: 92 dsize = ((LPMULTIKEYHELPA)dwData)->mkSize; 93 break; 94 case HELP_SETWINPOS: 95 dsize = ((LPHELPWININFOA)dwData)->wStructSize; 96 break; 97 default: 98 //FIXME("Unknown help command %d\n",uCommand); 99 return FALSE; 100 } 101 if (lpszHelp) 102 nlen = strlen(lpszHelp)+1; 103 else 104 nlen = 0; 105 size = sizeof(WINHELP) + nlen + dsize; 106 hwh = GlobalAlloc(0,size); 107 if (hwh == NULL) 108 return FALSE; 109 lpwh = GlobalLock(hwh); 110 lpwh->size = size; 111 lpwh->command = uCommand; 112 lpwh->data = dwData; 113 if (nlen) { 114 strcpy(((char*)lpwh) + sizeof(WINHELP), lpszHelp); 115 lpwh->ofsFilename = sizeof(WINHELP); 116 } else { 117 lpwh->ofsFilename = 0; 118 } 119 if (dsize) { 120 memcpy(((char*)lpwh)+sizeof(WINHELP)+nlen,(LPSTR)dwData,dsize); 121 lpwh->ofsData = sizeof(WINHELP)+nlen; 122 } else { 123 lpwh->ofsData = 0; 124 } 125 GlobalUnlock(hwh); 126 return SendMessageA(hDest, WM_WINHELP, (WPARAM)hWnd, (LPARAM)hwh); 127 } 128 129 130 /* 131 * @unimplemented 132 */ 133 BOOL 134 WINAPI 135 WinHelpW(HWND hWnd, LPCWSTR lpszHelp, UINT uCommand, DWORD_PTR dwData) 136 { 137 INT len; 138 LPSTR file; 139 BOOL ret = FALSE; 140 141 if (!lpszHelp) return WinHelpA(hWnd, NULL, uCommand, dwData); 142 143 len = WideCharToMultiByte(CP_ACP, 0, lpszHelp, -1, NULL, 0, NULL, NULL); 144 if ((file = HeapAlloc(GetProcessHeap(), 0, len))) { 145 WideCharToMultiByte(CP_ACP, 0, lpszHelp, -1, file, len, NULL, NULL); 146 ret = WinHelpA(hWnd, file, uCommand, dwData); 147 HeapFree(GetProcessHeap(), 0, file); 148 } 149 return ret; 150 } 151 152