00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
#include "precomp.h"
00012
#pragma hdrstop
00013
00014
00015 #define MAX_ATTEMPTS 5 // maximum -1 id controls to search through
00016 char szDefaultHelpFileA[] =
"windows.hlp";
00017
00018 PWCHAR
szEXECHELP = TEXT(
"\\winhlp32 - ");
00019 PWCHAR
szMS_WINHELP =
L"MS_WINHELP";
00020 PWCHAR
szMS_POPUPHELP =
L"MS_POPUPHELP";
00021 PWCHAR
szMS_TCARDHELP =
L"MS_TCARDHELP";
00022
00023
00024 #define HLP_POPUP 'p' // Execute WinHelp as a popup
00025 #define HLP_TRAININGCARD 'c' // Execute WinHelp as a training card
00026 #define HLP_APPLICATION 'x' // Execute WinHelp as application help
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 LRESULT
SendWinHelpMessage (HWND hwnd, WPARAM wParam, LPARAM lParam)
00040 {
00041
DWORD dwProcessId = 0;
00042
GetWindowThreadProcessId(hwnd, &dwProcessId);
00043
AllowSetForegroundWindow(dwProcessId);
00044
return SendMessage(hwnd, WM_WINHELP, wParam, lParam);
00045 }
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 LPHLP
HFill(
00061 LPCSTR lpszHelp,
00062 DWORD ulCommand,
00063 ULONG_PTR ulData)
00064 {
00065
DWORD cb;
00066
DWORD cbStr;
00067
DWORD cbData;
00068 LPHLP phlp;
00069
BYTE bType;
00070
00071
00072
00073
00074 cbStr = (lpszHelp) ?
strlen(lpszHelp) + 1 : 0;
00075
00076
00077
00078
00079 bType =
HIBYTE(LOWORD(ulCommand));
00080
if (ulData) {
00081
switch (bType) {
00082
case HIBYTE(HELP_HB_STRING):
00083
00084
00085
00086 cbData =
strlen((LPSTR)ulData) + 1;
00087
break;
00088
00089
case HIBYTE(HELP_HB_STRUCT):
00090
00091
00092
00093
00094 cbData = *((
int *)ulData);
00095
break;
00096
00097
default:
00098
00099
00100
00101 cbData = 0;
00102 }
00103 }
else {
00104
00105
00106
00107 cbData = 0;
00108 }
00109
00110
00111
00112
00113 cb =
sizeof(HLP) + cbStr + cbData;
00114
00115
00116
00117
00118
if ((phlp = (LPHLP)LocalAlloc(LPTR, cb)) ==
NULL)
00119
return NULL;
00120
00121
00122
00123
00124 phlp->cbData = (WORD)cb;
00125 phlp->usCommand = (WORD)ulCommand;
00126 phlp->ulReserved = 0;
00127
00128
00129
00130
00131
00132
if (lpszHelp) {
00133 phlp->offszHelpFile =
sizeof(HLP);
00134 strcpy((LPSTR)(phlp + 1), lpszHelp);
00135 }
else {
00136 phlp->offszHelpFile = 0;
00137 }
00138
00139
00140
00141
00142
switch (bType) {
00143
case HIBYTE(HELP_HB_STRING):
00144
if (cbData) {
00145 phlp->offabData = (WORD)(
sizeof(HLP) + cbStr);
00146 strcpy((LPSTR)phlp + phlp->offabData, (LPSTR)ulData);
00147 }
else {
00148 phlp->offabData = 0;
00149 }
00150
break;
00151
00152
case HIBYTE(HELP_HB_STRUCT):
00153
if (cbData) {
00154 phlp->offabData = (WORD)(
sizeof(HLP) + cbStr);
00155 RtlCopyMemory((LPBYTE)phlp + phlp->offabData, (PVOID)ulData,
00156 *((
int far *)ulData));
00157 }
else {
00158 phlp->offabData = 0;
00159 }
00160
break;
00161
00162
default:
00163 phlp->offabData = 0;
00164
00165
00166 phlp->ulTopic = ulData;
00167
break;
00168 }
00169
00170
return(phlp);
00171 }
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183 BOOL LaunchHelper(LPWSTR lpfile, DWORD dwType)
00184 {
00185
int cchLen;
00186
int cchShift;
00187
DWORD idProcess;
00188 STARTUPINFO StartupInfo;
00189 PROCESS_INFORMATION ProcessInformation;
00190 PWCHAR pwcExecHelp;
00191
00192 pwcExecHelp =
szEXECHELP;
00193
00194
00195
00196
00197
if (*lpfile) {
00198 cchLen = wcslen(lpfile);
00199 cchShift = (lpfile[cchLen - 1] == TEXT(
'\\')) ? 1 : 0;
00200 wcscat(lpfile, pwcExecHelp + cchShift);
00201 }
else {
00202 wcscat(lpfile, pwcExecHelp + 1);
00203 }
00204
00205
00206
00207
00208
00209
switch (dwType) {
00210
case TYPE_POPUP:
00211 lpfile[wcslen(lpfile)-1] = TEXT(
HLP_POPUP);
00212
break;
00213
00214
case TYPE_TCARD:
00215 lpfile[wcslen(lpfile)-1] = TEXT(
HLP_TRAININGCARD);
00216
break;
00217
00218
default:
00219 lpfile[wcslen(lpfile)-1] = TEXT(
HLP_APPLICATION);
00220
break;
00221 }
00222
00223
00224
00225
00226 memset(&StartupInfo,0,
sizeof(StartupInfo));
00227 StartupInfo.cb =
sizeof(StartupInfo);
00228 StartupInfo.wShowWindow = SW_SHOW;
00229 StartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_FORCEONFEEDBACK;
00230
00231 idProcess = (
DWORD)CreateProcessW(
NULL, lpfile,
00232
NULL,
NULL,
FALSE, NORMAL_PRIORITY_CLASS,
NULL,
NULL, &StartupInfo,
00233 &ProcessInformation);
00234
00235
if (idProcess) {
00236
WaitForInputIdle(ProcessInformation.hProcess, 10000);
00237
NtClose(ProcessInformation.hProcess);
00238
NtClose(ProcessInformation.hThread);
00239
return TRUE;
00240 }
00241
00242
return FALSE;
00243 }
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256 BOOL LaunchHelp(DWORD dwType)
00257 {
00258 WCHAR wszPath[
MAX_PATH];
00259
00260 GetSystemWindowsDirectoryW(wszPath,
MAX_PATH);
00261
00262
if (
LaunchHelper(wszPath, dwType))
00263
return TRUE;
00264
00265
00266
00267
00268 GetSystemDirectoryW(wszPath,
MAX_PATH);
00269
if (
LaunchHelper(wszPath, dwType))
00270
return TRUE;
00271
00272
00273
00274
00275 wszPath[0] =
L'\0';
00276
return LaunchHelper(wszPath, dwType);
00277
00278 }
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290 PWND GetNextDlgHelpItem(
PWND pwndDlg,
PWND pwnd)
00291 {
00292
PWND pwndSave;
00293
00294
if (pwnd == pwndDlg)
00295 pwnd =
NULL;
00296
else
00297 {
00298 pwnd =
_GetChildControl(pwndDlg, pwnd);
00299
if (pwnd)
00300 {
00301
if (!
_IsDescendant(pwndDlg, pwnd))
00302
return(
NULL);
00303 }
00304 }
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318 pwndSave = pwnd;
00319 pwnd =
_NextControl(pwndDlg, pwnd, CWP_SKIPINVISIBLE);
00320
00321
while ((pwnd != pwndSave) && (pwnd != pwndDlg))
00322 {
00323 UserAssert(pwnd);
00324
00325
if (!pwndSave)
00326 pwndSave = pwnd;
00327
00328
if ((pwnd->style & (WS_TABSTOP | WS_VISIBLE)) == (WS_TABSTOP | WS_VISIBLE))
00329
00330
00331
00332
break;
00333
00334 pwnd =
_NextControl(pwndDlg, pwnd, CWP_SKIPINVISIBLE);
00335 }
00336
00337
return(pwnd);
00338 }
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 UINT HelpMenu(
00349 HWND hwnd,
00350 PPOINT ppt)
00351 {
00352
INT cmd;
00353 HMENU hmenu = LoadMenu(
hmodUser, MAKEINTRESOURCE(
ID_HELPMENU));
00354
00355
if (hmenu !=
NULL) {
00356 cmd =
TrackPopupMenu(
GetSubMenu(hmenu, 0),
00357 TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON,
00358 ppt->x, ppt->y, 0, hwnd,
NULL);
00359
NtUserDestroyMenu(hmenu);
00360
return cmd;
00361 }
00362
00363
return (
UINT)-1;
00364 }
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375 HWND
FindWinHelpWindow(
00376 LPCWSTR lpwstrHelpWindowClass,
00377 DWORD dwType,
00378 BOOL bLaunchIt
00379 )
00380 {
00381 HWND hwndHelp;
00382
00383
00384
00385
00386
00387
00388
00389 hwndHelp =
InternalFindWindowExW(
NULL,
NULL, lpwstrHelpWindowClass,
NULL,
FW_32BIT);
00390
00391
if (hwndHelp ==
NULL) {
00392
if (bLaunchIt) {
00393
00394
00395
00396
if ((
LaunchHelp(dwType) ==
FALSE) ||
00397 (hwndHelp =
FindWindowEx(
NULL,
NULL, (LPWSTR)lpwstrHelpWindowClass,
NULL)) ==
NULL)
00398 {
00399
00400
00401
00402
00403
00404
#if DBG
00405
RIPMSG0( RIP_WARNING,
"xxxWinHelpA: xxxLaunchHelp and xxxFindWinow failed." );
00406
#endif
00407
}
00408 }
00409 }
00410
00411
return hwndHelp;
00412 }
00413
00414
00415
00416
00417
00418
00419 BOOL CALLBACK
EnumHwndDlgChildProc(HWND hwnd, LPARAM lParam )
00420 {
00421
PWND pwnd;
00422
BOOL bResult;
00423
00424
if (pwnd =
ValidateHwnd(hwnd))
00425 bResult =
EnumPwndDlgChildProc( pwnd, lParam );
00426
else
00427 bResult =
TRUE;
00428
00429
return bResult;
00430 }
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447 BOOL WinHelpA(
00448 HWND hwnd,
00449 LPCSTR lpszHelp,
00450 UINT uCommand,
00451 ULONG_PTR dwData)
00452 {
00453 LPWSTR lpwstrHelpWindowClass;
00454 LPHLP lpHlp =
NULL;
00455
DWORD dwType;
00456
PWND pwnd;
00457 HWND hwndHelp =
NULL;
00458
PWND pwndTop =
NULL;
00459
PWND pwndMain;
00460 LRESULT lResult;
00461 POINT ptCur;
00462
BOOL bResult =
TRUE;
00463
00464 pwnd =
ValidateHwnd(hwnd);
00465
00466
if (uCommand & HELP_TCARD) {
00467
00468
00469
00470
00471
00472 lpwstrHelpWindowClass =
szMS_TCARDHELP;
00473 uCommand &= ~HELP_TCARD;
00474 dwType =
TYPE_TCARD;
00475 }
else {
00476
if( (uCommand == HELP_CONTEXTMENU) || (uCommand == HELP_CONTEXTPOPUP) ||
00477 (uCommand == HELP_SETPOPUP_POS) || (uCommand == HELP_WM_HELP)) {
00478
00479
00480
00481
00482
00483
if (pwnd ==
NULL) {
00484 RIPERR1(ERROR_INVALID_PARAMETER,
00485 RIP_WARNING,
00486
"WinHelpA: NULL hWnd invalid for this type of help command (0x%X)",
00487 uCommand);
00488
00489 bResult =
FALSE;
00490
goto Exit_WinHelp;
00491 }
00492 dwType =
TYPE_POPUP;
00493 lpwstrHelpWindowClass =
szMS_POPUPHELP;
00494 }
else {
00495 dwType =
TYPE_NORMAL;
00496 lpwstrHelpWindowClass =
szMS_WINHELP;
00497 }
00498 }
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
if (
gpsi->bLastRITWasKeyboard) {
00509 HWND hWndFocus =
GetFocus();
00510 RECT rcWindow;
00511
00512
if (
GetWindowRect(hWndFocus, &rcWindow)) {
00513 ptCur.x = (rcWindow.left + rcWindow.right)/2;
00514 ptCur.y = (rcWindow.top + rcWindow.bottom)/2;
00515 }
else {
00516
goto getCursorPos;
00517 }
00518 }
else {
00519 getCursorPos:
00520
GetCursorPos(&ptCur);
00521 }
00522
00523
00524
00525
00526
00527
if (uCommand == HELP_CONTEXTMENU &&
FIsParentDude(pwnd)) {
00528 LONG lPt;
00529
int nHit;
00530
DLGENUMDATA DlgEnumData;
00531
00532
00533
00534
00535
00536
00537
00538 lPt = MAKELONG(ptCur.x,ptCur.y);
00539 nHit =
FindNCHit(pwnd, lPt);
00540
if ((nHit == HTCAPTION) || (nHit == HTSYSMENU))
00541
DefWindowProc(hwnd, WM_CONTEXTMENU, (WPARAM)hwnd, lPt);
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561 DlgEnumData.
pwndDialog = pwnd;
00562 DlgEnumData.
pwndControl =
NULL;
00563 DlgEnumData.
ptCurHelp = ptCur;
00564
EnumChildWindows(hwnd, (WNDENUMPROC)
EnumHwndDlgChildProc, (LPARAM)&DlgEnumData);
00565
if (DlgEnumData.pwndControl ==
NULL) {
00566
00567
00568
00569
goto Exit_WinHelp;
00570 }
else {
00571
00572
00573
00574
00575 pwndMain = DlgEnumData.pwndControl;
00576 }
00577 }
else {
00578
00579
00580
00581
00582 pwndMain = pwnd;
00583 }
00584
00585
00586
00587
00588
00589
00590
if (uCommand == HELP_CONTEXTMENU || uCommand == HELP_WM_HELP) {
00591
int id;
00592
int i;
00593 LPDWORD pid;
00594
00595
00596
00597
00598
00599
00600
00601
id = (
DWORD)(
PTR_TO_ID(pwndMain->
spmenu));
00602 pid = (LPDWORD) dwData;
00603
00604
00605
00606
00607
if ((
SHORT)
id == -1)
00608 {
00609
00610
00611
00612
PWND pwndCtrl;
00613
int cAttempts = 0;
00614
00615
00616
00617
00618
00619
00620
if ((
TestWF(pwndMain,
BFTYPEMASK) == BS_GROUPBOX) &&
00621 (
GETFNID(pwndMain) ==
FNID_BUTTON)) {
00622
goto Exit_WinHelp;
00623 }
00624
00625
00626
00627
00628
00629
00630
00631
do {
00632 pwndCtrl =
GetNextDlgHelpItem(
REBASEPWND(pwndMain,spwndParent), pwndMain );
00633
00634
00635
00636
00637
00638
if (!pwndCtrl) {
00639
00640
00641
00642 bResult =
FALSE;
00643
goto Exit_WinHelp;
00644 }
00645
00646
00647
00648
00649
00650
00651
id = (
DWORD)(
PTR_TO_ID(pwndCtrl->
spmenu));
00652
00653 }
while (((
SHORT)
id == -1) && (++cAttempts <
MAX_ATTEMPTS));
00654 }
00655
00656
if ((
SHORT)
id == -1) {
00657
id = -1;
00658 }
00659
00660
00661
00662
00663
for (i = 0; pid[i]; i += 2) {
00664
if ((
int) pid[i] ==
id)
00665
break;
00666 }
00667
00668
00669
00670
00671
00672
if (!pid[i]) {
00673
00674
00675
00676
00677 lpszHelp =
szDefaultHelpFileA;
00678
00679
switch (
id) {
00680
case IDOK:
00681 dwData = IDH_OK;
00682
break;
00683
00684
case IDCANCEL:
00685 dwData = IDH_CANCEL;
00686
break;
00687
00688
case IDHELP:
00689 dwData = IDH_HELP;
00690
break;
00691
00692
default:
00693
00694
00695
00696
00697 dwData = IDH_MISSING_CONTEXT;
00698 }
00699 }
else {
00700 dwData = pid[i + 1];
00701
if (dwData == (
DWORD)-1) {
00702
00703
00704
00705
goto Exit_WinHelp;
00706 }
00707 }
00708
00709
00710
00711
00712
00713
if (uCommand == HELP_CONTEXTMENU)
00714 {
00715
int cmd;
00716
00717
00718
00719
00720 cmd =
HelpMenu(
HW(pwndMain), &ptCur);
00721
if (cmd <= 0)
00722
goto Exit_WinHelp;
00723 }
00724
00725
00726
00727
00728
if (!(lpHlp =
HFill(lpszHelp, HELP_SETPOPUP_POS,
00729 MAKELONG(pwndMain->
rcWindow.left, pwndMain->
rcWindow.top)))) {
00730
00731
00732
00733 bResult =
FALSE;
00734
goto Exit_WinHelp;
00735 }
00736
00737
00738
00739
00740
00741
00742 hwndHelp =
FindWinHelpWindow( lpwstrHelpWindowClass, dwType,
TRUE);
00743
if (hwndHelp ==
NULL ) {
00744
00745
00746
00747
00748 bResult =
FALSE;
00749
goto Exit_WinHelp;
00750 }
00751
00752
00753
00754
00755 lResult =
SendWinHelpMessage(hwndHelp, (WPARAM)
HW(pwndMain), (LPARAM)lpHlp);
00756 LocalFree(lpHlp);
00757 lpHlp =
NULL;
00758
00759
00760
00761
if (!lResult)
00762 {
00763
00764
00765
00766 bResult =
FALSE;
00767
goto Exit_WinHelp;
00768 }
00769
00770
00771
00772
00773 uCommand = HELP_CONTEXTPOPUP;
00774 }
00775
00776
00777
if (uCommand == HELP_CONTEXTPOPUP ) {
00778
00779
00780
00781
00782
if (lpszHelp ==
NULL || *lpszHelp ==
'\0')
00783 lpszHelp =
szDefaultHelpFileA;
00784
00785
00786
00787
00788
00789
00790
00791 pwndTop =
GetTopLevelWindow(pwndMain);
00792 }
else {
00793 pwndTop = pwndMain;
00794 }
00795
00796
00797
00798
00799
00800
if (!(lpHlp =
HFill(lpszHelp, uCommand, dwData))) {
00801
00802
00803
00804 bResult =
FALSE;
00805
goto Exit_WinHelp;
00806 }
00807
00808
00809
00810
00811 hwndHelp =
FindWinHelpWindow( lpwstrHelpWindowClass, dwType, (uCommand != HELP_QUIT));
00812
if (hwndHelp ==
NULL) {
00813
if (uCommand != HELP_QUIT)
00814
00815
00816
00817 bResult =
FALSE;
00818
goto Exit_WinHelp;
00819 }
00820
00821
00822
00823
00824
00825
00826
SendWinHelpMessage(hwndHelp, (WPARAM)
HW(pwndTop), (LPARAM)lpHlp);
00827
00828
00829
00830
00831 Exit_WinHelp:
00832
if (lpHlp !=
NULL) {
00833 LocalFree(lpHlp);
00834 }
00835
00836
return bResult;
00837 }
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
#if 0
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
BOOL WinHelpA(
00897 HWND hwndMain,
00898 LPCSTR lpszHelp,
00899 UINT uCommand,
00900 ULONG_PTR dwData)
00901 {
00902 LPHLP lpHlp;
00903
BOOL fSuccess;
00904
DWORD dwType;
00905 HWND hwndHelp;
00906 LPWSTR lpwstr;
00907
PWND pwndMain;
00908
00909 pwndMain =
ValidateHwnd(hwndMain);
00910
00911
if ((uCommand == HELP_CONTEXTMENU) || (uCommand == HELP_CONTEXTPOPUP) ||
00912 (uCommand == HELP_SETPOPUP_POS) || (uCommand == HELP_WM_HELP)) {
00913 dwType =
TYPE_POPUP;
00914 }
else {
00915 dwType =
TYPE_NORMAL;
00916 }
00917
00918
switch (uCommand) {
00919
00920
case HELP_WM_HELP:
00921 {
00922
#if 0
00923
00924
00925
if (!
WinHelpA(hwndMain, lpszHelp, HELP_SETPOPUP_POS,
00926 MAKELONG(pwndMain->
rcWindow.left, pwndMain->
rcWindow.top)))
00927
return FALSE;
00928
00929
00930
00931
00932
00933
#endif
00934
00935
goto MapIdToHelp;
00936
00937 }
00938
break;
00939
00940
case HELP_CONTEXTMENU:
00941 {
00942
int cmd;
00943
int id;
00944
int i;
00945 POINT ptCur;
00946 LPDWORD pid;
00947
00948
GetCursorPos(&ptCur);
00949
00950
if (pwndMain !=
NULL && pwndMain->fnid ==
FNID_DIALOG) {
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966 pwndMain =
REBASEPWND(pwndMain, spwndChild);
00967
00968
while (pwndMain !=
NULL
00969 &&
PtInRect(&(pwndMain->
rcWindow), ptCur)) {
00970 pwndMain =
REBASEPWND(pwndMain, spwndNext);
00971 }
00972
00973
if (pwndMain ==
NULL)
00974
return FALSE;
00975 }
00976
00977 cmd =
HelpMenu(hwndMain, &ptCur);
00978
00979
if (cmd <= 0) {
00980
return(
FALSE);
00981
00982 }
else if (cmd == HELP_INDEX) {
00983
00984 uCommand = HELP_FINDER;
00985 }
else {
00986 MapIdToHelp:
00987 UserAssert(pwndMain);
00988
00989
00990
00991
if (!
WinHelpA(hwndMain, lpszHelp, HELP_SETPOPUP_POS,
00992 MAKELONG(pwndMain->
rcWindow.left, pwndMain->
rcWindow.top)))
00993
return FALSE;
00994
id = LOWORD(pwndMain->
spmenu);
00995
00996 pid = (LPDWORD) dwData;
00997
00998
if (
id == -1) {
00999
01000
PWND pwndCtrl;
01001
int cAttempts = 0;
01002
01003
01004
01005
01006
01007
do {
01008 pwndCtrl =
_GetNextDlgTabItem(
REBASEPWND(pwndMain, spwndParent),
01009 pwndMain, FALSE);
01010
01011
01012
01013
01014
if (!pwndCtrl) {
01015
return(
FALSE);
01016 }
01017
01018
01019
01020
id = LOWORD(pwndCtrl->
spmenu);
01021 }
01022
while ((
id == -1) && (++cAttempts <
MAX_ATTEMPTS));
01023 }
01024
01025
01026
01027
for (i = 0; pid[i]; i += 2) {
01028
if ((
int) pid[i] ==
id)
01029
break;
01030 }
01031
01032
if (!pid[i]) {
01033
01034
01035 lpszHelp =
szDefaultHelpFileA;
01036
01037
switch (
id) {
01038
case IDOK:
01039 dwData = IDH_OK;
01040
break;
01041
01042
case IDCANCEL:
01043 dwData = IDH_CANCEL;
01044
break;
01045
01046
case IDHELP:
01047 dwData = IDH_HELP;
01048
break;
01049
01050
default:
01051 dwData = IDH_MISSING_CONTEXT;
01052 }
01053 }
else {
01054 dwData = pid[i + 1];
01055
if (dwData == (
DWORD) -1) {
01056
return TRUE;
01057 }
01058 }
01059
01060 uCommand = HELP_CONTEXTPOPUP;
01061 }
01062
01063
01064
01065
if (lpszHelp ==
NULL || *lpszHelp ==
'\0')
01066 lpszHelp =
szDefaultHelpFileA;
01067 }
01068 }
01069
01070
01071
01072
01073
if (!(lpHlp =
HFill(lpszHelp, uCommand, dwData)))
01074
return FALSE;
01075
01076
01077
01078
01079 fSuccess =
TRUE;
01080
if (dwType ==
TYPE_POPUP)
01081 lpwstr =
szMS_POPUPHELP;
01082
else
01083 lpwstr =
szMS_WINHELP;
01084
01085
if ((hwndHelp =
FindWindowEx(NULL, NULL, lpwstr, NULL)) ==
NULL) {
01086
if (uCommand == HELP_QUIT)
01087 fSuccess =
TRUE;
01088
01089
01090
01091
01092
if (!
LaunchHelp(dwType) ||
01093 (hwndHelp =
FindWindowEx(NULL, NULL, lpwstr, NULL)) ==
NULL)
01094 fSuccess =
FALSE;
01095 }
01096
01097
if (hwndHelp !=
NULL)
01098
SendMessage(hwndHelp, WM_WINHELP, (DWORD)hwndMain, (LONG)lpHlp);
01099
01100 LocalFree(lpHlp);
01101
01102
return fSuccess;
01103 }
01104
#endif
01105
01106
01107
01108
01109
01110
01111
01112
01113
01114
01115
01116 BOOL WinHelpW(
01117 HWND hwndMain,
01118 LPCWSTR lpwszHelp,
01119 UINT uCommand,
01120 ULONG_PTR dwData)
01121 {
01122
BOOL fSuccess =
FALSE;
01123 LPSTR lpAnsiHelp =
NULL;
01124 LPSTR lpAnsiKey =
NULL;
01125 PMULTIKEYHELPA pmkh =
NULL;
01126 PHELPWININFOA phwi =
NULL;
01127
NTSTATUS Status;
01128
01129
01130
01131
01132
01133
if (lpwszHelp !=
NULL &&
01134 !WCSToMB(lpwszHelp, -1, &lpAnsiHelp, -1,
TRUE)) {
01135
return FALSE;
01136 }
01137
01138
01139
01140
01141
switch (uCommand) {
01142
case HELP_MULTIKEY:
01143
if (!WCSToMB(((PMULTIKEYHELPW)dwData)->szKeyphrase, -1, &lpAnsiKey,
01144 -1,
TRUE)) {
01145
goto FreeAnsiHelp;
01146 }
01147
01148 pmkh = (PMULTIKEYHELPA)LocalAlloc(LPTR,
01149
sizeof(MULTIKEYHELPA) +
strlen(lpAnsiKey));
01150
if (pmkh ==
NULL) {
01151
goto FreeAnsiKeyAndHelp;
01152 }
01153
01154 pmkh->mkSize =
sizeof(MULTIKEYHELPA) +
strlen(lpAnsiKey);
01155
Status =
RtlUnicodeToMultiByteN((LPSTR)&pmkh->mkKeylist,
sizeof(
CHAR),
01156
NULL, (LPWSTR)&((PMULTIKEYHELPW)dwData)->mkKeylist,
01157
sizeof(WCHAR));
01158 strcpy(pmkh->szKeyphrase, lpAnsiKey);
01159
if (!
NT_SUCCESS(
Status)) {
01160
goto FreeAnsiKeyAndHelp;
01161 }
01162
01163 dwData = (ULONG_PTR)pmkh;
01164
break;
01165
01166
case HELP_SETWINPOS:
01167
if (!WCSToMB(((PHELPWININFOW)dwData)->rgchMember, -1, &lpAnsiKey,
01168 -1,
TRUE)) {
01169
goto FreeAnsiKeyAndHelp;
01170 }
01171
01172 phwi = (PHELPWININFOA)LocalAlloc(LPTR, ((PHELPWININFOW)dwData)->wStructSize);
01173
if (phwi ==
NULL) {
01174
goto FreeAnsiKeyAndHelp;
01175 }
01176
01177 *phwi = *((PHELPWININFOA)dwData);
01178 strcpy(phwi->rgchMember, lpAnsiKey);
01179 dwData = (ULONG_PTR)phwi;
01180
break;
01181
01182
case HELP_KEY:
01183
case HELP_PARTIALKEY:
01184
case HELP_COMMAND:
01185
if (!WCSToMB((LPCTSTR)dwData, -1, &lpAnsiKey, -1,
TRUE)) {
01186
goto FreeAnsiKeyAndHelp;
01187 }
01188
01189 dwData = (ULONG_PTR)lpAnsiKey;
01190
break;
01191 }
01192
01193
01194
01195
01196 fSuccess =
WinHelpA(hwndMain, lpAnsiHelp, uCommand, dwData);
01197
01198
if (pmkh) {
01199 LocalFree(pmkh);
01200 }
01201
01202
if (phwi) {
01203 LocalFree(phwi);
01204 }
01205
01206 FreeAnsiKeyAndHelp:
01207
if (lpAnsiKey) {
01208 LocalFree(lpAnsiKey);
01209 }
01210
01211
01212 FreeAnsiHelp:
01213
if (lpAnsiHelp)
01214 LocalFree(lpAnsiHelp);
01215
01216
return fSuccess;
01217 }