Question

J'écris une fonction utilitaire win32 pour notre produit qui doit appeler un programme arbitraire via le shell et consigner sa sortie. Pour ce faire, nous redirigeons la sortie standard du processus enfant dans un tuyau:

    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);

Il existe une grande variété de programmes qui peuvent être appelés de cette façon, dont beaucoup ne sont pas sous notre contrôle. Nous rencontrons actuellement un problème où la sortie de nombreux programmes semble être tronquée après le premier caractère - généralement un signe certain qu'une chaîne WCHAR est utilisée par erreur en tant que CHAR.

Comment savoir si le processus enfant écrit sur son canal stdout en tant que CHAR ou WCHAR?

Était-ce utile?

La solution

En fin de compte, il n’existe aucun moyen fiable à 100% de le faire. Les poignées d'entrée / sortie d'un processus ne sont pas spécifiques à l'encodage. Ils fonctionnent simplement sur un flux d'octets. Il est tout à fait possible pour un processus d'écrire un fichier ASCII pendant un certain temps et de passer ultérieurement à Unicode.

Malheureusement, il n'est pas possible de dire à partir d'un flux d'octets avec une précision de 100% ce qu'est le codage sous-jacent. La seule façon de déterminer ceci est d’avoir un protocole de serrement de la main où le processus vous indique quel encodage il utilisera. Probablement pas une option dans ce cas.

Liens sur le sujet

Autres conseils

Je pense que vous devez négocier cela lorsque vous vous connectez. Vous pouvez utiliser PeekNamedPipe () et une estimation sur si cela ressemble à un caractère Unicode ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top