Bana gelen Windows 95, Windows 98 ve Windows altında 32 bit kod 16-bit kodu Call nasıl kullanılır

Makale çevirileri Makale çevirileri
Makale numarası: 155763 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Geliştirici olarak, Win32 uygulamanızdan bir 16 bit dinamik bağlantı kitaplığı (DLL) tarafından sağlanan işlevselliği erişim gerekebilir. Win32 için bağlantı böylece özellikle, kaynak kodu için DLL yazdırmadıysanız bu geçerlidir. Bu makalede, 32 bit DLL 16 bit DLL çağırabileceğiniz bir mekanizma açıklanır. Düzenek bir thunk ve Microsoft Windows 95, Windows 98 altında uygulanan yöntem olarak bilinir ve Windows Millennium Edition, düz bir thunk denir.

Düz bir thunk oluşturmada kullanılan üç temel adımları açıklar:
  1. Thunk komut dosyasını oluşturun.
  2. 32 Bit DLL DOSYASıNı oluşturun.
  3. 16 Bit DLL DOSYASıNı oluşturun.

Daha fazla bilgi

Düz bir thunk 32-bit ve 16 bit DLL birlikte çalışan oluşur. 32 Bit DLL DOSYASı, BIR Win32 uygulaması çağırır ve 32 bit DLL 16 bit DLL dosyasında bir verilen işlevi çağırır. 16 Bit DLL işlevi döndürdüğünde, sırayla Win32 uygulamaya döndüren geri 32 bit DLL, verir. Tüm 32-bit, 16 bit kodundan geçiş yapmak ve yedeklemek gereken alt düzey ayrıntıları işlemek için Windows 95 32-bit ve 16-bit çekirdekleri arayarak 32-bit ve 16 bit DLL iş.

Yeni bir düz thunk tasarlama thunk (.thk dosyası) kod oluşturma içerir. Bu komut, ardından derlenip iki kez; bir kez ve - DIS_32 - DIS_16 iki bayrak ile bir Çevirici dil dosyasına Thunk Derleyici ile derlendi. Böylece hem 32-bit ve 16-bit bir nesne modülleri oluşturma. Bu nesne modülleri, 32-bit ve 16 bit DLL sırasıyla bağlıdır. Aşağıdaki şemada DLL'lerin oluşturulmasında kullanılan dosyaları özetler:
                         +------------+
                         | 32to16.thk |
                         +------------+
                               |
                         +------------+
                         | 32to16.asm |
                         +------------+
                           /         \ 
                  -DIS_32 /           \ -DIS_16
                        /              \ 
                  +-----------+  +-----------+
                  | 32THK.obj |  | 16THK.obj |
                  +-----------+  +-----------+
                        /                 \ 
        +-------+    +-------+             +-------+
        | APP32 | -> | DLL32 | -- THUNK -- | DLL16 |
        +-------+    +-------+             +-------+
				

Düz Thunks oluşturmak için gerekli araçları

  • Microsoft Visual C++ sürüm 1.5 için 16 bit yan thunk oluşturma (16-bit) derleyici x. The thunk 16-bit tarafında bir 16 bit DLL ' dir.
  • Microsoft Visual C++ sürüm 2.x veya daha yüksek (32-bit) derleyici thunk 32-bit tarafında oluşturma. The thunk 32-bit tarafında bir 32 bit DLL ' dir.
  • Thunk komut dosyalarını derlemek için Microsoft Win32 SDK Thunk derleyici (Thunk.exe).
  • Microsoft Macro Assembler (MASM) sürüm 6.1 veya Çevirici dil thunk derleyici çıkışını assembler diline derleme için daha yüksek.
  • 16-bit thunk DLL sürüm 4.0 işaretlemek için 16-bit rc.exe dosyasından Microsoft Win32 SDK'ın BINW16 dizin.

Thunk komut dosyası oluşturma

Thunk derleyicisinden bir thunk oluşturmak için kullanılan bir komut dosyası oluşturmanız gerekebilir. Thunk komut dosyası işlevlerinin thunks çağırmak istediğiniz işlevin prototipler ve yönünü her işlevi için parametre belirtimini türü tanımlarını içeren bir metin dosyasıdır. Örneğin, diğerleri yalnızca giriş parametrelerine gerek duyar, ancak bazı işlevler giriş ve çıkış parametrelerine gerek duyar. Thunk komut parametreleri giriş olup olmadığını açıklamak için özel sözdizimi, çıktı, veya her ikisini de giriş ve çıkış'ı kullanın.

16 Thunks-> 32 thunk komut dosyasının aşağıdaki deyimi ile başlar:
enablemapdirect3216 = true;
Thunk derleyici thunk 32-bit tarafında __stdcall bildirilmiş ve 16-bit yan __far __pascal olmasını bekler. (WINAPI bildirimi alır bu iki yüzüne de dikkate.) __Cdecl ve kuralları çağrılıyor __fastcall Thunk derleyici tarafından desteklenmiyor. Ancak, Thunk derleyici gerçekten __far, __pascal ya da __stdcall anahtar kabul etmez; kabul edilir.

