pcs         98/02/24 06:26:57

  Added:       src/os/win32/installer/installdll install.c install.def
                        install.dsp install.mak
               src/os/win32/installer/installdll/test resource.h test.c
                        test.def test.dsp test.h test.ico test.mak test.rc
  Log:
  Add code for the installer DLL. This is the file that replaces
  the @@ServerRoot@@ sequences in the configuration files with
  the real install directory.
  
  Also here is a test program, in test/, which calls the installer DLL
  and can be used to debug it.
  
  Revision  Changes    Path
  1.1                  apache-1.3/src/os/win32/installer/installdll/install.c
  
  Index: install.c
  ===================================================================
  /* Apache Installer */
  
  /*
   * 26/06/97 PCS 1.000 Initial version
   * 22/02/98 PCS 1.001 Used the excellent NTemacs to apply proper formating
   */
  
  #include <windows.h>
  #include <winsock.h>
  #include <string.h>
  #include <stdio.h>
  
  /* Global to store the instance handle */
  HINSTANCE hInstance = NULL;
  
  /*
   * MessageBox_error() is a helper function to display an error in a 
   * message box, optionally including a Win32 error message. If
   * the "opt" argument is value AP_WIN32ERROR then get the last Win32
   * error (with GetLastError()) and add it on to the end of
   * the output string. The output string is given as a printf-format
   * and replacement arguments. The hWnd, title and mb_opt fields are 
   * passed on to the Win32 MessageBox() call.
   *
   * We shouldn't use a fixed length buffer to build up the printf
   * text. Umm.
   */
  
  #define AP_WIN32ERROR 1
  
  int MessageBox_error(HWND hWnd, int opt, char *title, 
                     int mb_opt, char *fmt, ...)
  {
      char buf[4000];
      va_list ap;
  
      va_start(ap, fmt);
      wvsprintf(buf, fmt, ap);
      va_end(ap);
  
      if (opt | AP_WIN32ERROR) {
        char *p;
  
        strcat(buf, "\r\r(");
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
                      NULL,
                      GetLastError(),
                      0,
                      buf + strlen(buf),
                      4000 - strlen(buf),
                      NULL);
        p = buf+strlen(buf)-1;
        while (*p == '\r' || *p == '\n')
            p--;
        p++;
        *p = '\0';
        strcat(buf, ")");
      }
  
      return MessageBox(hWnd, buf, title, opt);
  }
  
  /*
   * The next few functions handle expanding the @@ServerRoot@@ type
   * sequences found in the distribution files. The main entry point
   * is expandFile(), which is given a file to expand and the filename
   * to write the expanded file it. It reads a line at a time, and
   * if the line includes an "@@" sequence, calls expandLine() to
   * expand the sequences.
   *
   * expandLine() looks for @@ sequences in the line, and when it finds
   * one, looks for a corresponding entry in the replaceTable[]. If it
   * finds one it writes the replacement value from the table into
   * an output string.
   *
   * The helper function appendText() is used when expanding strings. It
   * is called to copy text into an output buffer. If the output buffer
   * is not big enough, it is expanded. This function also ensures that
   * the output buffer is null terminated after each append operation.
   *
   * A table is used of values to replace, rather than just hardcoding
   * the functionality, so we could replace additional values in the
   * future.  We also take care to ensure that the expanded line can be
   * arbitrary length (though at the moment the lines read from the
   * configuration files can only be up to 2000 characters).
   */
  
  /*
   * Table of items to replace. The "value" elements are filled in at runtime
   * by FillInReplaceTable(). Note that the "tmpl" element is case
   * sensitive.
   */
  
  typedef struct {
      char *tmpl;
      char *value;
  } REPLACEITEM;
  typedef REPLACEITEM *REPLACETABLE;
  
  REPLACEITEM replaceHttpd[] = {
      { "@@ServerRoot@@", NULL },       /* ServerRoot directory (i.e. install 
dir) */
      { NULL, NULL }
  };
  
  /*
   * A relatively intelligent version of strcat, that expands the destination
   * buffer if needed.
   *
   * On entry, ppBuf points to the output buffer, pnPos points to the offset
   * of the current position within that buffer, and pnSize points to the
   * current size of *ppBuf. pSrc points to the string to copy into the buffer,
   * and nToCopy gives the number of characters to copy from pSrc.
   *
   * On exit, *ppBuf, *pnPos and *pnSize may have been updated if the output
   * buffer needed to be expanded. The output buffer will be null terminated.
   * Returns 0 on success, -1 on error. Does not report errors to the user.
   */
  
  int appendText(char **ppBuf, int *pnPos, int *pnSize, char *pSrc, int nToCopy)
  {
      char *pBuf = *ppBuf;      /* output buffer */
      int nPos = *pnPos;                /* current offset into pBuf */
      int nSize = *pnSize;      /* current size of pBuf */
  
      while (nPos + nToCopy >= nSize) {
        /* Not enough space, double size of output buffer. Note we use
         * >= not > so that we have enough space for the NULL character
         * in the output buffer */
        char *pBufNew;
  
        pBufNew = realloc(pBuf, nSize * 2);
        if (!pBufNew)
            return -1;
        nSize *= 2;
  
        /* Update the max size and buffer pointer */
        *pnSize = nSize;
        *ppBuf = pBuf = pBufNew;
      }
  
      /* Ok, now we have enough space, copy the stuff */
  
      strncpy(pBuf+nPos, pSrc, nToCopy);
      nPos += nToCopy;
      *pnPos = nPos;            /* update current position */
      pBuf[nPos] = '\0';                /* append trailing NULL */
  
      return 0;
  }
  
  /*
   * Expand all the sequences in an input line. Returns a pointer to the
   * expanded line. The caller should free the returned data.
   * The replaceTable argument is a table of sequences to expand.
   *
   * Returns NULL on error. Does not report errors to the user.
   */
  
  char *expandLine(char *in, REPLACETABLE replaceTable)
  {
      REPLACEITEM *item;
      char *pos;                        /* current position in input buffer */
      char *outbuf;             /* output buffer */
      int outbuf_size;          /* current size of output buffer */
      int outbuf_position;      /* current position in output buffer */
      char *start;              /* position to copy from in input buffer */
  
      /* Create an initial output buffer. Guess that twice the input size
       * is a good length, after expansion. Don't worry if we need more
       * though, appendText() will expand as needed.
       */
      outbuf_size = strlen(in) * 2;
      outbuf_position = 0;
      outbuf = malloc(outbuf_size);
      if (!outbuf)
        return NULL;
  
      start = in;                       /* mark the start of uncopied data */
      pos = in;                 /* current position in input buffer */
  
      while (1) {
  
        /* Look for '@@' sequence, or end of input */
        if (*pos && !(*pos == '@' && *(pos+1) == '@')) {
            pos++;
            continue;
        }
  
        if (!*pos) {
            /* End of input string, copy the uncopied data */
            if (appendText(&outbuf, &outbuf_position, &outbuf_size, 
                           start, pos-start) < 0) {
                return NULL;
            }
            break;
        }
  
        /* Found first @ of a possible token to replace. Look for end
         * of the token
         */
        for (item = replaceTable; item->tmpl; ++item) {
            if (!strncmp(pos, item->tmpl, strlen(item->tmpl)))
                break;
        }
  
        if (item->tmpl) {
            /* Found match. First copy the uncopied data from the input
             * buffer (start through to pos-1), then copy the expanded
             * value. */
            if (appendText(&outbuf, &outbuf_position, &outbuf_size,
                           start, pos-start) < 0) {
                return NULL;
            }
            if (appendText(&outbuf, &outbuf_position, &outbuf_size,
                           item->value, strlen(item->value)) < 0) {
                return NULL;
            }
  
            /* Update current position to skip over the input buffer
             * @@...@@ sequence, and update the "start" pointer to uncopied
             * data
             */
            pos += strlen(item->tmpl);
            start = pos;
        } 
        else {
            /* The sequence did not exist in the replace table, so copy
             * it as-is to the output.
             */
            pos++; 
        }
      }
  
      return outbuf;
  }
  
  /* 
   * Copy a file, expanding sequences from the replaceTable argument.
   * Returns 0 on success, -1 on error. Reports errors to user.
   */
  #define MAX_INPUT_LINE 2000
  int WINAPI ExpandConfFile(HWND hwnd, LPSTR szInst, LPSTR szinFile, LPSTR 
szoutFile, REPLACETABLE replaceTable)
  {
      char inFile[_MAX_PATH];
      char outFile[_MAX_PATH];
      char inbuf[MAX_INPUT_LINE];
      FILE *infp;
      FILE *outfp;
  
      sprintf(inFile, "%s\\%s", szInst, szinFile);
      sprintf(outFile, "%s\\%s", szInst, szoutFile);
  
      if (!(infp = fopen(inFile, "r"))) {
        MessageBox_error(hwnd, 
                         AP_WIN32ERROR,
                         "Installation Problem",
                         MB_OK | MB_ICONSTOP,
                         "Cannot read file %s", inFile);
        return -1;
      }
      if (!(outfp = fopen(outFile, "w"))) {
        MessageBox_error(hwnd, 
                         AP_WIN32ERROR,
                         "Installation Problem",
                         MB_OK | MB_ICONSTOP,
                         "Cannot write to file %s", outFile);
        fclose(infp);
        return -1;
      }
  
      while (fgets(inbuf, MAX_INPUT_LINE, infp)) {
        char *pos;
        char *outbuf;
  
        /* Quickly look to see if this line contains any
         * @@ tokens. If it doesn't, we don't need to bother
         * called expandLine() or taking a copy of the input
         * buffer.
         */
        for (pos = inbuf; *pos; ++pos)
            if (*pos == '@' && *(pos+1) == '@')
                break;
  
        if (*pos) {
            /* The input line contains at least one '@@' sequence, so
             * call expandLine() to expand any sequences we know about.
             */
            outbuf = expandLine(inbuf, replaceTable);
            if (outbuf == NULL) {
                fclose(infp);
                fclose(outfp);
                MessageBox_error(hwnd,
                                 0,
                                 "Installation Problem",
                                 MB_OK|MB_ICONSTOP,
                                 "An error occurred during installation");
                return -1;
            }
        }
        else {
            outbuf = NULL;
        }
  
        /* If outbuf is NULL, we did not need to expand sequences, so
         * just output the contents of the input buffer.
         */
        fwrite(outbuf ? outbuf : inbuf, 1, 
               strlen(outbuf ? outbuf : inbuf), outfp);
  
        if (outbuf)
            free(outbuf);
      }
      fclose(infp);
      fclose(outfp);
  
      return 0;
  }
  
  int FillInReplaceTable(HWND hwnd, REPLACETABLE table, char *szInst)
  {
      REPLACEITEM *item;
      for (item = table; item->tmpl; ++item) {
        if (!strcmp(item->tmpl, "@@ServerRoot@@")) {
            char *p;
  
  #if NEED_SHORT_PATHS
            int len;
            len = GetShortPathName(szInst, NULL, 0);
            if (len > 0) {
                item->value = (char*)malloc(len+1);
                GetShortPathName(szInst, item->value, len);
            }
  #else
            if ((item->value = strdup(szInst)) == NULL)
                return -1;
  #endif
            for (p = item->value; *p; p++)
                if (*p == '\\') *p = '/';
            continue;
        }
  #if NEED_FQDN
        if (!strcmp(item->tmpl, "FQDN")) {
            item->value = GetHostName(hwnd);
            continue;
        }
  #endif
      }
      return 0;
  }
  
  /*
   * This is the entry point from InstallShield. The only parameter
   * of interest is szInst which gives the installation directory. The
   * template configuration files will be in the files 
   * conf\httpd.conf-dist-win, conf\access.conf-dist-win and
   * conf\srm.conf-dist-win relative to this directory. We need to
   * expand them into corresponding conf\*.conf files.
   *
   * Return 1 on success, 0 on error.
   */
  
  typedef struct {
      char *in;
      char *out;
  } FILEITEM;
  typedef FILEITEM *FILETABLE;
  
  FILEITEM fileTable[] = {
      { "conf\\httpd.conf-dist-win", "conf\\httpd.conf" },
      { "conf\\srm.conf-dist-win", "conf\\srm.conf" },
      { "conf\\access.conf-dist-win", "conf\\access.conf" },
      { NULL, NULL }
  };
  
  /*
   * BeforeExit() is the DLL call from InstallShield. The arguments and
   * return value as defined by the installer. We are only interested
   * in the install directory, szInst. Return 0 on error and 1 on
   * success (!?).
   */
  
  CHAR WINAPI BeforeExit(HWND hwnd, LPSTR szSrcDir, LPSTR szSupport, LPSTR 
szInst, LPSTR szRes)
  {
      FILEITEM *pfileItem;
  
      FillInReplaceTable(hwnd, replaceHttpd, szInst);
  
      pfileItem = fileTable;
      while (pfileItem->in != NULL) {
        if (ExpandConfFile(hwnd, szInst, 
                           pfileItem->in, pfileItem->out,
                           replaceHttpd) < 0) {
            /* Error has already been reported to the user */
            return 0;
        }
        pfileItem++;
      }
      return 1;
  }
  
  
  BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
  {
      if (fdwReason == DLL_PROCESS_ATTACH)
        hInstance = hInstDLL;
      return TRUE;
  }
  
  
  
  1.1                  apache-1.3/src/os/win32/installer/installdll/install.def
  
  Index: install.def
  ===================================================================
  LIBRARY      INSTALL
  DESCRIPTION  'Installer DLL For Apache'
  
  EXPORTS
                BeforeExit @1
                DllMain @2
  
  
  
  1.1                  apache-1.3/src/os/win32/installer/installdll/install.dsp
  
  Index: install.dsp
  ===================================================================
  # Microsoft Developer Studio Project File - Name="install" - Package Owner=<4>
  # Microsoft Developer Studio Generated Build File, Format Version 5.00
  # ** DO NOT EDIT **
  
  # TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
  
  CFG=install - Win32 Debug
  !MESSAGE This is not a valid makefile. To build this project using NMAKE,
  !MESSAGE use the Export Makefile command and run
  !MESSAGE 
  !MESSAGE NMAKE /f "install.mak".
  !MESSAGE 
  !MESSAGE You can specify a configuration when running NMAKE
  !MESSAGE by defining the macro CFG on the command line. For example:
  !MESSAGE 
  !MESSAGE NMAKE /f "install.mak" CFG="install - Win32 Debug"
  !MESSAGE 
  !MESSAGE Possible choices for configuration are:
  !MESSAGE 
  !MESSAGE "install - Win32 Release" (based on\
   "Win32 (x86) Dynamic-Link Library")
  !MESSAGE "install - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
  !MESSAGE 
  
  # Begin Project
  # PROP Scc_ProjName ""
  # PROP Scc_LocalPath ""
  CPP=cl.exe
  MTL=midl.exe
  RSC=rc.exe
  
  !IF  "$(CFG)" == "install - Win32 Release"
  
  # PROP BASE Use_MFC 0
  # PROP BASE Use_Debug_Libraries 0
  # PROP BASE Output_Dir "Release"
  # PROP BASE Intermediate_Dir "Release"
  # PROP BASE Target_Dir ""
  # PROP Use_MFC 0
  # PROP Use_Debug_Libraries 0
  # PROP Output_Dir "Release"
  # PROP Intermediate_Dir "Release"
  # PROP Ignore_Export_Lib 0
  # PROP Target_Dir ""
  # ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" 
