win32.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:19k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1996 The Regents of the University of California.
  3.  * All rights reserved.
  4.  * 
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *  This product includes software developed by the Network Research
  16.  *  Group at Lawrence Berkeley National Laboratory.
  17.  * 4. Neither the name of the University nor of the Laboratory may be used
  18.  *    to endorse or promote products derived from this software without
  19.  *    specific prior written permission.
  20.  * 
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * This module contributed by John Brezak <brezak@apollo.hp.com>.
  34.  * January 31, 1996
  35.  */
  36. #ifndef lint
  37. static char rcsid[] =
  38.     "@(#) $Header: /cvsroot/nsnam/nam-1/win32.c,v 1.2 1997/11/22 22:59:36 tecklee Exp $ (LBL)";
  39. #endif
  40. #include <assert.h>
  41. #include <io.h>
  42. #include <process.h>
  43. #include <fcntl.h>
  44. #include <windows.h>
  45. #include <malloc.h>
  46. #include <string.h>
  47. #include <stdio.h>
  48. #include <time.h>
  49. #include <winsock.h>
  50. #include <tk.h>
  51. #include <locale.h>
  52. /* forward declarations */
  53. int WinGetUserName(ClientData, Tcl_Interp*, int ac, char**av);
  54. int WinGetHostName(ClientData, Tcl_Interp*, int ac, char**av);
  55. int WinPutRegistry(ClientData, Tcl_Interp*, int ac, char**av);
  56. int WinGetRegistry(ClientData, Tcl_Interp*, int ac, char**av);
  57. int WinExit(ClientData, Tcl_Interp*, int ac, char**av);
  58. void TkConsoleCreate();
  59. int TkConsoleInit(Tcl_Interp* interp);
  60. #ifdef STATIC_TCLTK
  61. extern HINSTANCE Tk_GetHINSTANCE();
  62. extern BOOL APIENTRY Tk_LibMain(HINSTANCE hInstance,DWORD reason,LPVOID reserved);
  63. extern BOOL APIENTRY Tcl_LibMain(HINSTANCE hInstance,DWORD reason,LPVOID reserved);
  64. void static_exit(void){
  65. HINSTANCE hInstance = Tk_GetHINSTANCE();
  66. Tcl_LibMain(hInstance, DLL_PROCESS_DETACH, NULL);
  67. Tk_LibMain(hInstance, DLL_PROCESS_DETACH, NULL);
  68. #endif
  69. int strcasecmp(const char *s1, const char *s2)
  70. {
  71.     return stricmp(s1, s2);
  72. }
  73. extern void TkWinXInit(HINSTANCE hInstance);
  74. extern int main(int argc, const char *argv[]);
  75. #ifndef STATIC_TCLTK
  76. extern int __argc;
  77. extern char **__argv;
  78. #endif
  79. static char argv0[255]; /* Buffer used to hold argv0. */
  80. char *__progname = "nam";
  81. void
  82. ShowMessage(int level, char *msg)
  83. {
  84.     MessageBeep(level);
  85.     MessageBox(NULL, msg, __progname,
  86.        level | MB_OK | MB_TASKMODAL | MB_SETFOREGROUND);
  87. }
  88. int SetupConsole()
  89. {
  90.     // stuff from knowledge base Q105305 (see that for details)
  91.     // open a console and do the work around to get the console to work in all
  92.     // cases
  93.     int hCrt;
  94.     FILE *hf=0;
  95.     const COORD screenSz = {80, 2000}; /* size of console buffer */
  96.     AllocConsole();
  97.     hf=0;
  98.     hCrt = _open_osfhandle(
  99.             (long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
  100.     if (hCrt!=-1) hf = _fdopen(hCrt, "w");
  101.     if (hf!=0) *stdout = *hf;
  102.     if (hCrt==-1 || hf==0 || 0!=setvbuf(stdout, NULL, _IONBF, 0)) {
  103.             ShowMessage(MB_ICONINFORMATION,
  104.                         "unable to reroute stdout");
  105.             return FALSE;
  106.     }
  107.     SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), screenSz);
  108.     hf=0;
  109.     hCrt = _open_osfhandle(
  110.         (long)GetStdHandle(STD_ERROR_HANDLE), _O_TEXT);
  111.     if (hCrt!=-1) hf = _fdopen(hCrt, "w");
  112.     if (hf!=0) *stderr = *hf;
  113.     if (hCrt==-1 || hf==0 || 0!=setvbuf(stderr, NULL, _IONBF, 0)) {
  114.             ShowMessage(MB_ICONINFORMATION,
  115.                         "reroute stderr failed in SetupConsole");
  116.             return FALSE;
  117.     }
  118.     hf=0;
  119.     hCrt = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT);
  120.     if (hCrt!=-1) hf = _fdopen(hCrt, "r");
  121.     if (hf!=0) *stdin = *hf;
  122.     if (hCrt==-1 || hf==0 || 0!=setvbuf(stdin, NULL, _IONBF, 0)) {
  123.             ShowMessage(MB_ICONINFORMATION,
  124.                         "reroute stdin failed in SetupConsole");
  125.             return FALSE;
  126.     }
  127.     return TRUE;
  128. }
  129. int APIENTRY
  130. WinMain(
  131.     HINSTANCE hInstance,
  132.     HINSTANCE hPrevInstance,
  133.     LPSTR lpszCmdLine,
  134.     int nCmdShow)
  135. {
  136.     char *p;
  137.     WSADATA WSAdata;
  138.     int retcode;
  139. #ifdef STATIC_TCLTK
  140.     Tcl_LibMain(hInstance, DLL_PROCESS_ATTACH, NULL);
  141.     Tk_LibMain(hInstance, DLL_PROCESS_ATTACH, NULL);
  142.     atexit(static_exit);
  143. #endif
  144.  
  145.     setlocale(LC_ALL, "C");
  146.     /* XXX
  147.      * initialize our socket interface plus the tcl 7.5 socket
  148.      * interface (since they redefine some routines we call).
  149.      * eventually we should just call the tcl sockets but at
  150.      * the moment that's hard to set up since they only support
  151.      * tcp in the notifier.
  152.      */
  153.     if (WSAStartup(MAKEWORD (1, 1), &WSAdata)) {
  154.      perror("Windows Sockets init failed");
  155. abort();
  156.     }
  157. /*    TclHasSockets(NULL);
  158.     TkWinXInit(hInstance); */
  159.     /*
  160.      * Increase the application queue size from default value of 8.
  161.      * At the default value, cross application SendMessage of WM_KILLFOCUS
  162.      * will fail because the handler will not be able to do a PostMessage!
  163.      * This is only needed for Windows 3.x, since NT dynamically expands
  164.      * the queue.
  165.      */
  166.     SetMessageQueue(64);
  167.     GetModuleFileName(NULL, argv0, 255);
  168.     p = argv0;
  169.     __progname = strrchr(p, '/');
  170.     if (__progname != NULL) {
  171. __progname++;
  172.     }
  173.     else {
  174. __progname = strrchr(p, '\');
  175. if (__progname != NULL) {
  176.     __progname++;
  177. } else {
  178.     __progname = p;
  179. }
  180.     }
  181.     if (__argc>1) {            
  182.             SetupConsole();
  183.     }
  184.     retcode=main(__argc, (const char**)__argv);
  185.     if (retcode!=0) {
  186.             assert(FALSE);      // don't die without letting user know why
  187.     }
  188.     return retcode;
  189. }
  190. static char szTemp[4096];
  191. int outputErr(const char* szPrefix, Tcl_Interp* interp)
  192. {
  193. char *szError=Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY);
  194.         int l = strlen(szPrefix) + strlen(interp->result) + 2 +
  195. strlen(szError) + 1;
  196.         char* szMsg = szTemp;
  197.         if (l>4096) szMsg = (char*)malloc(l*sizeof(char));
  198.         strcpy(szMsg, szPrefix);
  199. //        strcat(szMsg, interp->result);
  200. strcat(szMsg, "n");
  201. strcat(szMsg, szError);            
  202.         OutputDebugString(szMsg);
  203.         ShowMessage(MB_ICONERROR, szMsg);
  204.         assert(FALSE);
  205.         if (szMsg != szTemp) free(szMsg);
  206.         return 0;
  207. }       
  208. void
  209. win_perror(const char *msg)
  210. {
  211.     DWORD cMsgLen;
  212.     CHAR *msgBuf;
  213.     DWORD dwError = GetLastError();
  214.     
  215.     cMsgLen = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
  216.     FORMAT_MESSAGE_ALLOCATE_BUFFER | 40, NULL,
  217.     dwError,
  218.     MAKELANGID(0, SUBLANG_ENGLISH_US),
  219.     (LPTSTR) &msgBuf, 512,
  220.     NULL);
  221.     if (!cMsgLen)
  222. fprintf(stderr, "%s%sError code %lun",
  223. msg?msg:"", msg?": ":"", dwError);
  224.     else {
  225. fprintf(stderr, "%s%s%sn", msg?msg:"", msg?": ":"", msgBuf);
  226. LocalFree((HLOCAL)msgBuf);
  227.     }
  228. }
  229. #if 0
  230. static char szTemp[4096];
  231. int
  232. printf(const char *fmt, ...)
  233. {
  234.     int retval;
  235.     
  236.     va_list ap;
  237.     va_start (ap, fmt);
  238.     retval = vsprintf(szTemp, fmt, ap);
  239.     OutputDebugString(szTemp);
  240.     ShowMessage(MB_ICONINFORMATION, szTemp);
  241.     va_end (ap);
  242.     return(retval);
  243. }
  244. int
  245. fprintf(FILE *f, const char *fmt, ...)
  246. {
  247.     int retval;
  248.     
  249.     va_list ap;
  250.     va_start (ap, fmt);
  251.     if (f == stderr) {
  252. retval = vsprintf(szTemp, fmt, ap);
  253. OutputDebugString(szTemp);
  254. ShowMessage(MB_ICONERROR, szTemp);
  255. va_end (ap);
  256.     }
  257.     else
  258. retval = vfprintf(f, fmt, ap);
  259.     
  260.     return(retval);
  261. }
  262. void
  263. perror(const char *msg)
  264. {
  265.     DWORD cMsgLen;
  266.     CHAR *msgBuf;
  267.     DWORD dwError = GetLastError();
  268.     
  269.     cMsgLen = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
  270.     FORMAT_MESSAGE_ALLOCATE_BUFFER | 40, NULL,
  271.     dwError,
  272.     MAKELANGID(0, SUBLANG_ENGLISH_US),
  273.     (LPTSTR) &msgBuf, 512,
  274.     NULL);
  275.     if (!cMsgLen)
  276. fprintf(stderr, "%s%sError code %lun",
  277. msg?msg:"", msg?": ":"", dwError);
  278.     else {
  279. fprintf(stderr, "%s%s%sn", msg?msg:"", msg?": ":"", msgBuf);
  280. LocalFree((HLOCAL)msgBuf);
  281.     }
  282. }
  283. int
  284. WinPutsCmd(clientData, interp, argc, argv)
  285.     ClientData clientData; /* ConsoleInfo pointer. */
  286.     Tcl_Interp *interp; /* Current interpreter. */
  287.     int argc; /* Number of arguments. */
  288.     char **argv; /* Argument strings. */
  289. {
  290.     int i, newline;
  291.     char *fileId;
  292.     i = 1;
  293.     newline = 1;
  294.     if ((argc >= 2) && (strcmp(argv[1], "-nonewline") == 0)) {
  295. newline = 0;
  296. i++;
  297.     }
  298.     if ((i < (argc-3)) || (i >= argc)) {
  299. Tcl_AppendResult(interp, "wrong # args: should be "", argv[0],
  300. " ?-nonewline? ?fileId? string"", (char *) NULL);
  301. return TCL_ERROR;
  302.     }
  303.     /*
  304.      * The code below provides backwards compatibility with an old
  305.      * form of the command that is no longer recommended or documented.
  306.      */
  307.     if (i == (argc-3)) {
  308. if (strncmp(argv[i+2], "nonewline", strlen(argv[i+2])) != 0) {
  309.     Tcl_AppendResult(interp, "bad argument "", argv[i+2],
  310.     "": should be "nonewline"", (char *) NULL);
  311.     return TCL_ERROR;
  312. }
  313. newline = 0;
  314.     }
  315.     if (i == (argc-1)) {
  316. fileId = "stdout";
  317.     } else {
  318. fileId = argv[i];
  319. i++;
  320.     }
  321.     if (strcmp(fileId, "stdout") == 0 || strcmp(fileId, "stderr") == 0) {
  322. char *result;
  323. int level;
  324. if (newline) {
  325.     int len = strlen(argv[i]);
  326.     result = ckalloc(len+2);
  327.     memcpy(result, argv[i], len);
  328.     result[len] = 'n';
  329.     result[len+1] = 0;
  330. } else {
  331.     result = argv[i];
  332. }
  333. if (strcmp(fileId, "stdout") == 0) {
  334.     level = MB_ICONINFORMATION;
  335. } else {
  336.     level = MB_ICONERROR;
  337. }
  338. OutputDebugString(result);
  339. ShowMessage(level, result);
  340. if (newline)
  341.     ckfree(result);
  342. return TCL_OK;
  343.     } else {
  344. extern int Tcl_PutsCmd(ClientData clientData, Tcl_Interp *interp,
  345.        int argc, char **argv);
  346. return (Tcl_PutsCmd(clientData, interp, argc, argv));
  347.     }
  348. }
  349. #endif
  350. int
  351. WinGetUserName(clientData, interp, argc, argv)
  352.     ClientData clientData;
  353.     Tcl_Interp *interp; /* Current interpreter. */
  354.     int argc; /* Number of arguments. */
  355.     char *argv[]; /* Argument strings. */
  356. {
  357.     char user[256];
  358.     int size = sizeof(user);
  359.     
  360.     if (!GetUserName(user, &size)) {
  361. Tcl_AppendResult(interp, "GetUserName failed", NULL);
  362. return TCL_ERROR;
  363.     }
  364.     Tcl_AppendResult(interp, user, NULL);
  365.     return TCL_OK;
  366. }
  367. int WinGetHostName(clientData, interp, argc, argv)
  368.                    ClientData clientData;
  369.                    Tcl_Interp *interp; /* Current interpreter. */
  370.                    int argc; /* Number of arguments. */
  371.                    char *argv[]; /* Argument strings. */               
  372. {
  373.         char hostname[MAXGETHOSTSTRUCT];
  374.         if (SOCKET_ERROR == gethostname(hostname, MAXGETHOSTSTRUCT)) {
  375.                 Tcl_AddErrorInfo(interp, "gethostname failed!");
  376.         }
  377.         Tcl_AppendResult(interp, hostname, NULL);
  378.         return TCL_OK;
  379. }
  380. static HKEY
  381. regroot(root)
  382.     char *root;
  383. {
  384.     if (strcasecmp(root, "HKEY_LOCAL_MACHINE") == 0)
  385. return HKEY_LOCAL_MACHINE;
  386.     else if (strcasecmp(root, "HKEY_CURRENT_USER") == 0)
  387. return HKEY_CURRENT_USER;
  388.     else if (strcasecmp(root, "HKEY_USERS") == 0)
  389. return HKEY_USERS;
  390.     else if (strcasecmp(root, "HKEY_CLASSES_ROOT") == 0)
  391. return HKEY_CLASSES_ROOT;
  392.     else
  393. return NULL;
  394. }
  395. int
  396. WinGetRegistry(clientData, interp, argc, argv)
  397.     ClientData clientData;
  398.     Tcl_Interp *interp; /* Current interpreter. */
  399.     int argc; /* Number of arguments. */
  400.     char **argv; /* Argument strings. */
  401. {
  402.     HKEY hKey, hRootKey;
  403.     DWORD dwType;
  404.     DWORD len, retCode;
  405.     CHAR *regRoot, *regPath, *keyValue, *keyData;
  406.     int retval = TCL_ERROR;
  407.     
  408.     if (argc != 3) {
  409. Tcl_AppendResult(interp, "wrong # args: should be "", argv[0],
  410. "key value"", (char *) NULL);
  411. return TCL_ERROR;
  412.     }
  413.     regRoot = argv[1];
  414.     keyValue = argv[2];
  415.     regPath = strchr(regRoot, '\');
  416.     *regPath++ = '';
  417.     
  418.     if ((hRootKey = regroot(regRoot)) == NULL) {
  419. Tcl_AppendResult(interp, "Unknown registry root "",
  420.  regRoot, """, NULL);
  421. return (TCL_ERROR);
  422.     }
  423.     
  424.     retCode = RegOpenKeyEx(hRootKey, regPath, 0,
  425.    KEY_READ, &hKey);
  426.     if (retCode == ERROR_SUCCESS) {
  427. retCode = RegQueryValueEx(hKey, keyValue, NULL, &dwType,
  428.   NULL, &len);
  429. if (retCode == ERROR_SUCCESS &&
  430.     dwType == REG_SZ && len) {
  431.     keyData = (CHAR *) ckalloc(len);
  432.     retCode = RegQueryValueEx(hKey, keyValue, NULL, NULL,
  433.       keyData, &len);
  434.     if (retCode == ERROR_SUCCESS) {
  435. Tcl_AppendResult(interp, keyData, NULL);
  436. free(keyData);
  437. retval = TCL_OK;
  438.     }
  439. }
  440. RegCloseKey(hKey);
  441.     }
  442.     if (retval == TCL_ERROR) {
  443. Tcl_AppendResult(interp, "Cannot find registry entry "", regRoot,
  444.  "\", regPath, "\", keyValue, """, NULL);
  445.     }
  446.     return (retval);
  447. }
  448. int
  449. WinPutRegistry(clientData, interp, argc, argv)
  450.     ClientData clientData;
  451.     Tcl_Interp *interp; /* Current interpreter. */
  452.     int argc; /* Number of arguments. */
  453.     char **argv; /* Argument strings. */
  454. {
  455.     HKEY hKey, hRootKey;
  456.     DWORD retCode;
  457.     CHAR *regRoot, *regPath, *keyValue, *keyData;
  458.     DWORD new;
  459.     int result = TCL_OK;
  460.     
  461.     if (argc != 4) {
  462. Tcl_AppendResult(interp, "wrong # args: should be "", argv[0],
  463. "key value data"", (char *) NULL);
  464. return TCL_ERROR;
  465.     }
  466.     regRoot = argv[1];
  467.     keyValue = argv[2];
  468.     keyData = argv[3];
  469.     
  470.     regPath = strchr(regRoot, '\');
  471.     *regPath++ = '';
  472.     
  473.     if ((hRootKey = regroot(regRoot)) == NULL) {
  474. Tcl_AppendResult(interp, "Unknown registry root "",
  475.  regRoot, """, NULL);
  476. return (TCL_ERROR);
  477.     }
  478.     retCode = RegCreateKeyEx(hRootKey, regPath, 0,
  479.      "",
  480.      REG_OPTION_NON_VOLATILE,
  481.      KEY_ALL_ACCESS,
  482.      NULL,
  483.      &hKey, &new);
  484.     if (retCode == ERROR_SUCCESS) {
  485. retCode = RegSetValueEx(hKey, keyValue, 0, REG_SZ, keyData, strlen(keyData));
  486. if (retCode != ERROR_SUCCESS) {
  487.     Tcl_AppendResult(interp, "unable to set key "", regRoot, "\",
  488.      regPath, "" with value "", keyValue, """,
  489.      (char *) NULL);
  490.     result = TCL_ERROR;
  491. }
  492. RegCloseKey(hKey);
  493.     }
  494.     else {
  495. Tcl_AppendResult(interp, "unable to create key "", regRoot, "\",
  496.  regPath, """, (char *) NULL);
  497. result = TCL_ERROR;
  498.     }
  499.     return (result);
  500. }
  501. /* does everything the normal exit command does, but shows a dialog box if
  502.  * there is an error so that the console does not vaporize */
  503. int WinExit(dummy, interp, argc, argv)
  504.     ClientData dummy; /* Not used. */
  505.     Tcl_Interp *interp; /* Current interpreter. */
  506.     int argc; /* Number of arguments. */
  507.     char **argv;
  508. {
  509.         int value;
  510.         char buffer[100];
  511.         if ((argc != 1) && (argc != 2)) {
  512.                 Tcl_AppendResult(interp, "wrong # args: should be "", argv[0],
  513.                                  " ?returnCode?"", (char *) NULL);
  514.                 return TCL_ERROR;
  515.         }
  516.         if (argc == 1) {
  517.                 value = 0;
  518.         } else if (Tcl_GetInt(interp, argv[1], &value) != TCL_OK) {
  519.                 return TCL_ERROR;
  520.         }
  521.         /* all the error information should be in the console, so just
  522.          * show the message and wait for user input */
  523.         if (value != 0) {
  524.                 ShowMessage(MB_ICONERROR, "Application exiting with error!");
  525.         }
  526.         /* call the usual (renamed) tcl exit command */
  527.         sprintf(buffer, "tcl_exit %d", value);
  528.         Tcl_Eval(interp, buffer);
  529.         /*NOTREACHED*/
  530.         return TCL_OK;
  531. }
  532. static char initScript[]=
  533. "proc init {} {n
  534.     global tcl_library tcl_platform tcl_version tcl_patchLevel env errorInfon
  535.     global tcl_pkgPathn
  536.     rename init {}n
  537.     set errors {}n
  538.     proc tcl_envTraceProc {lo n1 n2 op} {n
  539. global envn
  540. set x $env($n2)n
  541. set env($lo) $xn
  542. set env([string toupper $lo]) $xn
  543.     }n
  544.     foreach p [array names env] {n
  545. set u [string toupper $p]n
  546. if {$u != $p} {n
  547.     switch -- $u {n
  548. COMSPEC -n
  549. PATH {n
  550.     if {![info exists env($u)]} {n
  551. set env($u) $env($p)n
  552.     }n
  553.     trace variable env($p) w [list tcl_envTraceProc $p]n
  554.     trace variable env($u) w [list tcl_envTraceProc $p]n
  555. }n
  556.     }n
  557. }n
  558.     }n
  559.     if {![info exists env(COMSPEC)]} {n
  560. if {$tcl_platform(os) == {Windows NT}} {n
  561.     set env(COMSPEC) cmd.exen
  562. } else {n
  563.     set env(COMSPEC) command.comn
  564. }n
  565.     } n
  566. }n
  567. initn";
  568. int platformInit(Tcl_Interp* interp)
  569. {
  570.         /* tcl.CreateCommand("puts", WinPutsCmd, (ClientData)0); */
  571.         Tcl_CreateCommand(interp, "getusername", WinGetUserName,
  572.                           (ClientData)0, (Tcl_CmdDeleteProc*)0);
  573.         Tcl_CreateCommand(interp, "gethostname", WinGetHostName,
  574.                           (ClientData)0, (Tcl_CmdDeleteProc*)0);
  575.         Tcl_CreateCommand(interp, "putregistry", WinPutRegistry,
  576.                           (ClientData)0, (Tcl_CmdDeleteProc*)0);
  577.         Tcl_CreateCommand(interp, "getregistry", WinGetRegistry,
  578.                           (ClientData)0, (Tcl_CmdDeleteProc*)0);
  579. Tcl_Eval(interp, initScript);
  580. if (TCL_OK==Tcl_Eval(interp, "rename exit tcl_exit")) {
  581.                 Tcl_CreateCommand(interp, "exit", WinExit,
  582.                                   (ClientData)0, (Tcl_CmdDeleteProc*)0);
  583. } else {
  584. fprintf(stderr, "rename of exit proc failed!");
  585. }
  586.         
  587. #if 0
  588.         /*
  589.          * Initialize the console only if we are running as an interactive
  590.          * application.
  591.          */
  592. {
  593. char* interactive;
  594.         if ((interactive=Tcl_GetVar(interp, "tcl_interactive",
  595.     TCL_GLOBAL_ONLY))
  596.     && !strcmp(interactive, "1")) {
  597.                 /*
  598.                  * Create the console channels and install them as the standard
  599.                  * channels.  All I/O will be discarded until TkConsoleInit is
  600.                  * called to attach the console to a text widget.
  601.                  */            
  602.                 TkConsoleCreate();
  603.                 if (TkConsoleInit(interp) == TCL_ERROR) {
  604.                         fprintf(stderr, "error calling TkConsoleInitn");
  605.                 }
  606.         }
  607. }
  608. #endif
  609.         return TCL_OK;
  610. }