Makale numarası: 154093 - Son Gözden Geçirme: 21 Kasım 2006 Salı - Gözden geçirme: 3.3

Nasıl yapılır: Windows 95, Windows 98 veya Windows Millennium Edition'ın altında 16-bit kodu'den 32-bit kodu arama

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Genellikle biraz aynı anda yerine aynı anda bağlantı noktası Win16 uygulamaları ve Win32 DLL'lere uygun olacaktır. Örneğin, 16 bit DLL Win32 için bağlantı noktası ancak yine de 16 bit kodundan aranacak isteyebilirsiniz. Bu makalede, 16 bit DLL 32 bit DLL çağırabileceğiniz bir mekanizma açıklanır. Düzeneği, bir thunk ve Microsoft Windows 95, Windows 98 altında uygulanan yöntem verilir veya Windows Millennium Edition (Me), düz bir thunk denir.

Thunk kod yazma, üç ana adım vardır:
  1. Thunk komut dosyası oluşturuluyor.
  2. 16 Bit DLL oluşturma.
  3. 32 Bit DLL oluşturma.

Daha fazla bilgi

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

Yeni bir düz thunk tasarlama thunk (.THK dosyası) kod oluşturma içerir. Bu komut dosyası ile thunk derleyici derlenip iki kez; her iki bayrakların bir kez bir Çevirici dil dosyasına derlenmiş:-DIS_16 ve - DIS_32. 16-Bit ve 32-bit Nesne Modülü sonucudur. Bu nesne modülleri 16-bit ve 32 bit DLL sırasıyla bağlıdır. Aşağıdaki şemada DLL'lerin oluşturulmasında kullanılan dosyaları özetler:
                       +------------+
                       | 16to32.THK |
                       +------------+
                             |
                       +------------+
                       | 16to32.ASM |
                       +------------+
                        /          \ 
               -DIS_16 /            \ -DIS_32
                      /              \ 
                 +-----------+ +-----------+
                 | 16THK.OBJ | | 32THK.OBJ |
                 +-----------+ +-----------+
                       /                  \ 
      +-------+    +-------+             +-------+
      | APP16 | -> | DLL16 | -- THUNK -- | DLL32 |
      +-------+    +-------+             +-------+
				

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

  1. Microsoft Visual C++ 1.5 x (16-bit derleyici) the thunk 16-bit yüzünün. The thunk 16-bit tarafında bir 16 bit DLL ' dir.
  2. Microsoft Visual C++ 2.x veya daha yüksek (32-bit derleyici) 32-bit tarafı için thunk. The thunk 32-bit tarafında bir 32 bit DLL ' dir.
  3. Thunk komut dosyalarını derlemek için Microsoft Win32 SDK Thunk derleyici (thunk.exe).
  4. Microsoft Macro Assembler (MASM) sürüm 6.1 veya Çevirici dil thunk derleyici çıkışını assembler diline derleme için daha yüksek.
  5. 16-Bit RC.EXE 16-bit thunk DLL sürüm 4.0 işaretlemek için Microsoft Win32 SDK'ın BINW16 dizininden.

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 32 Thunks-> thunk komut dosyasının aşağıdaki deyimi ile başlar:
enablemapdirect1632 = true;
Yalnızca bir thunk, ilk kez çalıştırıldığında, varsayılan olarak, 32 bit DLL yüklenir. Bu geç bağlama kullanıldığından, 16-bit kodu başlatılması 32 bit DLL tarafından gerçekleştirilen tüm eylemleri bağlıdır gerekir değil. 32 Bit DLL çünkü ilk thunk yalnızca onu çalıştırır, 16 bit DLL ilk kez yüklediğinde, 32 bit DLL DOSYASıNı yüklemede sorunlarla algılanacaktır değil. 32 Bit DLL dosyasının geç bağlama devre dışı bırakmak için <a0></a0>, thunk komut dosyanızda aşağıdaki satırı ekleyin:
preload32 = true;
Thunk derleyici thunk 16-bit tarafında __far __pascal bildirilmiş ve 32-bit yan __stdcall 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.

Aşağıdaki thunk komut dosyası parametreleri olmayan bir işlev anlatılmaktadır:
   enablemapdirect1632 = true;

   void MyThunk32()
   {
   }
				
eşdeğer bildirim olacaktır:
   C   language:    void WINAPI MyThunk32(void);
   C++ Language:    extern "C" void WINAPI MyThunk32();
				
aşağıdaki örnek komut dosyası işlevinde iki parametre alır ve bir değer verir. Ikinci parametre bir çıkış parametresidir ve 16 bit DLL'geçirilen bir işaretçi içerir:
   enablemapdirect1632 = true;

   typedef int   BOOL;
   typedef char *LPSTR;

   BOOL MyThunk32(LPSTR lpstrInput, LPSTR lpstrOutput)
   {
      lpstrInput  = input;   // optional; input is default
      lpstrOutput = output;
   }
				