/YX /FD /c
  # ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX 
/FD /c
  # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
  # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
  # ADD BASE RSC /l 0x809 /d "NDEBUG"
  # ADD RSC /l 0x809 /d "NDEBUG"
  BSC32=bscmake.exe
  # ADD BASE BSC32 /nologo
  # ADD BSC32 /nologo
  LINK32=link.exe
  # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib 
odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
  # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
advapi32.lib shell32.lib wsock32.lib /nologo /subsystem:windows /dll 
/machine:I386
  
  !ELSEIF  "$(CFG)" == "install - Win32 Debug"
  
  # PROP BASE Use_MFC 0
  # PROP BASE Use_Debug_Libraries 1
  # PROP BASE Output_Dir "Debug"
  # PROP BASE Intermediate_Dir "Debug"
  # PROP BASE Target_Dir ""
  # PROP Use_MFC 0
  # PROP Use_Debug_Libraries 1
  # PROP Output_Dir "Debug"
  # PROP Intermediate_Dir "Debug"
  # PROP Ignore_Export_Lib 0
  # PROP Target_Dir ""
  # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D 
"_WINDOWS" /YX /FD /c
  # ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D 
"_WINDOWS" /YX /FD /c
  # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
  # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
  # ADD BASE RSC /l 0x809 /d "_DEBUG"
  # ADD RSC /l 0x809 /d "_DEBUG"
  BSC32=bscmake.exe
  # ADD BASE BSC32 /nologo
  # ADD BSC32 /nologo
  LINK32=link.exe
  # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib 
odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
  # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
advapi32.lib shell32.lib wsock32.lib /nologo /subsystem:windows /dll /debug 
/machine:I386 /pdbtype:sept
  
  !ENDIF 
  
  # Begin Target
  
  # Name "install - Win32 Release"
  # Name "install - Win32 Debug"
  # Begin Group "Source Files"
  
  # PROP Default_Filter ""
  # Begin Source File
  
  SOURCE=.\install.c
  # End Source File
  # Begin Source File
  
  SOURCE=.\install.def
  # End Source File
  # End Group
  # End Target
  # End Project
  
  
  
  1.1                  apache-1.3/src/os/win32/installer/installdll/install.mak
  
  Index: install.mak
  ===================================================================
  # Microsoft Developer Studio Generated NMAKE File, Based on install.dsp
  !IF "$(CFG)" == ""
  CFG=install - Win32 Debug
  !MESSAGE No configuration specified. Defaulting to install - Win32 Debug.
  !ENDIF 
  
  !IF "$(CFG)" != "install - Win32 Release" && "$(CFG)" !=\
   "install - Win32 Debug"
  !MESSAGE Invalid configuration "$(CFG)" specified.
  !MESSAGE You can specify a configuration when running NMAKE
  !MESSAGE by defining the macro CFG on the command line. For example:
  !MESSAGE 
  !MESSAGE NMAKE /f "install.mak" CFG="install - Win32 Debug"
  !MESSAGE 
  !MESSAGE Possible choices for configuration are:
  !MESSAGE 
  !MESSAGE "install - Win32 Release" (based on\
   "Win32 (x86) Dynamic-Link Library")
  !MESSAGE "install - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
  !MESSAGE 
  !ERROR An invalid configuration is specified.
  !ENDIF 
  
  !IF "$(OS)" == "Windows_NT"
  NULL=
  !ELSE 
  NULL=nul
  !ENDIF 
  
  !IF  "$(CFG)" == "install - Win32 Release"
  
  OUTDIR=.\Release
  INTDIR=.\Release
  # Begin Custom Macros
  OutDir=.\Release
  # End Custom Macros
  
  !IF "$(RECURSE)" == "0" 
  
  ALL : "$(OUTDIR)\install.dll"
  
  !ELSE 
  
  ALL : "$(OUTDIR)\install.dll"
  
  !ENDIF 
  
  CLEAN :
        [EMAIL PROTECTED] "$(INTDIR)\install.obj"
        [EMAIL PROTECTED] "$(INTDIR)\vc50.idb"
        [EMAIL PROTECTED] "$(OUTDIR)\install.dll"
        [EMAIL PROTECTED] "$(OUTDIR)\install.exp"
        [EMAIL PROTECTED] "$(OUTDIR)\install.lib"
  
  "$(OUTDIR)" :
      if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
  
  CPP=cl.exe
  CPP_PROJ=/nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS"\
   /Fp"$(INTDIR)\install.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c 
  CPP_OBJS=.\Release/
  CPP_SBRS=.
  
  .c{$(CPP_OBJS)}.obj::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cpp{$(CPP_OBJS)}.obj::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cxx{$(CPP_OBJS)}.obj::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .c{$(CPP_SBRS)}.sbr::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cpp{$(CPP_SBRS)}.sbr::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cxx{$(CPP_SBRS)}.sbr::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  MTL=midl.exe
  MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 
  RSC=rc.exe
  BSC32=bscmake.exe
  BSC32_FLAGS=/nologo /o"$(OUTDIR)\install.bsc" 
  BSC32_SBRS= \
        
  LINK32=link.exe
  LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
   advapi32.lib shell32.lib wsock32.lib /nologo /subsystem:windows /dll\
   /incremental:no /pdb:"$(OUTDIR)\install.pdb" /machine:I386 
