/* * Windows Exec & Help * */ #include "win.h" #define HELP_CONTEXT 0x0001 #define HELP_QUIT 0x0002 #define HELP_INDEX 0x0003 #define HELP_CONTENTS 0x0003 #define HELP_HELPONHELP 0x0004 #define HELP_SETINDEX 0x0005 #define HELP_SETCONTENTS 0x0005 #define HELP_CONTEXTPOPUP 0x0008 #define HELP_FORCEFILE 0x0009 #define HELP_KEY 0x0101 #define HELP_COMMAND 0x0102 #define HELP_PARTIALKEY 0x0105 #define HELP_MULTIKEY 0x0201 #define HELP_SETWINPOS 0x0203 WORD WinExec(LPSTR lpCmdLine, WORD nCmdShow) { int X, X2, C; char *ArgV[20]; printf("WinExec(%s, %u)\n", lpCmdLine, nCmdShow); for (X = X2 = C = 0; X < strlen(lpCmdLine) + 1; X++) { if ((lpCmdLine[X] == ' ') || (lpCmdLine[X] == '\0')) { ArgV[C] = (char *)malloc(X - X2 + 1); strncpy(ArgV[C], &lpCmdLine[X2], X - X2); ArgV[C][X - X2] = '\0'; C++; X2 = X + 1; } } ArgV[C] = NULL; for (C = 0; ; C++) { if (ArgV[C] == NULL) break; printf("--> '%s' \n", ArgV[C]); } switch(fork()) { case -1: printf("Can't 'fork' process !\n"); break; case 0: printf("New process started !\n"); execvp(ArgV[0], ArgV); printf("Child process died !\n"); exit(1); break; default: printf("Main process stay alive !\n"); break; } for (C = 0; ; C++) { if (ArgV[C] == NULL) break; free(ArgV[C]); } return(TRUE); } BOOL WinHelp(HWND hWnd, LPSTR lpHelpFile, WORD wCommand, DWORD dwData) { char *ArgV[6]; char str[32]; printf("WinHelp(%s, %u, %lu)\n", lpHelpFile, wCommand, dwData); switch(fork()) { case -1: printf("Can't 'fork' process !\n"); break; case 0: printf("New process started !\n"); ArgV[0] = "wine"; ArgV[1] = "/C:/windows/winhelp.exe"; ArgV[2] = lpHelpFile; switch (wCommand) { case HELP_CONTEXT: case HELP_KEY: case HELP_SETINDEX: sprintf(str, "%lu", dwData); ArgV[3] = str; default: ArgV[3] = NULL; } ArgV[4] = NULL; if (wCommand == HELP_HELPONHELP) ArgV[2] = NULL; /* _WinMain(ArgV, 2); */ execvp(ArgV[0], ArgV); printf("Child process died !\n"); exit(1); break; default: printf("Main process stay alive !\n"); break; } return(TRUE); }