ifade "lpstrOutput çıktı =" 32-bit işlevi bir 32-bit doğrusal adresinden seçicisini: uzaklık işaretçisi dönüştürülmesi gereken adres döndürecektir 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 =" işaretçi girdi ve çıktı için kullanılacak gittiği thunk derleyici bildirir. Bu işlevi çağrıldığında, doğrusal bir 32-bit adrese 16 bit şimdiye kadar (Seçici: uzaklık) işaretçi lpCircleInOut dönüştürmek ve sonra işlev döndürdüğünde bir 16 bit şimdiye kadar işaretçiyi 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 satırı bir 16-> 32 thunk komut dosyası derleme gösterilmiştir. Bu satır 16to32.thk adlı bir komut dosyası alır ve 16to32.asm adlı bir Çevirici dil dosyası oluşturur:
-t thk 16to32.thk -o 16to32.asm thunk
"-T thk" thunk işlevleri Çevirici dil dosyasında "thk_" öneki için thunk derleyici seçeneği bildirir. Bu önek, birden fazla thunk komut dosyası çifti dll bağlarken kullanılır ve her iki 16, 32 ve 16 thunks-> 32-> içeren dll bir çift oluşturmak için yararlıdır.

16 Bit DLL oluşturma

  1. 16 Bit DLL "DllEntryPoint" adında bir işlev adı 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 from the thunk script
       BOOL WINAPI __export thk_ThunkConnect16(LPSTR lpDll16,
                                               LPSTR lpDll32,
                                               WORD  hInst,
                                               DWORD dwReason);
    
        BOOL WINAPI thk_thunkConnect16(LPSTR, LPSTR, WORD, DWORD);
    
        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. Aşağıdaki satırları için 16 bit DLL modülünü <a1>tanım</a1> (DEF) dosyası ALıR bölümünde içerir:
       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 olması gerekiyor, ancak herhangi bir sıra numarası olabilir:
       THK_THUNKDATA16 @1  RESIDENTNAME
       DllEntryPoint   @2  RESIDENTNAME
    						
  4. Win16 uygulama çağıracaktır 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.
  5. The thunk (önceden derlenmiş ise) gibi derleme:
       thunk -t thk 16to32.thk -o 16to32.asm
    						
  6. Sonra 16-bit Nesne Modülü olarak thunk derleyici tarafından üretilen Çevirici dil dosyası bir araya getirin. Aşağıdaki satırı bir örnek gösterilmektedir:
    ml /DIS_16 /c /W3 /nologo /Fo thk16.obj 16to32.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ı >
    Win32 SDK ile birlikte sağlanan kaynak derleyici bu-40 seçeneği kullanılabilir.

    Not: DLL sürüm 4.0</a0> ile işaretlenmiş BINW16 dizinindeki RC.EXE emin olun. Microsoft Visual C++ 16-bit sürümleriyle gelen RC.EXE DLL sürüm 4.0 işaretler.

32 Bit DLL oluşturma

  1. 32 Bit DLL dosyanızın DllMain içinde olarak, a?a??da gösterildi?i gibi thk_ThunkConnect32 DllMain adlı her adlı thunk derleyici tarafından oluşturulan bir işlev çağrısı yapmanız gerekir ("thk" thunk derleyici - t anahtarını önekinden'dir):
       // prototype for function in .OBJ from the thunk script
       BOOL WINAPI thk_ThunkConnect32 (LPSTR     lpDll16,
                                       LPTSR     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. Aşağıdaki satırları için 32 bit DLL modülünü <a1>tanım</a1> (.def) dosyası EXPORTS bölümünde içerir:
    thk_ThunkData32
    						
  3. Thunking işlevleri ver. 32 Bit DLL modülünü <a1>tanım</a1> (DEF) dosyası veya __declspec(dllexport) anahtar sözcüğünü de kullanabilirsiniz. Bildirilen ve __stdcall tanımlanan emin olun. 32 Bit DLL C++ ile yazılmışsa, bunları da extern "C" bildirmek dikkat edin. Bu işlevler, thunk 16-bit kenarına göre adlandırılır.
  4. (Önceden derlenmiş ise) gibi thunk komut dosyası derleme:
    thunk -t thk 16to32.thk -o 16to32.asm
    						
  5. Bir 32-bit Nesne Modülü olarak thunk derleyici tarafından üretilen Çevirici dil dosyası bir araya getirin. Aşağıdaki satırı bir örnek gösterilmektedir:
    ml /DIS_32 /c /W3 /nologo /coff /Fo thk32.obj 16to32.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 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.

Referanslar

Düz thunks hata ayıklama hakkında daha fazla bilgi için Microsoft Knowledge Base'de aşağıdaki makaleye başvurun:
133722  (http://support.microsoft.com/kb/133722/EN-US/ ) Düz Thunks hata ayıklama hakkında

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
Anahtar Kelimeler: 
kbmt kbapi kbkernbase kbnetwork kbthunks KB154093 KbMttr
Otomatik TercümeOtomatik Tercüme
Ö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:154093  (http://support.microsoft.com/kb/154093/en-us/ )
Retired KB ArticleKullanım Dışı Bilgi Bankası İçeriği Yasal Uyarı
Bu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.