/def:".\install.def"\
   /out:"$(OUTDIR)\install.dll" /implib:"$(OUTDIR)\install.lib" 
  DEF_FILE= \
        ".\install.def"
  LINK32_OBJS= \
        "$(INTDIR)\install.obj"
  
  "$(OUTDIR)\install.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
      $(LINK32) @<<
    $(LINK32_FLAGS) $(LINK32_OBJS)
  <<
  
  !ELSEIF  "$(CFG)" == "install - Win32 Debug"
  
  OUTDIR=.\Debug
  INTDIR=.\Debug
  # Begin Custom Macros
  OutDir=.\Debug
  # End Custom Macros
  
  !IF "$(RECURSE)" == "0" 
  
  ALL : "$(OUTDIR)\install.dll"
  
  !ELSE 
  
  ALL : "$(OUTDIR)\install.dll"
  
  !ENDIF 
  
  CLEAN :
        [EMAIL PROTECTED] "$(INTDIR)\install.obj"
        [EMAIL PROTECTED] "$(INTDIR)\vc50.idb"
        [EMAIL PROTECTED] "$(INTDIR)\vc50.pdb"
        [EMAIL PROTECTED] "$(OUTDIR)\install.dll"
        [EMAIL PROTECTED] "$(OUTDIR)\install.exp"
        [EMAIL PROTECTED] "$(OUTDIR)\install.ilk"
        [EMAIL PROTECTED] "$(OUTDIR)\install.lib"
        [EMAIL PROTECTED] "$(OUTDIR)\install.pdb"
  
  "$(OUTDIR)" :
      if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
  
  CPP=cl.exe
  CPP_PROJ=/nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D 
