Windows NT, Windows 2000 ve Windows XP'de VDMDBG işlevler nasıl kullanılır

Makale çevirileri Makale çevirileri
Makale numarası: 182559 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Hatta bir 32-bit ortamda programlama, 16 bit uygulamalar ile çalışma gerekli olduğu zamanları vardır. Windows NT'DE 16 bit uygulamalar, bir sanal DOS makinesi (VDM) içinde çalışır. VDMDBG.dll 16 bit uygulamalar ile çalışmak için faydalı çok sayıda işlevleri içerir. Bu kitaplık Microsoft Platform SDK'ın bir parçasıdır.

VDMDBG işlevleri, numaralandırma, oluşturmak ve (Görevler) içinde bir VDM 16 bit işlemleri sona erdirmek için iyi bir yolu sağlar. Bu makalede, Microsoft Windows NT, Windows 2000 ve Windows XP bu işlevler kullanmayı açıklamaktadır.

Daha fazla bilgi

VDMDBG işlevlerini kullandığınızda, projenizi VDMDBG.lib bağlamanız gerekir.

Aşağıda belirtilen VDMDBG işlevleri, yalnızca kullanılabilir işlevler bir alt kümesidir. Ancak, belirtilmiş olan işlevler yalnızca bir hata ayıklayıcı için anlamlıdır.

VDM'ler numaralandırılıyor.

VDMEnumProcessWOW() işlevi, 16-bit Windows görevlerini çalıştıran tüm VDM'ler numaralandırmak için basit bir yol sağlar. Bu VDM'ler WowExec.exe görev içeriyor. DOS VDM'ler numaralandırılır.

Bu işlev için bildirim aşağıdaki gibidir:
   INT WINAPI VDMEnumProcessWOW( PROCESSENUMPROC fp, LPARAM lparam );
				
bu işlev için dönen değer çalışmakta olan VDM'ler sayısıdır ve numara önce numaralandırılmış Numaralandırma sona erdirildi. fp bir geri çağırma işlevi bir işaretçidir. Işlev için numaralandırılmış bir VDM her denir. lParam geri arama işlevine geçirilen bir kullanıcı tanımlı bir değerdir.

PROCESSENUMPROC gibi bildirildi:
   typedef BOOL ( WINAPI *PROCESSENUMPROC )(
      DWORD dwProcessId,
      DWORD dwAttributes,
      LPARAM lpUserDefined
   );
				
işlevi TRUE, Dur numaralandırma veya numaralandırma dwProcessId NTVDM.exe işlemin işlem KIMLIĞINI olduğundan devam etmek için YANLıŞ döndürmelidir. Bu KIMLIK, aşağıda adı geçen diğer VDM işlevi çağrılırken gerekir.

16-Bit Windows görevleri numaralandırılıyor.

Görevler içindeki belirli bir VDM Numaralandırılacak VDMEnumTaskWOW() ve VDMEnumTaskWOWEx()'nı kullanabilirsiniz. Ikisi arasındaki VDMEnumTaskWOWEx() sağladığından daha fazla bilgi için geri arama işlevini farktır. Bu görev numaralandırma işlevleriyle VDMEnumProcessWOW() tarafından döndürülen VDM'ler yalnızca kullanmalısınız. Her bir DOS uygulaması kendi VDM çalıştığından DOS VDM'ler kullanarak algılama yapmaz.

Bildirimlerin oldu?u:
   INT WINAPI VDMEnumTaskWOW( DWORD dwProcessId, TASKENUMPROC fp,
                              LPARAM lparam );
				
   INT WINAPI VDMEnumTaskWOWEx( DWORD dwProcessId, TASKENUMPROCEX fp,
                                LPARAM lparam );
				
sayıdır içinde belirtilen olan VDM çalışmakta olan görevlerin bu işlevlerden her biri için dönen değer veya sayı önce numaralandırılmış Numaralandırma sona erdirildi. dwProcessId VDM. fp işlem KIMLIĞI için bir geri çağırma işlevi bir işaretçi numarasıdır. Işlev, her görev için numaralandırılmış olarak adlandırılır. lParam geri arama işlevine geçirilen bir kullanıcı tanımlı bir değerdir.

TASKENUMPROC ve TASKENUMPROCEX şunlardır:
   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
   );
				
bu işlevleri, Dur numaralandırma veya numaralandırma devam etmek için YANLıŞ true döndürmelidir. Bir g ö r ü? mesinde hTask16, görevin sona erdirmek için kullanabilirsiniz.

Enumeration örneği

   // 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-Bit görevler oluşturma

VDMStartTaskInWOW() bir VDM içinde bir görev oluşturur. Bildirim aşağıdaki gibidir:
   BOOL WINAPI VDMStartTaskInWOW( DWORD dwProcessId, LPSTR lpCommandLine,
                                  WORD wShow );
				
görevi başarıyla başlatılırsa, bu işlevin dönüş değeri DOğRU ise, aksi halde, FALSE dwProcessId VDM işlem KIMLIğI ise lpCommandLine herhangi bir komut satırı parametreleri ile birlikte 16 bit uygulama adını gösteren bir dizedir. wShow penceresinde nasıl gösterileceğini belirtir. wShow 16-bit ShowWindow() işlevi için geçerli olan herhangi bir değer olabilir.

16-Bit görevleri sonlandırma

VDM arama VDMTerminateTaskWOW() içinde bir görev sona erdirmek için <a0></a0>. Bildirim aşağıdaki gibidir:
   BOOL WINAPI VDMTerminateTaskWOW( DWORD dwProcessId, WORD htask );
				
görevi başarıyla sonlandırıldı için bu işlevin dönüş değeri TRUE ise, aksi durumda FALSE dwProcessId VDM işlem KIMLIğI hTask görev tanıtıcısını ise olduğu. Bu görev tanıtıcı VDMEnumTaskWOW() veya VDMEnumTaskWOWEx() aracılığıyla elde edilebilir.

Bu yöntemi, Win32 TerminateProcess() kaba bir eşdeğeridir. Bunu, mümkünse kaçınılmalıdır. Veri kaybolmuş olabilir; böylece şansı cleanly bir çıkış için görev vermez. Win32, the WowExec sona erdirilen bir görevi temizleme garanti edilmez. Bu bozuk ve kullanılamaz VDM bırakabilirsiniz. Görev temiz bir şekilde sona erdirmek için <a0></a0>, en üst düzey penceresi için bir WM_CLOSE gönderin.

16 Bitlik DOS uygulamalar ile ilgili not

Hiçbiri VDMDBG işlevlerinin 16 bitlik DOS uygulamalarla çalışır. DOS VDM'ler numaralandırılamadı, başka bir yöntemi kullanmanız gerekebilir. Ilk VDMEnumProcessWOW() tüm Win16 VDM'ler listesini oluşturmak için kullanın ve sonra başka bir düzen (örneğin, PSAPI) kullanarak NTVDM.exe tüm örneklerini numaralandırır. Win16 listesinde bulunan tüm numaralandırma gelen tüm NTVDM.exe bir DOS VDM ' dir. Oluşturabilir ve 16 bitlik DOS uygulamalarla CreateProcess() ve TerminateProcess() sonlandırın.

Özellikler

Makale numarası: 182559 - Last Review: 22 Şubat 2014 Cumartesi - Gözden geçirme: 3.4
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Win32 Uygulama Programlama Arabirimi, Ne zaman ne ile kullanilir:
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • the operating system: Microsoft Windows XP
Anahtar Kelimeler: 
kbnosurvey kbarchive kbmt kbapi kbhowto kbkernbase kbthread KB182559 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:182559

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com