Domanda

Sto scrivendo una funzione di utilità win32 per il nostro prodotto che deve chiamare un programma arbitrario tramite la shell e registrarne l'output. Lo facciamo reindirizzando lo stdout dal processo figlio in una pipe:

    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
    saAttr.bInheritHandle = TRUE; 
    saAttr.lpSecurityDescriptor = NULL; 

    CreatePipe(&hReadPipe, &hWritePipe, &saAttr, 0);

    // Redirect the first process stdout to our write pipe
    // so that we can read its output from the read pipe.
    startUpInfo.dwFlags = STARTF_USESTDHANDLES;
    startUpInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
    startUpInfo.hStdOutput = hWritePipe;
    startUpInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);

    CreateProcessA(NULL, szCmdLine, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startUpInfo[i], &procInfo);

Esistono molti programmi che possono essere chiamati in questo modo, molti dei quali non sono sotto il nostro controllo. Attualmente stiamo riscontrando un problema in cui l'output di molti programmi sembra essere troncato dopo il primo carattere --- di solito un segno sicuro che una stringa WCHAR viene erroneamente utilizzata come CHAR.

Come posso sapere se il processo figlio sta scrivendo nella sua pipe stdout come CHAR o WCHAR?

È stato utile?

Soluzione

La linea di fondo è che non esiste un modo affidabile al 100% per farlo. Gli handle di input / output di un processo non sono specifici della codifica. Operano semplicemente su un flusso di byte. È completamente possibile per un processo scrivere ASCII per un po 'e passare successivamente a Unicode.

Sfortunatamente non è possibile dire da un flusso di byte con una precisione del 100% quale sia la codifica sottostante. L'unico modo per determinare questo è avere un protocollo di stretta di mano in cui il processo ti dice quale codifica utilizzerà. Probabilmente non è un'opzione in questo caso.

Link sull'argomento

Altri suggerimenti

Penso che devi negoziarlo quando ti connetti. È possibile utilizzare PeekNamedPipe () e basato su ipotesi acceso se sembra un carattere unicode ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top