"_WINDOWS"\
   /Fp"$(INTDIR)\install.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c 
  CPP_OBJS=.\Debug/
  CPP_SBRS=.
  
  .c{$(CPP_OBJS)}.obj::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cpp{$(CPP_OBJS)}.obj::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cxx{$(CPP_OBJS)}.obj::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .c{$(CPP_SBRS)}.sbr::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cpp{$(CPP_SBRS)}.sbr::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cxx{$(CPP_SBRS)}.sbr::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  MTL=midl.exe
  MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 
  RSC=rc.exe
  BSC32=bscmake.exe
  BSC32_FLAGS=/nologo /o"$(OUTDIR)\install.bsc" 
  BSC32_SBRS= \
        
  LINK32=link.exe
  LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
   advapi32.lib shell32.lib wsock32.lib /nologo /subsystem:windows /dll\
   /incremental:yes /pdb:"$(OUTDIR)\install.pdb" /debug /machine:I386\
   /def:".\install.def" /out:"$(OUTDIR)\install.dll"\
   /implib:"$(OUTDIR)\install.lib" /pdbtype:sept 
  DEF_FILE= \
        ".\install.def"
  LINK32_OBJS= \
        "$(INTDIR)\install.obj"
  
  "$(OUTDIR)\install.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
      $(LINK32) @<<
    $(LINK32_FLAGS) $(LINK32_OBJS)
  <<
  
  !ENDIF 
  
  
  !IF "$(CFG)" == "install - Win32 Release" || "$(CFG)" ==\
   "install - Win32 Debug"
  SOURCE=.\install.c
  
  "$(INTDIR)\install.obj" : $(SOURCE) "$(INTDIR)"
  
  
  
  !ENDIF 
  
  
  
  
  1.1                  
apache-1.3/src/os/win32/installer/installdll/test/resource.h
  
  Index: resource.h
  ===================================================================
  //{{NO_DEPENDENCIES}}
  // Microsoft Developer Studio generated include file.
  // Used by test.rc
  //
  #define IDM_TEST                        102
  #define IDI_TEST                        106
  #define IDD_ABOUT                       107
  #define IDM_BEFOREEXIT                  40001
  #define IDM_EXIT                      106
  #define IDM_ABOUT                     303
  #define IDC_STATIC                    -1
  
  // Next default values for new objects
  // 
  #ifdef APSTUDIO_INVOKED
  #ifndef APSTUDIO_READONLY_SYMBOLS
  #define _APS_NO_MFC                     1
  #define _APS_NEXT_RESOURCE_VALUE        109
  #define _APS_NEXT_COMMAND_VALUE         40002
  #define _APS_NEXT_CONTROL_VALUE         1000
  #define _APS_NEXT_SYMED_VALUE           101
  #endif
  #endif
  
  
  
  1.1                  apache-1.3/src/os/win32/installer/installdll/test/test.c
  
  Index: test.c
  ===================================================================
  /*
   * Tester for the Apache Install DLL
   */
  
  #include <windows.h>
  
  #include "test.h"
  
  #define APPNAME "Test"
  
  HINSTANCE hInst;      // current instance
  char szAppName[100];  // Name of the app
  char szTitle[100];    // The title bar text
  
  extern CHAR WINAPI BeforeExit(HWND, LPSTR,LPSTR,LPSTR,LPSTR);
  
  BOOL InitApplication(HINSTANCE);
  BOOL InitInstance(HINSTANCE, int);
  LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  
  int APIENTRY WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR     lpCmdLine,
                       int       nCmdShow)
  {
     MSG msg;
     HANDLE hAccelTable;
  
     lstrcpy (szAppName, APPNAME);
     lstrcpy (szTitle, APPNAME);
  
     if (!hPrevInstance) {
        if (!InitApplication(hInstance)) {
           return (FALSE);
        }
     }
  
     if (!InitInstance(hInstance, nCmdShow)) {
        return (FALSE);
     }
  
     hAccelTable = LoadAccelerators (hInstance, szAppName);
  
     while (GetMessage(&msg, NULL, 0, 0)) {
        if (!TranslateAccelerator (msg.hwnd, hAccelTable, &msg)) {
           TranslateMessage(&msg);
           DispatchMessage(&msg);
        }
     }
  
     return (msg.wParam);
  
     lpCmdLine; // This will prevent 'unused formal parameter' warnings
  }
  
  BOOL InitApplication(HINSTANCE hInstance)
  {
      WNDCLASS  wc;
      HWND      hwnd;
  
      hwnd = FindWindow (szAppName, szTitle);
  
      wc.style         = CS_HREDRAW | CS_VREDRAW;
      wc.lpfnWndProc   = (WNDPROC)WndProc;
      wc.cbClsExtra    = 0;
      wc.cbWndExtra    = 0;
      wc.hInstance     = hInstance;
      wc.hIcon         = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_TEST));
      wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
      wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
      wc.lpszMenuName  = MAKEINTRESOURCE(IDM_TEST);
      wc.lpszClassName = szAppName;
  
      return RegisterClass(&wc);
  }
  
  BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  {
     HWND hWnd;
  
     hInst = hInstance;
  
     hWnd = CreateWindow(szAppName, szTitle, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
        NULL, NULL, hInstance, NULL);
  
     if (!hWnd) {
        return (FALSE);
     }
  
     ShowWindow(hWnd, nCmdShow);
     UpdateWindow(hWnd);
  
     return (TRUE);
  }
  
  LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM 
lParam)
  {
     int wmId, wmEvent;
  
     switch (message) {
  
        case WM_COMMAND:
           wmId    = LOWORD(wParam);
           wmEvent = HIWORD(wParam);
  
           switch (wmId) {
  
              case IDM_ABOUT:
                 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), hWnd, 
(DLGPROC)About);
                 break;
  
            case IDM_BEFOREEXIT:
                BeforeExit(hWnd, "C:\\", "C:\\", "C:\\Apache", NULL);
                break;
  
              case IDM_EXIT:
                 DestroyWindow (hWnd);
                 break;
  
              default:
                 return (DefWindowProc(hWnd, message, wParam, lParam));
           }
           break;
  
        case WM_DESTROY:
           PostQuitMessage(0);
           break;
  
        default:
           return (DefWindowProc(hWnd, message, wParam, lParam));
     }
     return (0);
  }
  
  LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  {
  
     switch (message) {
          case WM_INITDIALOG:
           return (TRUE);
  
        case WM_COMMAND:
           if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
              EndDialog(hDlg, TRUE);
              return (TRUE);
           }
           break;
     }
  
      return FALSE;
  }
  
  
  
  
  1.1                  
