J'ai une application Win32 que je crée et elle envoie une chaîne d'un processus à un autre via un tube nommé. Toutefois, le processus qui appelle ReadFile sur le canal obtient la chaîne avec des données brouillées. Il renvoie le nombre d'octets écrits correctement, mais les 8 derniers caractères de la chaîne sont tronqués.Comment réparer un texte brouillé en utilisant WriteFile sur un tuyau?
Voici le code pour créer le tuyau, et écrit à ce:
myPipe = CreateNamedPipe(L"\\\\.\\pipe\\testpipe", PIPE_ACCESS_OUTBOUND, PIPE_NOWAIT, 10, 512, 512, 10, NULL);
TCHAR title[128];
GetWindowText(foundHwnd, title, 128);
wstring windowTitle(title);
vector<wstring> splitVec;
boost::split(splitVec, windowTitle, boost::algorithm::is_any_of(wstring(L"|")));
WriteFile(myPipe, splitVec[0].c_str(), splitVec[0].size(), &wrote, NULL);
Et voici le code qui le lit:
if (WaitNamedPipe(L"\\\\.\\pipe\\testpipe", 5000) == 0) {
MessageBox(NULL, L"Unable to wait for pipe", L"Error", MB_OK);
return false;
}
myPipe = CreateFile(L"\\\\.\\pipe\\testpipe", GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (myPipe == INVALID_HANDLE_VALUE) {
MessageBox(NULL, L"Unable to open pipe", L"Error", MB_OK);
return false;
}
// Other code here...
TCHAR buf[512];
DWORD read;
success = ReadFile(myPipe, buf, 512, &read, NULL);
if (read > 0)
MessageBox(NULL, buf, L"Got Data", MB_OK);
Lorsque MessageBox est affichée, la fin de la la chaîne est brouillée et je ne sais pas pourquoi. Des idées?
Merci!
Merci! J'avais maintenant un problème avec la moitié de la chaîne étant envoyée. J'avais besoin du (lstrlen (..) + 1) * sizeof (TCHAR), comme montré dans l'exemple. – staackuser2
Ah, oui. Caractères multi-octets. Je n'ai même pas pensé à ça. – tvanfosson
bonne prise, j'ai mis à jour ma réponse en le fixant avec * sizeof (TCHAR) –