سؤال

أنا أكتب وظيفة أداة مساعدة win32 لمنتجنا الذي يحتاج إلى استدعاء برنامج عشوائي عبر الصدفة وتسجيل مخرجاته.نقوم بذلك عن طريق إعادة توجيه stdout من العملية الفرعية إلى أنبوب:

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

هناك مجموعة واسعة من البرامج التي يمكن تسميتها بهذه الطريقة، والعديد منها لا يقع تحت سيطرتنا.نشهد حاليًا مشكلة حيث يبدو أن مخرجات العديد من البرامج قد تم اقتطاعها بعد الحرف الأول — عادةً ما تكون علامة أكيدة على أن سلسلة WCHAR يتم استخدامها عن طريق الخطأ كـ CHAR.

كيف يمكنني معرفة ما إذا كانت العملية الفرعية تكتب إلى أنبوب stdout الخاص بها كـ CHAR أو WCHAR؟

هل كانت مفيدة؟

المحلول

خلاصة القول هي أنه لا توجد طريقة موثوقة 100% للقيام بذلك.مقابض الإدخال/الإخراج للعملية ليست محددة للترميز.إنهم يعملون ببساطة على دفق من البايتات.من الممكن تمامًا أن تقوم إحدى العمليات بكتابة ASCII لفترة من الوقت ثم التبديل إلى Unicode لاحقًا.

لسوء الحظ، ليس من الممكن معرفة التشفير الأساسي من خلال مجموعة من البايتات بدقة 100%.الطريقة الوحيدة لتحديد ذلك هي أن يكون لديك بروتوكول مصافحة حيث تخبرك العملية بالتشفير الذي ستستخدمه.من المحتمل ألا يكون خيارًا في هذه الحالة.

روابط حول الموضوع

نصائح أخرى

وأعتقد أن لديك للتفاوض أنه عند الاتصال. هل يمكن استخدام PeekNamedPipe () و تخمين مقرها على إذا كان يبدو وكأنه حرف Unicode ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top