2009-03-10 19 views
3

Ürünümüzü, kabuk aracılığıyla rasgele bir program çağırması ve çıkışını günlüğe kaydetmesi gereken bir win32 yardımcı programı işlevi yazıyorum. Biz bir boru içine çocuğun süreçten stdout'u yönlendirerek yapabilirsiniz:Win32: Stdout tanıtıcısının char mı yoksa wchar akışının mı olduğunu belirleyin.

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

kontrolümüz altında olmayan birçoğu bu şekilde adlandırılabilir programların, geniş bir çeşitlilik vardır. Şu anda, birçok programın çıktısının ilk karakterden sonra kırpıldığı gibi bir problem görüyoruz --- genellikle bir WCHAR dizesinin yanlışlıkla CHAR olarak kullanıldığı kesin işareti.

Çocuk işleminin stdout borusuna CHAR veya WCHAR olarak yazıp yazmadığını nasıl anlarım?

cevap

3

Bunu yapmak için% 100 güvenilir bir yol yoktur. Bir işlemin giriş/çıkış tutamaçları belirli bir kodlama yapmaz. Sadece bir bayt akışı üzerinde çalışırlar. Bir işlemin ASCII'yi bir süre için yazması ve daha sonra Unicode'a geçmesi tamamen mümkündür.

Maalesef, temel kodlamanın ne olduğunu% 100 doğrulukla bir bayt akışından söylemek mümkün değildir. Bunu belirlemenin tek yolu, işlemin hangi kodlamayı kullanacağını bildirdiği el sallama protokolüne sahip olmaktır. Bu durumda bir seçenek değil. Konuyla

üzerinde

Linkler

1

Bağlandığınızda bunu görüşmeniz gerektiğini düşünüyorum. PeekNamedPipe()'u kullanabilir ve bir unicode karakteri gibi göründükçe tahmin edebilirsiniz ...