16비트 코드 아래에 Windows 95, Windows 98 및 Windows 32비트 코드에서 Me 호출 방법

기술 자료 번역 기술 자료 번역
기술 자료: 155763 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

개발자는 Win32 응용 프로그램에서 16비트 동적 연결 라이브러리 (DLL) 에 의해 제공된 기능을 액세스해야 할 수 있습니다. Win32로 이식할 수 있도록 특히 사용자가 소스 코드에 대한 DLL을 권한이 없는 경우 마찬가지입니다. 이 문서에서는 32비트 DLL 16 비트 DLL 불러도 메커니즘을 설명합니다. 메커니즘은 썽크 및 Microsoft Windows 95, Windows 98에서 구현된 메서드를 호출하고 Windows Millennium Edition 플랫 썽크 호출됩니다.

다음 플랫 썽크 만드는 것과 관련된 세 가지 주요 단계에 대해 설명합니다.
  1. 썽크 스크립트를 만듭니다.
  2. 32비트 DLL을 만듭니다.
  3. 16비트 DLL을 만듭니다.

추가 정보

플랫 썽크 32 비트 및 공동 작업을 16 비트 DLL 구성됩니다. 32비트 DLL을 Win32 응용 프로그램을 호출하는 32 비트 DLL 16 비트 DLL의 내보낸된 함수를 호출합니다. 16 비트 DLL 함수가 반환하는 경우 Win32 응용 프로그램에 다시 차례대로 반환하는 다시 32 비트 DLL을 반환합니다. 모든 32 비트 16 비트 코드 전환하는 확인한 다음 다시 데 필요한 낮은 수준의 세부 사항을 처리하기 위해 Windows 95 32비트 및 16비트 커널을 호출하여 32비트 및 16비트 DLL 작업.

디자인 새 플랫 썽크 썽크 스크립트 (.thk 파일) 만들기 작업이 포함됩니다. 이 스크립트는 다음 어셈블됩니다 두 번; 한 번 두 플래그 중 - DIS_32 및 - DIS_16 각 어셈블리 언어 파일에 썽크 컴파일러는 사용하여 컴파일됩니다. 32비트 및 16비트 개체 모듈을 만들 수 있습니다. 이러한 개체 모듈의 32비트 및 16비트 DLL 각각 연결됩니다. 다음 다이어그램은 DLL을 만드는 데 관련된 파일을 요약한:
                         +------------+
                         | 32to16.thk |
                         +------------+
                               |
                         +------------+
                         | 32to16.asm |
                         +------------+
                           /         \ 
                  -DIS_32 /           \ -DIS_16
                        /              \ 
                  +-----------+  +-----------+
                  | 32THK.obj |  | 16THK.obj |
                  +-----------+  +-----------+
                        /                 \ 
        +-------+    +-------+             +-------+
        | APP32 | -> | DLL32 | -- THUNK -- | DLL16 |
        +-------+    +-------+             +-------+
				

플랫 썽크 빌드 데 필요한 도구

  • Microsoft Visual C++ 버전 1.5 x 썽크를 만드는 16 비트 쪽에 대한 컴파일러 (16 비트). 썽크 오른쪽에 있는 16 비트 16 비트 DLL 입니다.
  • Microsoft Visual C++ 버전 2.x 또는 썽크 32 비트 쪽에 만드는 높은 (32비트) 컴파일러. 32 비트 쪽에 썽크 32 비트 DLL 입니다.
  • 썽크 컴파일러에서 썽크 스크립트를 컴파일하는 Microsoft Win32 SDK (Thunk.exe).
  • Microsoft 매크로 어셈블러 (MASM) 버전 6.1 이상을 썽크 컴파일러는 어셈블리 언어 출력 어셈블하는 것에 대한.
  • 16 비트 썽크 DLL 버전 4.0 표시하는 16 비트 Rc.exe 파일에서 Microsoft Win32 SDK BINW16 디렉터리.

썽크 스크립트 만들기

썽크 컴파일러에서 썽크를 만드는 데 사용할 수 있는 스크립트를 만들어야 합니다. 썽크 스크립트를 통해 썽크를 호출하려는 함수의 함수 프로토타입 및 각 함수에 대한 매개 변수의 방향 한 사양을 형식 정의를 포함하는 텍스트 파일입니다. 예를 들어, 있지만 다른 입력된 매개 변수가 필요한 있습니다 일부 함수는 입력 및 출력 매개 변수가 필요합니다. 특수 구문을 설명하는 매개 변수를 입력, 출력 또는 모두 입력 및 출력 썽크 스크립트를 사용합니다.

