كيفية استخدام وظائف VDMDBG على Windows NT و Windows 2000 و Windows XP

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

182559
تمت أرشفة هذه المقالة. وتظهر "كما هي" ولن يتم تحديثها بعد الآن.
الموجز
حتى عند البرمجة في بيئة 32-بت ، توجد أوقات الضرورية عند العمل مع التطبيقات ذات 16 بت. في Windows NT أو تشغيل التطبيقات ذات 16 بت داخل الظاهري DOS الجهاز (VDM). يحتوي VDMDBG.dll على العديد من الدالات المفيدة للعمل مع التطبيقات ذات 16 بت. هذه المكتبة جزءاً من Microsoft Platform SDK.

توفر وظائف VDMDBG طريقة جيدة تعداد إنشاء وإنهاء عمليات 16-بت (المهام) داخل VDM. توضح هذه المقالة كيفية استخدام هذه الدالات في Microsoft Windows NT و Windows 2000 و Windows XP.
معلومات أخرى
عند استخدام أي من وظائف VDMDBG تحتاج إلى ربط VDMDBG.lib مع المشروع الخاص بك.

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

تعداد VDMs

دالة VDMEnumProcessWOW() يوفر طريقة بسيطة تعداد كافة VDMs تشغيل مهام Windows 16-بت. تتضمن هذه VDMs المهمة WowExec.exe. لم يتم تعداد VDMs DOS.

يتم تعريف هذه الدالة كما يلي:
   INT WINAPI VDMEnumProcessWOW( PROCESSENUMPROC fp, LPARAM lparam );				
قيمة الإرجاع للدالة هذا هو عدد VDMs قيد التشغيل حالياً أو تم إنهاء التعداد قائمة تعداد قبل الأرقام. fp مؤشر إلى وظيفة رد اتصال. يتم استدعاء الدالة كل VDM يتم تعداد. lParam القيمة المعرفة من قبل المستخدم التي يتم تمريرها إلى وظيفة رد الاتصال.

تم التصريح PROCESSENUMPROC كما يلي:
   typedef BOOL ( WINAPI *PROCESSENUMPROC )(      DWORD dwProcessId,      DWORD dwAttributes,      LPARAM lpUserDefined   );				
يجب إرجاع الدالة TRUE إلى إيقاف التعداد أو FALSE متابعة التعداد. dwProcessId هو معرّف العملية للعملية NTVDM.exe. ستحتاج هذا المعرّف عند استدعاء دالات VDM الأخرى المذكورة أدناه.

تعداد مهام Windows 16-بت

يمكنك استخدام VDMEnumTaskWOW() VDMEnumTaskWOWEx() تعداد المهام ضمن VDM معينة. الاختلاف بينهما أن VDMEnumTaskWOWEx() يوفر مزيد من المعلومات إلى وظيفة رد الاتصال. يجب استخدام VDMs بإرجاعها VDMEnumProcessWOW() بدالات التعداد هذه المهام فقط. باستخدام VDMs DOS لا تجري ملائماً لأنه يتم تشغيل كل تطبيق DOS في VDM الخاصة به.

يتم التصريحات:
   INT WINAPI VDMEnumTaskWOW( DWORD dwProcessId, TASKENUMPROC fp,                              LPARAM lparam );				
   INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,                                LPARAM lparam );				
القيمة المرجعة لكل من هذه الدالات عدد المهام قيد التشغيل حالياً ضمن VDM المشار إليه أو تم إنهاء التعداد قائمة تعداد قبل الأرقام. dwProcessId معرّف العملية fp VDM. مؤشر وظيفة رد اتصال. يتم استدعاء الدالة لكل مهمة يتم تعداد. lparam القيمة المعرفة من قبل المستخدم التي يتم تمريرها إلى وظيفة رد الاتصال.

TASKENUMPROC و TASKENUMPROCEX يتم تعريف كالتالي:
   typedef BOOL ( WINAPI *TASKENUMPROC )(      DWORD dwThreadId,      WORD hMod16,      WORD hTask16,      LPARAM lpUserDefined   );				
   typedef BOOL ( WINAPI *TASKENUMPROCEX )(      DWORD dwThreadId,      WORD hMod16,      WORD hTask16,      PSZ pszModName,      PSZ pszFileName,      LPARAM lpUserDefined   );				
يجب أن هذه الدالات بإرجاع TRUE إلى إيقاف التعداد أو FALSE متابعة التعداد. يمكنك استخدام hTask16 في استدعاء إنهاء المهمة.

