source: trunk/dll/viewinf.c@ 1183

Last change on this file since 1183 was 1183, checked in by John Small, 17 years ago

Ticket 187: Draft 2: Move remaining function declarations

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