apache-1.3/src/os/win32/installer/installdll/test/test.def
  
  Index: test.def
  ===================================================================
  NAME         Test
  DESCRIPTION  'Test Installer DLL'
  
  
  
  1.1                  
apache-1.3/src/os/win32/installer/installdll/test/test.dsp
  
  Index: test.dsp
  ===================================================================
  # Microsoft Developer Studio Project File - Name="test" - Package Owner=<4>
  # Microsoft Developer Studio Generated Build File, Format Version 5.00
  # ** DO NOT EDIT **
  
  # TARGTYPE "Win32 (x86) Application" 0x0101
  
  CFG=test - Win32 Debug
  !MESSAGE This is not a valid makefile. To build this project using NMAKE,
  !MESSAGE use the Export Makefile command and run
  !MESSAGE 
  !MESSAGE NMAKE /f "test.mak".
  !MESSAGE 
  !MESSAGE You can specify a configuration when running NMAKE
  !MESSAGE by defining the macro CFG on the command line. For example:
  !MESSAGE 
  !MESSAGE NMAKE /f "test.mak" CFG="test - Win32 Debug"
  !MESSAGE 
  !MESSAGE Possible choices for configuration are:
  !MESSAGE 
  !MESSAGE "test - Win32 Release" (based on "Win32 (x86) Application")
  !MESSAGE "test - Win32 Debug" (based on "Win32 (x86) Application")
  !MESSAGE 
  
  # Begin Project
  # PROP Scc_ProjName ""
  # PROP Scc_LocalPath ""
  CPP=cl.exe
  MTL=midl.exe
  RSC=rc.exe
  
  !IF  "$(CFG)" == "test - Win32 Release"
  
  # PROP BASE Use_MFC 0
  # PROP BASE Use_Debug_Libraries 0
  # PROP BASE Output_Dir "Release"
  # PROP BASE Intermediate_Dir "Release"
  # PROP BASE Target_Dir ""
  # PROP Use_MFC 0
  # PROP Use_Debug_Libraries 0
  # PROP Output_Dir "Release"
  # PROP Intermediate_Dir "Release"
  # PROP Ignore_Export_Lib 0
  # PROP Target_Dir ""
  # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX 
/FD /c
  # ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
  # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
  # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
  # ADD BASE RSC /l 0x809 /d "NDEBUG"
  # ADD RSC /l 0x809 /d "NDEBUG"
  BSC32=bscmake.exe
  # ADD BASE BSC32 /nologo
  # ADD BSC32 /nologo
  LINK32=link.exe
  # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib 
odbccp32.lib /nologo /subsystem:windows /machine:I386
  # ADD LINK32 ..\Release\install.lib kernel32.lib user32.lib gdi32.lib 
winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo /subsystem:windows 
/machine:I386
  
  !ELSEIF  "$(CFG)" == "test - Win32 Debug"
  
  # PROP BASE Use_MFC 0
  # PROP BASE Use_Debug_Libraries 1
  # PROP BASE Output_Dir "Debug"
  # PROP BASE Intermediate_Dir "Debug"
  # PROP BASE Target_Dir ""
  # PROP Use_MFC 0
  # PROP Use_Debug_Libraries 1
  # PROP Output_Dir "Debug"
  # PROP Intermediate_Dir "Debug"
  # PROP Ignore_Export_Lib 0
  # PROP Target_Dir ""
  # ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D 
"_WINDOWS" /YX /FD /c
  # ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" 
/YX /FD /c
  # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
  # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
  # ADD BASE RSC /l 0x809 /d "_DEBUG"
  # ADD RSC /l 0x809 /d "_DEBUG"
  BSC32=bscmake.exe
  # ADD BASE BSC32 /nologo
  # ADD BSC32 /nologo
  LINK32=link.exe
  # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib 
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib 
odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
  # ADD LINK32 ..\Debug\install.lib wsock32.lib kernel32.lib user32.lib 
gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo 
/subsystem:windows /debug /machine:I386 /pdbtype:sept
  
  !ENDIF 
  
  # Begin Target
  
  # Name "test - Win32 Release"
  # Name "test - Win32 Debug"
  # Begin Source File
  
  SOURCE=.\resource.h
  # End Source File
  # Begin Source File
  
  SOURCE=.\test.c
  # End Source File
  # Begin Source File
  
  SOURCE=.\test.def
  # End Source File
  # Begin Source File
  
  SOURCE=.\test.h
  # End Source File
  # Begin Source File
  
  SOURCE=.\test.ico
  # End Source File
  # Begin Source File
  
  SOURCE=.\test.rc
  
  !IF  "$(CFG)" == "test - Win32 Release"
  
  !ELSEIF  "$(CFG)" == "test - Win32 Debug"
  
  !ENDIF 
  
  # End Source File
  # End Target
  # End Project
  
  
  
  1.1                  apache-1.3/src/os/win32/installer/installdll/test/test.h
  
  Index: test.h
  ===================================================================
  #include "resource.h"
  
  
  
  
  
  
  1.1                  
apache-1.3/src/os/win32/installer/installdll/test/test.ico
  
  Index: test.ico
  ===================================================================
  
  
  
  1.1                  