مثال التعداد

   // Enumerate all 16-bit tasks on the system.   #include <windows.h>   #include <stdio.h>   #include <vdmdbg.h>   BOOL WINAPI ProcessEnumProc( DWORD, DWORD, LPARAM );   BOOL WINAPI TaskEnumProcEx( DWORD, WORD, WORD, PSZ, PSZ, LPARAM );   void main()   {      // Enumerate VDMs.      VDMEnumProcessWOW(         (PROCESSENUMPROC)ProcessEnumProc,         (LPARAM)NULL      );   }   BOOL WINAPI ProcessEnumProc( DWORD dwProcessId, DWORD dwAttrib,      LPARAM t )   {      printf("\nProcess ID: %d\n", dwProcessId);      // Use process ID of VDM to enumerate through its tasks.      VDMEnumTaskWOWEx(         dwProcessId,         (TASKENUMPROCEX)TaskEnumProcEx,         (LPARAM)NULL      );      // Keep enumerating.      return FALSE;   }   BOOL WINAPI TaskEnumProcEx( DWORD dwThreadId, WORD hMod16, WORD hTask16,      PSZ pszModName, PSZ pszFileName, LPARAM lParam )   {      //print task's information      printf("Thread ID: %d\n", dwThreadId);      printf("Module handle: %d\n", hMod16);      printf("Task handle: %d\n", hTask16);      printf("Module Name: %s\n", pszModName);      printf("File Name: %s\n", pszFileName);      // Keep enumerating.      return FALSE;   }				

إنشاء مهام 16-بت

ينشئ VDMStartTaskInWOW() مهمة ضمن VDM. تم التصريح كما يلي:
   BOOL WINAPI VDMStartTaskInWOW( DWORD dwProcessId, LPSTR lpCommandLine,                                  WORD wShow );				
هو قيمة الإرجاع هذه الدالة TRUE عند تشغيل المهمة بنجاح ، وإلا كان FALSE. dwProcessId هو معرّف عملية VDM الذي. lpCommandLine سلسلة تشير إلى اسم الملف تطبيق 16-بت مع أي معلمات سطر الأوامر. wShow الإشارة إلى كيفية إظهار الإطار. يمكن wShow أي قيمة صالحة للدالة ShowWindow() 16-بت.

إنهاء المهام 16-بت

إنهاء مهمة ضمن مكالمة VDM VDMTerminateTaskWOW(). تم التصريح كما يلي:
   BOOL WINAPI VDMTerminateTaskWOW( DWORD dwProcessId, WORD htask );				
هو قيمة الإرجاع هذه الدالة TRUE إذا تم بنجاح إنهاء المهمة ، وإلا كان يتم FALSE. dwProcessId hTask معرّف. عملية VDM هو المؤشر إلى المهمة. يمكن الحصول على هذا المؤشر المهمة خلال VDMEnumTaskWOW() أو VDMEnumTaskWOWEx().

هذا الأسلوب مكافئ لقدرة TerminateProcess() في Win32. أنه يجب تجنب ، إذا كان ذلك ممكناً. فإنه لا يمنح المهمة إلى إنهاء cleanly فرصة لذا قد تفقد البيانات. بعكس Win32 ، WowExec ولا يُضمن تنظيف بعد إنهاء مهمة. يمكن ترك هذا في VDM تالفة وغير قابل للاستخدام. لإنهاء المهمة بوضوح إرسال WM_CLOSE إلى إطار المستوى الأعلى الخاص به.

ملاحظة باعتبار تطبيقات DOS 16-بت

أي من وظائف VDMDBG العمل مع تطبيقات DOS 16-بت. تعداد VDMs DOS ، تحتاج إلى استخدام أسلوب آخر. أولاً، يمكنك قد استخدم VDMEnumProcessWOW() لجعل قائمة VDMs Win16 كافة ثم ثم تعداد كافة مثيلات NTVDM.exe باستخدام مخطط آخر (مثل PSAPI). هو أي NTVDM.exe من الكامل التعداد لم يكن في القائمة Win16 VDM DOS. يمكنك إنشاء ثم إنهاء التطبيقات DOS ذات 16 بت مع CreateProcess() و TerminateProcess().

تحذير: تمت ترجمة هذا المقال تلقائياً

خصائص

رقم الموضوع: 182559 - آخر مراجعة: 02/24/2014 08:32:37 - المراجعة: 3.4

  • Microsoft Win32 واجهة برمجة تطبيقات
  • kbnosurvey kbarchive kbmt kbapi kbhowto kbkernbase kbthread KB182559 KbMtar
تعليقات