Parametre olan bir fonksiyon için thunk komut dosyası aşağıdaki örnekte gösterilmiştir:
   enablemapdirect3216 = true;

   void MyThunk16()
   {
   }
				
eşdeğer bildirim olacaktır:
   C   language:  void WINAPI MyThunk16(void);
   C++ language:  extern "C" void WINAPI MyThunk16();
				
iki parametre alır ve değer döndüren bir işlev aşağıdaki örnek komut dosyası açıklanır. Ikinci parametre 32 bit DLL'geçirilen bir işaretçi içeren bir çıkış parametresidir.
   enablemapdirect3216 = true;

   typedef int   BOOL;
   typedef char *LPSTR;

   BOOL MyThunk16(LPSTR lpstrInput, LPSTR lpstrOutput)
   {
      lpstrInput  = input;    // optional; input is default
      lpstrOutput = output;
   }
				
Ifade "lpstrOutput çıktı =" 16-bit işlevi, bir Seçici: uzaklık işaretçisi, doğrusal bir 32-bit adresine dönüştürülmesi gereken bir adres verir Thunk derleyici bildirir.

Aşağıdaki thunk komut dosyası yapıları gibi daha karmaşık bir parametre türleri'ni kullanır. Bu örnek, giriş ve çıkış parametrelerini belirtmek için de gösterir.
   enablemapdirect1632 = true;

   typedef unsigned int UINT;
   typedef char *LPSTR;

   typedef struct _POINT {
      UINT x;
      UINT y;
   }POINT, *LPPOINT;

   typedef struct _CIRCLE {
      POINT center;
      UINT  radius;
   }CIRCLE, *LPCIRCLE;

   void MyThunk32( LPCIRCLE lpCircleInOut)
   {
      lpCircleInOut = inout;
   }
				
Ifade "lpCircleInOut inout =", bu işaretçiyi girdi ve çıktı için kullanılacak komut dosyası derleyici bildirir. Bu işlevi çağrıldığında, Seçici: uzaklık işaretçisi 32-bit doğrusal adresinden lpCircleInOut dönüştürmek ve sonra işlev döndürdüğünde doğrusal bir 32-bit adrese yeniden Thunk derleyici neden olur. Dönüştürme, Thunk derleyici tarafından oluşturulan thunk tarafından işlenir.

Derleyici Thunk kullanma

Thunk derleyici kullanımı aşağıdaki gibidir:
Thunk.exe/<inputfile>-o <outputfile>seçenekleri
Aşağıdaki komut satırını bir 32-> 16 thunk komut dosyası derleme gösterilmiştir. Bu satır 32to16.thk adlı thunk komut dosyası alır ve 32to16.asm adlı bir Çevirici dil dosyası oluşturur.
-t thk 32to16.thk -o 32to16.asm thunk
"-T thk" seçeneği "thk_." Çevirici dil dosyasını thunk fonksiyonlarında öneki için Thunk derleyici bildirir. Bu önek, birden fazla thunk komut dosyası çifti dll bağlarken kullanılır ve hem 32 16 ve 32 thunks-> 16-> içeren dll bir çift oluşturmak için yararlıdır. Her thunk komut dosyası, önek benzersiz olması gerekir.