apache-1.3/src/os/win32/installer/installdll/test/test.mak
  
  Index: test.mak
  ===================================================================
  # Microsoft Developer Studio Generated NMAKE File, Based on test.dsp
  !IF "$(CFG)" == ""
  CFG=test - Win32 Debug
  !MESSAGE No configuration specified. Defaulting to test - Win32 Debug.
  !ENDIF 
  
  !IF "$(CFG)" != "test - Win32 Release" && "$(CFG)" != "test - Win32 Debug"
  !MESSAGE Invalid configuration "$(CFG)" specified.
  !MESSAGE You can specify a configuration when running NMAKE
  !MESSAGE by defining the macro CFG on the command line. For example:
  !MESSAGE 
  !MESSAGE NMAKE /f "test.mak" CFG="test - Win32 Debug"
  !MESSAGE 
  !MESSAGE Possible choices for configuration are:
  !MESSAGE 
  !MESSAGE "test - Win32 Release" (based on "Win32 (x86) Application")
  !MESSAGE "test - Win32 Debug" (based on "Win32 (x86) Application")
  !MESSAGE 
  !ERROR An invalid configuration is specified.
  !ENDIF 
  
  !IF "$(OS)" == "Windows_NT"
  NULL=
  !ELSE 
  NULL=nul
  !ENDIF 
  
  !IF  "$(CFG)" == "test - Win32 Release"
  
  OUTDIR=.\Release
  INTDIR=.\Release
  # Begin Custom Macros
  OutDir=.\Release
  # End Custom Macros
  
  !IF "$(RECURSE)" == "0" 
  
  ALL : "$(OUTDIR)\test.exe"
  
  !ELSE 
  
  ALL : "$(OUTDIR)\test.exe"
  
  !ENDIF 
  
  CLEAN :
        [EMAIL PROTECTED] "$(INTDIR)\test.obj"
        [EMAIL PROTECTED] "$(INTDIR)\test.res"
        [EMAIL PROTECTED] "$(INTDIR)\vc50.idb"
        [EMAIL PROTECTED] "$(OUTDIR)\test.exe"
  
  "$(OUTDIR)" :
      if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
  
  CPP=cl.exe
  CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS"\
   /Fp"$(INTDIR)\test.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c 
  CPP_OBJS=.\Release/
  CPP_SBRS=.
  
  .c{$(CPP_OBJS)}.obj::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cpp{$(CPP_OBJS)}.obj::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cxx{$(CPP_OBJS)}.obj::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .c{$(CPP_SBRS)}.sbr::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cpp{$(CPP_SBRS)}.sbr::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cxx{$(CPP_SBRS)}.sbr::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  MTL=midl.exe
  MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /o NUL /win32 
  RSC=rc.exe
  RSC_PROJ=/l 0x809 /fo"$(INTDIR)\test.res" /d "NDEBUG" 
  BSC32=bscmake.exe
  BSC32_FLAGS=/nologo /o"$(OUTDIR)\test.bsc" 
  BSC32_SBRS= \
        
  LINK32=link.exe
  LINK32_FLAGS=..\Release\install.lib kernel32.lib user32.lib gdi32.lib\
   winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo 
/subsystem:windows\
   /incremental:no /pdb:"$(OUTDIR)\test.pdb" /machine:I386 /def:".\test.def"\
   /out:"$(OUTDIR)\test.exe" 
  DEF_FILE= \
        ".\test.def"
  LINK32_OBJS= \
        "$(INTDIR)\test.obj" \
        "$(INTDIR)\test.res"
  
  "$(OUTDIR)\test.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
      $(LINK32) @<<
    $(LINK32_FLAGS) $(LINK32_OBJS)
  <<
  
  !ELSEIF  "$(CFG)" == "test - Win32 Debug"
  
  OUTDIR=.\Debug
  INTDIR=.\Debug
  # Begin Custom Macros
  OutDir=.\Debug
  # End Custom Macros
  
  !IF "$(RECURSE)" == "0" 
  
  ALL : "$(OUTDIR)\test.exe"
  
  !ELSE 
  
  ALL : "$(OUTDIR)\test.exe"
  
  !ENDIF 
  
  CLEAN :
        [EMAIL PROTECTED] "$(INTDIR)\test.obj"
        [EMAIL PROTECTED] "$(INTDIR)\test.res"
        [EMAIL PROTECTED] "$(INTDIR)\vc50.idb"
        [EMAIL PROTECTED] "$(INTDIR)\vc50.pdb"
        [EMAIL PROTECTED] "$(OUTDIR)\test.exe"
        [EMAIL PROTECTED] "$(OUTDIR)\test.ilk"
        [EMAIL PROTECTED] "$(OUTDIR)\test.pdb"
  
  "$(OUTDIR)" :
      if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
  
  CPP=cl.exe
  CPP_PROJ=/nologo /MLd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D 
"_WINDOWS"\
   /Fp"$(INTDIR)\test.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c 
  CPP_OBJS=.\Debug/
  CPP_SBRS=.
  
  .c{$(CPP_OBJS)}.obj::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cpp{$(CPP_OBJS)}.obj::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cxx{$(CPP_OBJS)}.obj::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .c{$(CPP_SBRS)}.sbr::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cpp{$(CPP_SBRS)}.sbr::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  .cxx{$(CPP_SBRS)}.sbr::
     $(CPP) @<<
     $(CPP_PROJ) $< 
  <<
  
  MTL=midl.exe
  MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 
  RSC=rc.exe
  RSC_PROJ=/l 0x809 /fo"$(INTDIR)\test.res" /d "_DEBUG" 
  BSC32=bscmake.exe
  BSC32_FLAGS=/nologo /o"$(OUTDIR)\test.bsc" 
  BSC32_SBRS= \
        
  LINK32=link.exe
  LINK32_FLAGS=..\Debug\install.lib wsock32.lib kernel32.lib user32.lib 