32 16 썽크->에 대한 썽크를 스크립트를 다음 문으로 시작합니다.
enablemapdirect3216 = true;
썽크 컴파일러 썽크 32 비트 쪽에 __stdcall으로 선언된 16 비트 쪽에 __far __pascal 수 있도록 기대하고 있습니다. (WINAPI 선언은 이 양쪽에서 모두 수행합니다.) __cdecl 및 __fastcall 호출 규칙을 썽크 컴파일러에서 지원되지 않습니다. 단, 썽크 컴파일러 실제로 __far, __pascal, 또는 __stdcall 키워드를 사용할 수 없습니다; 사용자가 간주됩니다.

다음 예제에서는 매개 변수가 없는 함수 썽크를 스크립트를 보여 줍니다:
   enablemapdirect3216 = true;

   void MyThunk16()
   {
   }
				
있는 동일한 선언 됩니다:
   C   language:  void WINAPI MyThunk16(void);
   C++ language:  extern "C" void WINAPI MyThunk16();
				
다음 예제 스크립트에서는 두 개의 매개 변수를 받아 값을 반환하는 함수에 대해 설명합니다. 두 번째 매개 변수는 32 비트 DLL에 전달된 포인터가 포함된 출력 매개가 변수입니다.
   enablemapdirect3216 = true;

   typedef int   BOOL;
   typedef char *LPSTR;

   BOOL MyThunk16(LPSTR lpstrInput, LPSTR lpstrOutput)
   {
      lpstrInput  = input;    // optional; input is default
      lpstrOutput = output;
   }
				
문을 "lpstrOutput 출력 =" 16비트 함수가 32비트 선형 주소 선택기: 오프셋 포인터에서 변환해야 하는 주소를 반환하는 썽크 컴파일러에 지시합니다.

다음 썽크 스크립트 구조 등 복잡한 매개 변수 형식을 사용합니다. 이 예제에서는 입력 및 출력 매개 변수를 지정하는 방법을 보여 줍니다.
   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;
   }
				
문을 "lpCircleInOut inout =" 입력 및 출력을 위해 사용할 수 있도록 이 포인터를 이동하는 스크립트 컴파일러에 지시합니다. 이 함수를 호출할 때 lpCircleInOut 선택기: 오프셋 포인터가 32 비트 선형 주소 변환한 다음 함수가 반환될 때 32비트 선형 주소 다시 썽크 컴파일러가. 변환 썽크 썽크 컴파일러에서 만든 의해 처리됩니다.

썽크 컴파일러 사용

썽크 컴파일러 사용 다음과 같습니다.
thunk.exe/<inputfile>-o <outputfile>옵션
다음 명령줄을 32 16 썽크 스크립트-> 컴파일하는 방법을 보여 줍니다. 이 줄 32to16.thk 라는 썽크 스크립트 받아 32to16.asm 라는 어셈블리 언어 파일을 생성합니다.
썽크 -t thk 32to16.thk -o 32to16.asm
해당 "-t thk" 옵션을 "thk_" 어셈블리 언어 파일에 썽크 함수를 접두사로 썽크 컴파일러에 알리는 이 접두사는 여러 썽크 스크립트를 한 쌍의 DLL에 링크할 때 사용되며, 한 쌍의 두 32 16, 32 썽크-> 16-> 포함하는 DLL 만드는 데 유용합니다. 각 썽크 스크립트에 고유한 접두사를 사용해야 합니다.

