source: trunk/dll/viewinf.c@ 1877

Last change on this file since 1877 was 1877, checked in by Gregg Young, 10 years ago

Remove debug code

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.9 KB
Line 
1
2/***********************************************************************
3
4 $Id: viewinf.c 1877 2015-10-11 21:43:27Z gyoung $
5
6 Launch inf viewer
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2004, 2010 Steven H.Levine
10
11 01 Aug 04 SHL Rework lstrip/rstrip usage
12 17 Jul 06 SHL Use Runtime_Error
13 03 Nov 06 SHL Renames
14 03 Nov 06 SHL Count thread usage
15 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
16 19 Jul 08 GKY Replace save_dir2(dir) with pFM2SaveDirectory and use BldFullPathName
17 10 Dec 08 SHL Integrate exception handler support
18 11 Jan 09 GKY Replace font names in the string file with global set at compile in init.c
19 07 Feb 09 GKY Eliminate Win_Error2 by moving function names to PCSZs used in Win_Error
20 07 Feb 09 GKY Allow user to turn off alert and/or error beeps in settings notebook.
21 08 Mar 09 GKY Additional strings move to PCSZs in init.c
22 28 Jun 09 GKY Added AddBackslashToPath() to remove repeatative code.
23 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
24 12 Nov 11 GKY Fixed HelpViewer's failure to open help files and subsequent failure with files with spaces.
25
26***********************************************************************/
27
28#include <stdlib.h>
29#include <string.h>
30#include <share.h>
31
32#define INCL_DOS
33#define INCL_WIN
34#define INCL_LONGLONG
35
36#include "fm3dll.h"
37#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
38#include "notebook.h" // Data declaration(s)
39#include "init.h" // Data declaration(s)
40#include "mainwnd.h" // Data declaration(s)
41#include "fm3dlg.h"
42#include "fm3str.h"
43#include "errutil.h" // Dos_Error...
44#include "strutil.h" // GetPString
45#include "pathutil.h" // BldFullPathName
46#include "common.h" // DecrThreadUsage, IncrThreadUsage
47#include "viewinf.h"
48#include "misc.h" // ViewHelp
49#include "strips.h" // bstrip
50#include "systemf.h" // runemf2
51#include "dirs.h" // save_dir2
52#include "wrappers.h" // xfopen
53#include "fortify.h"
54#include "excputil.h" // xbeginthread
55
56#pragma data_seg(DATA1)
57
58static PSZ pszSrcFile = __FILE__;
59
60typedef struct
61{
62 USHORT size;
63 USHORT help;
64 HWND hwnd;
65}
66DUMMY;
67
68static VOID FillListboxThread(VOID * args)
69{
70 HWND hwnd;
71 DUMMY *dummy = (DUMMY *) args;
72 HAB hab2;
73 HMQ hmq2;
74 BOOL repeating = FALSE;
75
76 if (!dummy)
77 return;
78# ifdef FORTIFY
79 Fortify_EnterScope();
80# endif
81 hwnd = dummy->hwnd;
82 hab2 = WinInitialize(0);
83 if (hab2) {
84 hmq2 = WinCreateMsgQueue(hab2, 0);
85 if (hmq2) {
86
87 CHAR *env, *p, *holdenv;
88
89 WinCancelShutdown(hmq2, TRUE);
90 IncrThreadUsage();
91 priority_normal();
92 if (!dummy->help)
93 env = getenv("BOOKSHELF");
94 else
95 env = getenv("HELP");
96 if (!env) {
97 saymsg(MB_CANCEL,
98 hwnd,
99 GetPString(IDS_SYSERRORTEXT),
100 GetPString(IDS_ENVPATHERRORTEXT),
101 (dummy->help) ? "HELP" : "BOOKSHELF",
102 (dummy->help) ? PCSZ_DOTHLP : PCSZ_DOTINF);
103 goto NoEnv;
104 }
105 else {
106 holdenv = xmalloc(strlen(env) + 2, pszSrcFile, __LINE__);
107 if (holdenv) {
108 strcpy(holdenv, env);
109 Repeat:
110 if (holdenv[strlen(holdenv) - 1] != ';')
111 strcat(holdenv, ";");
112 p = strtok(holdenv, ";");
113 while (p) {
114 bstrip(p);
115 if (*p) {
116
117 CHAR mask[CCHMAXPATH], *enddir, text[CCHMAXPATH * 2];
118 FILEFINDBUF3 ffb;
119 HDIR hdir;
120 ULONG nm;
121
122 strcpy(mask, p);
123 AddBackslashToPath(mask);
124 //if (mask[strlen(mask) - 1] != '\\')
125 // strcat(mask, "\\");
126 enddir = mask + strlen(mask);
127 if (dummy->help)
128 strcat(mask, "*.HLP");
129 else
130 strcat(mask, "*.INF");
131 hdir = HDIR_CREATE;
132 nm = 1;
133 DosError(FERR_DISABLEHARDERR);
134 if (!DosFindFirst(mask, &hdir, FILE_NORMAL | FILE_ARCHIVED,
135 &ffb, sizeof(ffb), &nm, FIL_STANDARD)) {
136 do {
137 priority_normal();
138 strcpy(enddir, ffb.achName);
139 {
140 FILE *fp;
141 CHAR title[CCHMAXPATH];
142 CHAR *moderb = "rb";
143
144 *title = 0;
145 fp = xfsopen(mask, moderb, SH_DENYNO, pszSrcFile, __LINE__, TRUE);
146 if (fp) {
147 fread(title, 1, 3, fp);
148 if (*title != 'H' || title[1] != 'S' || title[2] != 'P') {
149 fclose(fp);
150 goto Continue;
151 }
152 *title = 0;
153 fseek(fp, 107, SEEK_SET);
154 fread(title, 1, CCHMAXPATH - 2, fp);
155 title[CCHMAXPATH - 3] = 0;
156 bstrip(title);
157 fclose(fp);
158 }
159 p = strchr(ffb.achName, '.');
160 if (p)
161 *p = 0;
162 sprintf(text,
163 "%-10.10s %-42.42s > %s",
164 ffb.achName, title, mask);
165 }
166 if (!WinIsWindow(hab2, hwnd))
167 break;
168 WinSendDlgItemMsg(hwnd,
169 VINF_LISTBOX,
170 LM_INSERTITEM,
171 MPFROM2SHORT(LIT_SORTASCENDING, 0),
172 MPFROMP(text));
173 Continue:
174 nm = 1;
175 } while (!DosFindNext(hdir, &ffb, sizeof(ffb), &nm));
176 DosFindClose(hdir);
177 priority_normal();
178 }
179 }
180 if (!WinIsWindow(hab2, hwnd))
181 break;
182 p = strtok(NULL, ";");
183 }
184 free(holdenv);
185 NoEnv:
186 if (WinIsWindow(hab2, hwnd) && !repeating) {
187
188 ULONG size;
189 CHAR *key = "INFPaths";
190
191 if (dummy->help)
192 key = "HLPPaths";
193 repeating = TRUE;
194 if (PrfQueryProfileSize(fmprof, FM3Str, key, &size) && size) {
195 holdenv = xmalloc(size + 2, pszSrcFile, __LINE__);
196 if (holdenv) {
197 if (!PrfQueryProfileData(fmprof, FM3Str, key, holdenv, &size)) {
198 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
199 PCSZ_PRFQUERYPROFILEDATA);
200 free(holdenv);
201 }
202 else
203 goto Repeat;
204 }
205 }
206 }
207 }
208 }
209 WinDestroyMsgQueue(hmq2);
210 }
211 PostMsg(hwnd, UM_CONTAINER_FILLED, MPVOID, MPVOID);
212 DecrThreadUsage();
213 WinTerminate(hab2);
214 }
215 free(dummy);
216# ifdef FORTIFY
217 Fortify_LeaveScope();
218# endif
219}
220
221MRESULT EXPENTRY ViewInfProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
222{
223 static HWND hwndMe = (HWND) 0;
224 static BOOL help = FALSE;
225 static BOOL threaddone = TRUE;
226 static LONG ypos = 0;
227 static HPOINTER hptrIcon = (HPOINTER) 0;
228
229 switch (msg) {
230 case WM_INITDLG:
231 WinSendDlgItemMsg(hwnd, VINF_ENTRY, EM_SETTEXTLIMIT,
232 MPFROM2SHORT(1000, 0), MPVOID);
233 WinSendDlgItemMsg(hwnd, VINF_TOPIC, EM_SETTEXTLIMIT,
234 MPFROM2SHORT(CCHMAXPATH * 2, 0), MPVOID);
235 if (hwndMe) {
236 WinSetWindowPos(hwndMe, HWND_TOP, 0, 0, 0, 0, SWP_RESTORE | SWP_ZORDER |
237 SWP_ACTIVATE);
238 WinDismissDlg(hwnd, 0);
239 break;
240 }
241 help = (mp2 != (MPARAM) 0);
242 if (help) {
243
244 SWP swp;
245
246 WinQueryWindowPos(WinWindowFromID(hwnd, VINF_LISTBOX), &swp);
247 WinDestroyWindow(WinWindowFromID(hwnd, VINF_LISTBOX));
248 if (!WinCreateWindow(hwnd,
249 WC_LISTBOX,
250 (PSZ) NULL,
251 WS_VISIBLE | LS_HORZSCROLL,
252 swp.x,
253 swp.y,
254 swp.cx,
255 swp.cy,
256 hwnd, HWND_TOP, VINF_LISTBOX, NULL, NULL)) {
257 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
258 PCSZ_WINCREATEWINDOW);
259 }
260 else {
261 //fixme to allow user to change presparams 1-10-09 GKY
262 WinSetPresParam(WinWindowFromID(hwnd, VINF_LISTBOX),
263 PP_FONTNAMESIZE,
264 strlen(FNT_10SYSTEMMONOTEXT) + 1,
265 (PVOID) FNT_10SYSTEMMONOTEXT);
266 }
267 WinSetWindowText(hwnd, (CHAR *) GetPString(IDS_VIEWHELPFILESTEXT));
268 WinShowWindow(WinWindowFromID(hwnd, VINF_SRCH), FALSE);
269 WinShowWindow(WinWindowFromID(hwnd, VINF_FILTER), FALSE);
270 WinShowWindow(WinWindowFromID(hwnd, VINF_TOPIC), FALSE);
271 WinShowWindow(WinWindowFromID(hwnd, VINF_TOPICHDR), FALSE);
272 }
273 hptrIcon = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, VINF_FRAME);
274 WinDefDlgProc(hwnd, WM_SETICON, MPFROMLONG(hptrIcon), MPVOID);
275 hwndMe = hwnd;
276 PostMsg(hwnd, UM_STRETCH, MPVOID, MPVOID);
277 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
278 break;
279
280 case UM_RESCAN:
281 WinSendDlgItemMsg(hwnd, VINF_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
282 {
283 DUMMY *d;
284
285 d = xmallocz(sizeof(DUMMY), pszSrcFile, __LINE__);
286 if (!d) {
287 WinDismissDlg(hwnd, 0);
288 return 0;
289 }
290 else {
291 d->size = sizeof(DUMMY);
292 d->hwnd = hwnd;
293 if (help)
294 d->help = 1;
295 if (xbeginthread(FillListboxThread,
296 65536,
297 d,
298 pszSrcFile,
299 __LINE__) == -1)
300 {
301 free(d);
302 WinDismissDlg(hwnd, 0);
303 return 0;
304 }
305 WinEnableWindow(WinWindowFromID(hwnd, DID_CANCEL), FALSE);
306 threaddone = FALSE;
307 }
308 }
309 return 0;
310
311 case UM_CONTAINER_FILLED:
312 if (!(SHORT) WinSendDlgItemMsg(hwnd,
313 VINF_LISTBOX,
314 LM_QUERYITEMCOUNT, MPVOID, MPVOID)) {
315 saymsg(MB_CANCEL,
316 hwnd,
317 GetPString(IDS_ERRORTEXT), GetPString(IDS_NOFILESFOUNDTEXT));
318 hwndMe = (HWND) 0;
319 WinDismissDlg(hwnd, 0);
320 }
321 WinEnableWindow(WinWindowFromID(hwnd, DID_CANCEL), TRUE);
322 threaddone = TRUE;
323 return 0;
324
325 case WM_CONTROL:
326 switch (SHORT1FROMMP(mp1)) {
327 case VINF_LISTBOX:
328 switch (SHORT2FROMMP(mp1)) {
329 case LN_ENTER:
330 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
331 break;
332 }
333 break;
334 case VINF_ENTRY:
335 switch (SHORT2FROMMP(mp1)) {
336 case EN_CHANGE:
337 {
338 SHORT sSelect;
339 CHAR szBuffer[CCHMAXPATH];
340
341 WinQueryDlgItemText(hwnd, VINF_ENTRY, CCHMAXPATH, szBuffer);
342 bstrip(szBuffer);
343 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
344 VINF_LISTBOX,
345 LM_SEARCHSTRING,
346 MPFROM2SHORT(LSS_SUBSTRING,
347 LIT_FIRST),
348 MPFROMP(szBuffer));
349 if (sSelect >= 0)
350 WinSendDlgItemMsg(hwnd,
351 VINF_LISTBOX,
352 LM_SETTOPINDEX,
353 MPFROM2SHORT(sSelect, 0), MPVOID);
354 }
355 break;
356 }
357 break;
358 }
359 return 0;
360
361 case WM_ADJUSTWINDOWPOS:
362 PostMsg(hwnd, UM_STRETCH, MPVOID, MPVOID);
363 break;
364
365 case UM_STRETCH:
366 {
367 SWP swpC, swp;
368
369 WinQueryWindowPos(hwnd, &swp);
370 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE))) {
371 WinQueryWindowPos(WinWindowFromID(hwnd, VINF_LISTBOX), &swpC);
372 if (!ypos)
373 ypos = swpC.y;
374 WinSetWindowPos(WinWindowFromID(hwnd, VINF_LISTBOX), HWND_TOP,
375 SysVal(SV_CXSIZEBORDER),
376 ypos,
377 swp.cx - (SysVal(SV_CXSIZEBORDER) * 2),
378 (swp.cy - ypos) - (SysVal(SV_CYTITLEBAR) +
379 SysVal(SV_CYSIZEBORDER)),
380 SWP_MOVE | SWP_SIZE);
381 }
382 }
383 return 0;
384
385 case WM_COMMAND:
386 switch (SHORT1FROMMP(mp1)) {
387 case VINF_RESCAN:
388 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
389 break;
390
391 case VINF_SRCH:
392 {
393 SHORT sSelect, sLast = LIT_FIRST;
394 CHAR szBuffer[CCHMAXPATH];
395
396 *szBuffer = 0;
397 WinQueryDlgItemText(hwnd, VINF_ENTRY, CCHMAXPATH, szBuffer);
398 rstrip(szBuffer);
399 if (!*szBuffer) {
400 sLast = (SHORT) WinSendDlgItemMsg(hwnd,
401 VINF_LISTBOX,
402 LM_QUERYITEMCOUNT,
403 MPVOID, MPVOID);
404 for (sSelect = 0; sSelect < sLast; sSelect++)
405 WinSendDlgItemMsg(hwnd,
406 VINF_LISTBOX,
407 LM_SELECTITEM,
408 MPFROM2SHORT(sSelect, 0),
409 MPFROM2SHORT(FALSE, 0));
410 break;
411 }
412 for (;;) {
413 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, VINF_LISTBOX,
414 LM_SEARCHSTRING,
415 MPFROM2SHORT(LSS_SUBSTRING,
416 sLast),
417 MPFROMP(szBuffer));
418 if (sSelect <= sLast)
419 break;
420 if (sSelect >= 0)
421 WinSendDlgItemMsg(hwnd,
422 VINF_LISTBOX,
423 LM_SELECTITEM,
424 MPFROM2SHORT(sSelect, 0),
425 MPFROM2SHORT(TRUE, 0));
426 else
427 break;
428 sLast = sSelect;
429 }
430 }
431 break;
432
433 case VINF_FILTER:
434 {
435 SHORT sSelect, sTotal;
436
437 sTotal = (SHORT) WinSendDlgItemMsg(hwnd,
438 VINF_LISTBOX,
439 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
440 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
441 VINF_LISTBOX,
442 LM_QUERYSELECTION,
443 MPFROM2SHORT(LIT_FIRST, 0),
444 MPVOID);
445 if (sSelect == LIT_NONE) {
446 if (!fAlertBeepOff)
447 DosBeep(50, 100);
448 break;
449 }
450#ifdef BUGFIXED
451 sSelect = 0;
452 while (sSelect < sTotal) {
453 if (!WinSendDlgItemMsg(hwnd,
454 VINF_LISTBOX,
455 LM_SELECTITEM,
456 MPFROM2SHORT(sSelect, 0),
457 MPFROM2SHORT(FALSE, 0))) {
458 WinSendDlgItemMsg(hwnd,
459 VINF_LISTBOX,
460 LM_DELETEITEM,
461 MPFROM2SHORT(sSelect, 0), MPVOID);
462 sTotal--;
463 }
464 else
465 sSelect++;
466 }
467#else // !BUGIFIXED
468 for (sSelect = 0; sSelect < sTotal; sSelect++)
469 WinSendDlgItemMsg(hwnd,
470 VINF_LISTBOX,
471 LM_SETITEMHANDLE,
472 MPFROM2SHORT(sSelect, 0), MPVOID);
473 sSelect = LIT_FIRST;
474 for (;;) {
475 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
476 VINF_LISTBOX,
477 LM_QUERYSELECTION,
478 MPFROM2SHORT(sSelect, 0),
479 MPVOID);
480 if (sSelect >= 0)
481 WinSendDlgItemMsg(hwnd,
482 VINF_LISTBOX,
483 LM_SETITEMHANDLE,
484 MPFROM2SHORT(sSelect, 0), MPFROMLONG(1));
485 else
486 break;
487 }
488 for (sSelect = 0; sSelect < sTotal; sSelect++)
489 WinSendDlgItemMsg(hwnd,
490 VINF_LISTBOX,
491 LM_SELECTITEM,
492 MPFROM2SHORT(sSelect, 0), MPFROM2SHORT(FALSE, 0));
493 sSelect = 0;
494 while (sSelect < sTotal) {
495 if (!WinSendDlgItemMsg(hwnd,
496 VINF_LISTBOX,
497 LM_QUERYITEMHANDLE,
498 MPFROM2SHORT(sSelect, 0), MPVOID)) {
499 WinSendDlgItemMsg(hwnd,
500 VINF_LISTBOX,
501 LM_DELETEITEM,
502 MPFROM2SHORT(sSelect, 0), MPVOID);
503 sTotal--;
504 }
505 else
506 sSelect++;
507 }
508#endif // BUGFIXED
509 }
510 break;
511
512 case VINF_DIRS:
513 {
514 CHAR szBuffer[1001], *key = "INFPaths";
515
516 if (help)
517 key = "HLPPaths";
518 *szBuffer = 0;
519 WinQueryDlgItemText(hwnd, VINF_ENTRY, 1000, szBuffer);
520 bstrip(szBuffer);
521 PrfWriteProfileData(fmprof,
522 FM3Str,
523 key,
524 (*szBuffer) ? szBuffer : NULL, strlen(szBuffer));
525 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
526 }
527 break;
528
529 case DID_CANCEL:
530 hwndMe = (HWND) 0;
531 WinDismissDlg(hwnd, 0);
532 break;
533
534 case DID_OK:
535 {
536 SHORT sSelect;
537 CHAR text[CCHMAXPATH * 2], filename[CCHMAXPATH], *p;
538 FILE *fp;
539 BOOL notfirst = FALSE;
540 CHAR *modew = "w";
541
542 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
543 VINF_LISTBOX,
544 LM_QUERYSELECTION,
545 MPFROM2SHORT(LIT_FIRST, 0),
546 MPVOID);
547 if (sSelect < 0) {
548 if (!fAlertBeepOff)
549 DosBeep(50, 100);
550 }
551 else {
552 if (help) {
553 *text = 0;
554 WinSendDlgItemMsg(hwnd,
555 VINF_LISTBOX,
556 LM_QUERYITEMTEXT,
557 MPFROM2SHORT(sSelect, CCHMAXPATH),
558 MPFROMP(text));
559 p = strchr(text, '>');
560 if (!p) {
561 if (!fAlertBeepOff)
562 DosBeep(50, 100);
563 break;
564 }
565 p++;
566 bstrip(p);
567 if (!*p) {
568 if (!fAlertBeepOff)
569 DosBeep(50, 100);
570 }
571 else {
572 ViewHelp(p);
573 }
574 break;
575 }
576 BldFullPathName(filename, pFM2SaveDirectory, "FM2VINF.CMD");
577 fp = xfopen(filename, modew, pszSrcFile, __LINE__, FALSE);
578 if (fp) {
579 fprintf(fp, "@ECHO OFF\nSET FM2REF=");
580 while (sSelect >= 0) {
581 *text = 0;
582 WinSendDlgItemMsg(hwnd,
583 VINF_LISTBOX,
584 LM_QUERYITEMTEXT,
585 MPFROM2SHORT(sSelect,
586 CCHMAXPATH), MPFROMP(text));
587 p = strchr(text, '>');
588 if (p) {
589 p++;
590 bstrip(p);
591 if (*p) {
592 if (notfirst)
593 fprintf(fp, "+");
594 notfirst = TRUE;
595 fprintf(fp, "%s", p);
596 }
597 }
598 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
599 VINF_LISTBOX,
600 LM_QUERYSELECTION,
601 MPFROM2SHORT(sSelect, 0),
602 MPVOID);
603 } // while
604 *text = 0;
605 WinQueryDlgItemText(hwnd, VINF_TOPIC, CCHMAXPATH * 2, text);
606 bstrip(text);
607 fprintf(fp,
608 "\nVIEW FM2REF%s%s\nDEL %s\n",
609 (*text) ? " " : NullStr, text, filename);
610 fclose(fp);
611 runemf2(SEPARATE | WINDOWED | MINIMIZED |
612 BACKGROUND | INVISIBLE,
613 hwnd, pszSrcFile, __LINE__,
614 NULL, NULL, "%s /C %s", GetCmdSpec(FALSE), filename);
615 }
616 }
617 }
618 break;
619
620 case IDM_HELP:
621 if (hwndHelp) {
622 if (help)
623 WinSendMsg(hwndHelp,
624 HM_DISPLAY_HELP,
625 MPFROM2SHORT(HELP_VIEWHELPS, 0),
626 MPFROMSHORT(HM_RESOURCEID));
627 else
628 WinSendMsg(hwndHelp,
629 HM_DISPLAY_HELP,
630 MPFROM2SHORT(HELP_VIEWINF, 0),
631 MPFROMSHORT(HM_RESOURCEID));
632 }
633 break;
634 }
635 return 0;
636
637 case WM_CLOSE:
638 if (!threaddone)
639 return 0;
640 break;
641
642 case WM_DESTROY:
643 if (hwndMe == hwnd) {
644 hwndMe = (HWND) 0;
645 if (hptrIcon)
646 WinDestroyPointer(hptrIcon);
647 hptrIcon = (HPOINTER) 0;
648 }
649 break;
650 }
651 return WinDefDlgProc(hwnd, msg, mp1, mp2);
652}
653
654#pragma alloc_text(VIEWINFS,FillListboxThread,ViewInfProc)
Note: See TracBrowser for help on using the repository browser.