gdi32.lib\
   winspool.lib comdlg32.lib advapi32.lib shell32.lib /nologo 
/subsystem:windows\
   /incremental:yes /pdb:"$(OUTDIR)\test.pdb" /debug /machine:I386\
   /def:".\test.def" /out:"$(OUTDIR)\test.exe" /pdbtype:sept 
  DEF_FILE= \
        ".\test.def"
  LINK32_OBJS= \
        "$(INTDIR)\test.obj" \
        "$(INTDIR)\test.res"
  
  "$(OUTDIR)\test.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
      $(LINK32) @<<
    $(LINK32_FLAGS) $(LINK32_OBJS)
  <<
  
  !ENDIF 
  
  
  !IF "$(CFG)" == "test - Win32 Release" || "$(CFG)" == "test - Win32 Debug"
  SOURCE=.\test.c
  
  !IF  "$(CFG)" == "test - Win32 Release"
  
  
  "$(INTDIR)\test.obj" : $(SOURCE) "$(INTDIR)"
  
  
  !ELSEIF  "$(CFG)" == "test - Win32 Debug"
  
  DEP_CPP_TEST_=\
        ".\test.h"\
        
  
  "$(INTDIR)\test.obj" : $(SOURCE) $(DEP_CPP_TEST_) "$(INTDIR)"
  
  
  !ENDIF 
  
  SOURCE=.\test.rc
  DEP_RSC_TEST_R=\
        ".\test.h"\
        ".\test.ico"\
        
  
  "$(INTDIR)\test.res" : $(SOURCE) $(DEP_RSC_TEST_R) "$(INTDIR)"
        $(RSC) $(RSC_PROJ) $(SOURCE)
  
  
  
  !ENDIF 
  
  
  
  
  1.1                  apache-1.3/src/os/win32/installer/installdll/test/test.rc
  
  Index: test.rc
  ===================================================================
  //Microsoft Developer Studio generated resource script.
  //
  #include "resource.h"
  
  #define APSTUDIO_READONLY_SYMBOLS
  /////////////////////////////////////////////////////////////////////////////
  //
  // Generated from the TEXTINCLUDE 2 resource.
  //
  #define APSTUDIO_HIDDEN_SYMBOLS
  #include "windows.h"
  #undef APSTUDIO_HIDDEN_SYMBOLS
  #include "test.h"
  #include "winver.h"
  
  /////////////////////////////////////////////////////////////////////////////
  #undef APSTUDIO_READONLY_SYMBOLS
  
  /////////////////////////////////////////////////////////////////////////////
  // English (U.K.) resources
  
  #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
  #ifdef _WIN32
  LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK
  #pragma code_page(1252)
  #endif //_WIN32
  
  /////////////////////////////////////////////////////////////////////////////
  //
  // Icon
  //
  
  // Icon with lowest ID value placed first to ensure application icon
  // remains consistent on all systems.
  IDI_TEST                ICON    DISCARDABLE     "test.ico"
  
  /////////////////////////////////////////////////////////////////////////////
  //
  // Menu
  //
  
  IDM_TEST MENU DISCARDABLE 
  BEGIN
      POPUP "&File"
      BEGIN
          MENUITEM "E&xit",                       IDM_EXIT
      END
      POPUP "&Test"
      BEGIN
          MENUITEM "Call &BeforeExit",            IDM_BEFOREEXIT
      END
      POPUP "&Help"
      BEGIN
          MENUITEM "&About",                      IDM_ABOUT
      END
  END
  
  
  #ifdef APSTUDIO_INVOKED
  /////////////////////////////////////////////////////////////////////////////
  //
  // TEXTINCLUDE
  //
  
  1 TEXTINCLUDE DISCARDABLE 
  BEGIN
      "resource.h\0"
  END
  
  2 TEXTINCLUDE DISCARDABLE 
  BEGIN
      "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
      "#include ""windows.h""\r\n"
      "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
      "#include ""test.h""\r\n"
      "#include ""winver.h""\r\n"
      "\0"
  END
  
  3 TEXTINCLUDE DISCARDABLE 
  BEGIN
      "\r\n"
      "\0"
  END
  
  #endif    // APSTUDIO_INVOKED
  
  
  /////////////////////////////////////////////////////////////////////////////
  //
  // Dialog
  //
  
  IDD_ABOUT DIALOG DISCARDABLE  0, 0, 186, 47
  STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
  CAPTION "Dialog"
  FONT 8, "MS Sans Serif"
  BEGIN
      DEFPUSHBUTTON   "OK",IDOK,129,26,50,14
      LTEXT           "Apache Install DLL Tester",IDC_STATIC,7,7,172,14,NOT 
                      WS_GROUP
  END
  
  
  /////////////////////////////////////////////////////////////////////////////
  //
  // DESIGNINFO
  //
  
  #ifdef APSTUDIO_INVOKED
  GUIDELINES DESIGNINFO DISCARDABLE 
  BEGIN
      IDD_ABOUT, DIALOG
      BEGIN
          LEFTMARGIN, 7
          RIGHTMARGIN, 179
          TOPMARGIN, 7
          BOTTOMMARGIN, 40
      END
  END
  #endif    // APSTUDIO_INVOKED
  
  #endif    // English (U.K.) resources
  /////////////////////////////////////////////////////////////////////////////
  
  
  
  #ifndef APSTUDIO_INVOKED
  /////////////////////////////////////////////////////////////////////////////
  //
  // Generated from the TEXTINCLUDE 3 resource.
  //
  
  
  /////////////////////////////////////////////////////////////////////////////
  #endif    // not APSTUDIO_INVOKED
  
  
  
  

Reply via email to