32 Bit DLL oluşturma

  1. 32 Bit DLL dosyanızın DllMain işlevi thk_ThunkConnect32, a?a??da gösterildi?i gibi her bir nedenle (dwReason) DllMain adlı için adlı Thunk derleyici tarafından oluşturulan bir işlev çağrısı yapmak gerekir ("thk" Thunk derleyici -t anahtarını önekinden'dir):
          // prototype for function in .obj file from the thunk script
          BOOL WINAPI thk_ThunkConnect32(LPSTR     lpDll16,
                                         LPSTR     lpDll32,
                                         HINSTANCE hDllInst,
                                         DWORD     dwReason);
    
          BOOL WINAPI DllMain(HINSTANCE hDLLInst,
                              DWORD     dwReason,
                              LPVOID    lpvReserved)
          {
             if (!thk_ThunkConnect32("DLL16.DLL", "DLL32.DLL",
                                     hDLLInst, dwReason))
             {
                return FALSE;
             }
             switch (dwReason)
             {
                case DLL_PROCESS_ATTACH:
                   break;
    
                case DLL_PROCESS_DETACH:
                   break;
    
                case DLL_THREAD_ATTACH:
                   break;
    
                case DLL_THREAD_DETACH:
                   break;
             }
             return TRUE;
          }
    						
  2. Modülünde <a1>tanım</a1> (.def) dosyası EXPORTS bölümünde, aşağıdaki satırları için 32 bit DLL içerir. Örneğin:
          
       thk_ThunkData32
    						
  3. Win32 uygulamasını çağıran bir işlev ver. 32 Bit DLL modülünü <a1>tanım</a1> (.def) dosyası veya __declspec(dllexport) anahtar sözcük ya da kullanabilirsiniz. Işlevleri bildirilen ve __stdcall (veya WINAPI) tanımlanan emin olun. 32 Bit DLL C++ ile yazılmışsa, işlevler, aynı zamanda dış "C" bildirmek dikkat edin.
  4. (Önceden derlenmiş ise) gibi thunk komut dosyası derleme:
          thunk -t thk 32to16.thk -o 32to16.asm
    						
  5. Bir 32-bit Nesne Modülü olarak Thunk derleyici tarafından üretilen Çevirici dil dosyası bir araya getirin. Örneğin:
          ml /DIS_32 /c /W3 /nologo /coff /Fo thk32.obj 32to16.asm
    						
  6. Bu nesnenin modülü 32 bit DLL dosyasının bir parçası olarak bağlayın.
  7. 32 Bit DLL dosyasının bir parçası olarak Thunk32.lib kitaplığı bağlayın. 32-Bit alma kitaplığı Thunk derleyici tarafından oluşturulan kodunu kullanan 32-bit thunking Apı başvuru içeren Win32 SDK sağlanan budur.

16 Bit DLL oluşturma

  1. 16 Bit DLL "DllEntryPoint." adında bir işlev vermelisiniz Bu işlev thk__ThunkConnect16 adlı Thunk derleyici tarafından oluşturulan bir işlev için arama yapmanız gerekir ("thk" Thunk derleyici -t anahtarını önekinden'dir) her DllEntryPoint adlandırılır:
          // prototype for function in .obj file from the thunk script
          BOOL WINAPI __export thk_ThunkConnect16(LPSTR lpDll16,
                                                  LPSTR lpDll32,
                                                  WORD  hInst,
                                                  DWORD dwReason);
    
          BOOL WINAPI __export DllEntryPoint(DWORD dwReason,
                                             WORD  hInst,
                                             WORD  wDS,
                                             WORD  wHeapSize,
                                             DWORD dwReserved1,
                                             WORD  wReserved 2)
          {
             if (!thk_ThunkConnect16("DLL16.DLL",
                                     "DLL32.DLL",
                                     hInst,
                                     dwReason))
             {
                return FALSE;
             }
             return TRUE;
          }
    						
  2. Modülünde <a1>tanım</a1> (.def) dosyası ALıR) bölümünde, aşağıdaki satırları için 16 bit DLL içerir. Örneğin:
          C16ThkSL01      = KERNEL.631
          ThunkConnect16  = KERNEL.651
    						
  3. Modülünde <a1>tanım</a1> (.def) dosyası EXPORTS bölümünde, aşağıdaki satırları için 16 bit DLL içerir. THK_THUNKDATA16 Thunk Derleyici çıktısı derlenip nesne dosyasında tanımlanır. Bu simgeler her ikisi de RESIDENTNAME anahtar olmalıdır, ancak herhangi bir sıra numarası olabilir.
          THK_THUNKDATA16 @1  RESIDENTNAME
          DllEntryPoint   @2  RESIDENTNAME
    						
  4. Thunk işlevleri 16 bit DLL modülünü (.def) tanım dosyası (ingilizce) <a1>EXPORTS</a1> ifadesini ekleyin. Bildirilen ve __far __pascal __export (veya WINAPI __export) tanımlanan emin olun. DLL C++ ile yazılmışsa, bunları da extern "C" bildirmek dikkat edin. The thunk 32-bit</a1> tarafına, bu işlevler çağırır.
  5. (Önceden derlenmiş ise) gibi thunk komut dosyası derleme:
          thunk -t thk 32to16.thk -o 32to16.asm
    						
  6. Çevirici dil dosyanın bir 16 bit Nesne Modülü olarak Thunk derleyici tarafından üretilen bir araya getirin. Örneğin:
          ml /DIS_16 /c /W3 /nologo /Fo thk16.obj 32to16.asm
    						
  7. Bu nesnenin modülü 16 bit DLL dosyasının bir parçası olarak bağlayın.
  8. 16 Bit DLL sürüm 4. 0'ı işaretleyin. Bunu yapmak için <a0></a0>, kaynak derleyici (rc.exe) kullanın. Aşağıdaki satırı sözdizimi gösterilmiştir:
    RC -40 < DLL dosyası >
    Kaynak derleyici Win32 SDK ile sağlanan bu-40 seçeneği kullanılabilir.

    Not: BINW16 dizinindeki rc.exe dosyasını kullanabilir, böylece DLL sürüm 4.0</a0> ile işaretlenmiş emin olun. Microsoft Visual C++ 16-bit sürümleriyle gelen rc.exe dosya DLL sürüm 4.0 işaretlemez.

Referanslar

Düz thunks hata ayıklama hakkında daha fazla bilgi için Microsoft Knowledge Base'de aşağıdaki makaleye başvurun:
133722Nasıl yapılır: düz Thunks hata ayıklama

Özellikler

Makale numarası: 155763 - Last Review: 11 Temmuz 2005 Pazartesi - Gözden geçirme: 2.3
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Win32 Uygulama Programlama Arabirimi, Ne zaman ne ile kullanilir:
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
    • Microsoft Platform Software Development Kit - Ocak 2000 Sürümü
Anahtar Kelimeler: 
kbmt kbapi kbhowto kbkernbase kbnetwork kbprogramming kbthunks kbtshoot KB155763 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:155763

Geri Bildirim Ver

 

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