سؤال

لدي تطبيق يجب أن يعمل بعد تطبيق آخر.يحتوي هذا التطبيق الثاني على خطأ يؤدي إلى عدم إغلاق منافذ COM في ظروف معينة.

أرغب في إغلاق جميع منافذ COM برمجيًا في تطبيقي للتأكد من عدم الإبلاغ عن أي أخطاء حول إغلاق المنافذ.هل من الممكن إذا كنت لا أملك كائنات تفتح منافذ COM؟

أحتاج إلى حل على .NET Framework, C# .

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

المحلول

لا توجد طريقة جيدة وسهلة:

  • أ جيد الطريقة هي إصلاح التطبيق الآخر.أو إذا كان ذلك مستحيلاً، لكتابة برنامج تشغيل جهاز عامل التصفية (مشابه لبرنامج تشغيل المنفذ ولكن للمنافذ التسلسلية بدلاً من المنافذ المتوازية) والذي سيوضع أعلى برنامج تشغيل جهاز المنفذ التسلسلي والذي قد يعرض أكثر من نقطة اتصال واحدة (واحدة يستخدمها التطبيق الآخر، الذي يمر عبر برنامج التشغيل الحقيقي الأساسي، و"الباب الخلفي" الآخر الذي يستخدمه تطبيقك الخاص...لن يرى السائق الحقيقي سوى عميل واحد، أي.برنامج تشغيل الفلتر الذي يوجد فوقه)
  • ان سهل الطريقة هي قصف العملية الأخرى (إنهاءها بالقوة).

نصائح أخرى

لقد مررت بهذا مؤخرًا ولدي القليل لأضيفه ...تقوم معظم برامج تشغيل منافذ COM "بإلغاء قفل" المنفذ عند تمكين الجهاز وتعطيله في إدارة الأجهزة.وهذا يعني أن طريقة (C#) لإنجاز هذه المهمة موضحة في الحل:

وظيفة Win32 API لتمكين/تعطيل الجهاز برمجياً

المعلومات التي تحتاج إلى معرفتها لاستخدام هذا الحل لمنافذ COM هي:

  1. المعرف الفريد العمومي (GUID) لمنافذ COM:{4d36e978-e325-11ce-bfc1-08002be10318} (CLSID_Ports)
  2. "مسار المثيل" للمنفذ الذي ترغب في إعادة تعيينه

منذ أن قلت أنك تريد إعادة تعيين الجميع المنافذ، قد ترغب في تعديل المكتبة في هذا المثال للتكرار عبر كافة المنافذ عن طريق تغيير:

// Find the index of our instance. i.e. the touchpad mouse - I have 3 mice attached...
int index = GetIndexOfInstance(diSetHandle, diData, instanceId);
// Disable...
EnableDevice(diSetHandle, diData[index], enable);

إلى شيء مثل هذا:

for (int index = 0; index < diData.Length; index++)
{
    EnableDevice(diSetHandle, diData[index], enable);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top