32 비트 DLL 빌드

  1. 32 비트 DLL DllMain 함수를 다음과 같이 모든 이유 (dwReason) DllMain 이라고에 대한 thk_ThunkConnect32 라는 썽크 컴파일러에 의해 생성된 함수에 대한 호출을 만들어야 합니다 ("thk" 썽크 컴파일러 -t 스위치 접두사가 있음):
          // 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. 다음 줄을 모듈 정의 (.def) 파일에 있는 EXPORTS 섹션에 대한 32 비트 DLL 포함됩니다. 예를 들어,:
          
       thk_ThunkData32
    						
  3. Win32 응용 프로그램에서 호출하는 함수를 내보냅니다. 32 비트 DLL의 모듈 정의 (.def) 파일 또는 __declspec(dllexport) 키워드를 사용할 수 있습니다. 함수가 선언된 및 __stdcall 또는 WINAPI로 정의된 합니다. 32 비트 DLL C++로 작성된 함수를 extern "C 함께" 선언할 수 있어야 합니다.
  4. 컴파일된 (있지 않은 경우) 같이 썽크 스크립트 컴파일:
          thunk -t thk 32to16.thk -o 32to16.asm
    						
  5. 32 비트 개체 모듈로 썽크 컴파일러에 의해 생성된 어셈블리 언어 파일을 수집하십시오. 예를 들어,:
          ml /DIS_32 /c /W3 /nologo /coff /Fo thk32.obj 32to16.asm
    						
  6. 이 개체 모듈이 32 비트 DLL의 일부로 연결하십시오.
  7. 32 비트 DLL의 일부로 Thunk32.lib 라이브러리에 연결하십시오. 썽크 컴파일러에 의해 생성된 코드를 사용하는 32비트 썽킹 API 참조가 Win32 SDK에서 제공되는 32비트 가져오기 라이브러리입니다.

16 비트 DLL 빌드

  1. 16 비트 DLL "DllEntryPoint" 라는 함수를 내보내야 합니다. 이 함수는 thk__ThunkConnect16 라는 썽크 컴파일러에서 만든 함수를 호출하는 합니다 ("thk" 에서 썽크 컴파일러 -t 스위치 접두사입니다) DllEntryPoint 호출될 때마다:
          // 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. 다음 줄을 16비트 DLL이 모듈 정의 (.def) 파일 가져오기를 섹션에서 포함됩니다. 예를 들어,:
          C16ThkSL01      = KERNEL.631
          ThunkConnect16  = KERNEL.651
    						
  3. 다음 줄을 모듈 정의 (.def) 파일에 있는 EXPORTS 섹션에 대한 16 비트 DLL 포함됩니다. THK_THUNKDATA16 썽크 컴파일러 출력에서 어셈블됩니다 개체 파일에 정의되어 있습니다. 이러한 기호를 모두 RESIDENTNAME 키워드가 있어야 하지만 서수 번호가 있을 수 있습니다.
          THK_THUNKDATA16 @1  RESIDENTNAME
          DllEntryPoint   @2  RESIDENTNAME
    						
  4. 16 비트 DLL의 모듈 정의 (.def) 파일의 EXPORTS 문은 썽크 함수를 추가하십시오. 선언된 및 __far __pascal __export 또는 WINAPI __export로 정의된 합니다. DLL C++로 작성된 extern "C 함께" 선언할 수 있어야 합니다. 32 비트 쪽에 썽크 이러한 함수를 호출합니다.
  5. 컴파일된 (있지 않은 경우) 같이 썽크 스크립트 컴파일:
          thunk -t thk 32to16.thk -o 32to16.asm
    						
  6. 16 비트 개체 모듈로 썽크 컴파일러에 의해 생성된 어셈블리 언어 파일을 수집하십시오. 예를 들어,:
          ml /DIS_16 /c /W3 /nologo /Fo thk16.obj 32to16.asm
    						
  7. 이 개체 모듈이 16 비트 DLL의 일부로 연결하십시오.
  8. 16 비트 DLL 버전 4.0 표시하십시오. 이렇게 하려면 리소스 컴파일러를 (Rc.exe)을 사용하십시오. 다음 줄의 구문을 보여 줍니다.
    rc-40 < DLL 파일 >
    이-40 옵션을 Win32 SDK 함께 제공되는 리소스 컴파일러가 사용할 수 있습니다.

    참고: BINW16 디렉터리에 있는 Rc.exe 파일을 사용하여 DLL 버전 4.0 표시되어 확인하십시오. Microsoft Visual C++의 16 비트 버전과 함께 제공되는 Rc.exe 파일 버전 4.0 DLL을 표시하지 않습니다.

참조

플랫 썽크 디버깅하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
133722디버그 플랫 썽크 방법

속성

기술 자료: 155763 - 마지막 검토: 2005년 7월 11일 월요일 - 수정: 2.3
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Win32 Application Programming Interface?을(를) 다음과 함께 사용했을 때
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
    • Microsoft Platform Software Development Kit-January 2000 Edition
키워드:?
kbmt kbapi kbhowto kbkernbase kbnetwork kbprogramming kbthunks kbtshoot KB155763 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

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