JwaWowNT32.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:21k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { 32 bit Generic Thunks API interface Unit for Object Pascal                   }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: wownt32.h, released June 2000. The original Pascal     }
  9. { code is: WowNT32.pas, released December 2000. The initial developer of the   }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. unit JwaWowNT32;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "wownt32.h"'}
  47. {$HPPEMIT ''}
  48. {$I WINDEFINES.INC}
  49. interface
  50. uses
  51.   JwaWinType;
  52. //
  53. // 16:16 -> 0:32 Pointer translation.
  54. //
  55. // WOWGetVDMPointer will convert the passed in 16-bit address
  56. // to the equivalent 32-bit flat pointer.  If fProtectedMode
  57. // is TRUE, the function treats the upper 16 bits as a selector
  58. // in the local descriptor table.  If fProtectedMode is FALSE,
  59. // the upper 16 bits are treated as a real-mode segment value.
  60. // In either case the lower 16 bits are treated as the offset.
  61. //
  62. // The return value is NULL if the selector is invalid.
  63. //
  64. // NOTE:  Limit checking is not performed in the retail build
  65. // of Windows NT.  It is performed in the checked (debug) build
  66. // of WOW32.DLL, which will cause NULL to be returned when the
  67. // limit is exceeded by the supplied offset.
  68. //
  69. function WOWGetVDMPointer(vp, dwBytes: DWORD; fProtectedMode: BOOL): LPVOID; stdcall;
  70. {$EXTERNALSYM WOWGetVDMPointer}
  71. //
  72. // The following two functions are here for compatibility with
  73. // Windows 95.  On Win95, the global heap can be rearranged,
  74. // invalidating flat pointers returned by WOWGetVDMPointer, while
  75. // a thunk is executing.  On Windows NT, the 16-bit VDM is completely
  76. // halted while a thunk executes, so the only way the heap will
  77. // be rearranged is if a callback is made to Win16 code.
  78. //
  79. // The Win95 versions of these functions call GlobalFix to
  80. // lock down a segment's flat address, and GlobalUnfix to
  81. // release the segment.
  82. //
  83. // The Windows NT implementations of these functions do *not*
  84. // call GlobalFix/GlobalUnfix on the segment, because there
  85. // will not be any heap motion unless a callback occurs.
  86. // If your thunk does callback to the 16-bit side, be sure
  87. // to discard flat pointers and call WOWGetVDMPointer again
  88. // to be sure the flat address is correct.
  89. //
  90. function WOWGetVDMPointerFix(vp, dwBytes: DWORD; fProtectedMode: BOOL): LPVOID; stdcall;
  91. {$EXTERNALSYM WOWGetVDMPointerFix}
  92. procedure WOWGetVDMPointerUnfix(vp: DWORD); stdcall;
  93. {$EXTERNALSYM WOWGetVDMPointerUnfix}
  94. //
  95. // Win16 memory management.
  96. //
  97. // These functions can be used to manage memory in the Win16
  98. // heap.  The following four functions are identical to their
  99. // Win16 counterparts, except that they are called from Win32
  100. // code.
  101. //
  102. function WOWGlobalAlloc16(wFlags: WORD; cb: DWORD): WORD; stdcall;
  103. {$EXTERNALSYM WOWGlobalAlloc16}
  104. function WOWGlobalFree16(hMem: WORD): WORD; stdcall;
  105. {$EXTERNALSYM WOWGlobalFree16}
  106. function WOWGlobalLock16(hMem: WORD): DWORD; stdcall;
  107. {$EXTERNALSYM WOWGlobalLock16}
  108. function WOWGlobalUnlock16(hMem: WORD): BOOL; stdcall;
  109. {$EXTERNALSYM WOWGlobalUnlock16}
  110. //
  111. // The following three functions combine two common operations in
  112. // one switch to 16-bit mode.
  113. //
  114. function WOWGlobalAllocLock16(wFlags: WORD; cb: DWORD; var phMem: WORD): DWORD; stdcall;
  115. {$EXTERNALSYM WOWGlobalAllocLock16}
  116. function WOWGlobalUnlockFree16(vpMem: DWORD): WORD; stdcall;
  117. {$EXTERNALSYM WOWGlobalUnlockFree16}
  118. function WOWGlobalLockSize16(hMem: WORD; pcb: PDWORD): DWORD; stdcall;
  119. {$EXTERNALSYM WOWGlobalLockSize16}
  120. //
  121. // Yielding the Win16 nonpreemptive scheduler
  122. //
  123. // The following two functions are provided for Win32 code called
  124. // via Generic Thunks which needs to yield the Win16 scheduler so
  125. // that tasks in that VDM can execute while the thunk waits for
  126. // something to complete.  These two functions are functionally
  127. // identical to calling back to 16-bit code which calls Yield or
  128. // DirectedYield.
  129. //
  130. procedure WOWYield16; stdcall;
  131. {$EXTERNALSYM WOWYield16}
  132. procedure WOWDirectedYield16(htask16: WORD); stdcall;
  133. {$EXTERNALSYM WOWDirectedYield16}
  134. //
  135. // 16 <--> 32 Handle mapping functions.
  136. //
  137. // NOTE:  While some of these functions perform trivial
  138. // conversions, these functions must be used to maintain
  139. // compatibility with future versions of Windows NT which
  140. // may require different handle mapping.
  141. //
  142. type
  143.   _WOW_HANDLE_TYPE = (
  144.     WOW_TYPE_HWND,
  145.     WOW_TYPE_HMENU,
  146.     WOW_TYPE_HDWP,
  147.     WOW_TYPE_HDROP,
  148.     WOW_TYPE_HDC,
  149.     WOW_TYPE_HFONT,
  150.     WOW_TYPE_HMETAFILE,
  151.     WOW_TYPE_HRGN,
  152.     WOW_TYPE_HBITMAP,
  153.     WOW_TYPE_HBRUSH,
  154.     WOW_TYPE_HPALETTE,
  155.     WOW_TYPE_HPEN,
  156.     WOW_TYPE_HACCEL,
  157.     WOW_TYPE_HTASK,
  158.     WOW_TYPE_FULLHWND);
  159.   {$EXTERNALSYM _WOW_HANDLE_TYPE}
  160.   WOW_HANDLE_TYPE = _WOW_HANDLE_TYPE;
  161.   {$EXTERNALSYM WOW_HANDLE_TYPE}
  162.   TWowHandleType = WOW_HANDLE_TYPE;
  163. function WOWHandle32(Handle: WORD; Type_: WOW_HANDLE_TYPE): HANDLE; stdcall;
  164. {$EXTERNALSYM WOWHandle32}
  165. function WOWHandle16(Handle: HANDLE; Type_: WOW_HANDLE_TYPE): WORD; stdcall;
  166. {$EXTERNALSYM WOWHandle16}
  167. function HWND_32(h16: WORD): HANDLE;
  168. {$EXTERNALSYM HWND_32}
  169. function HMENU_32(h16: WORD): HANDLE;
  170. {$EXTERNALSYM HMENU_32}
  171. function HDWP_32(h16: WORD): HANDLE;
  172. {$EXTERNALSYM HDWP_32}
  173. function HDROP_32(h16: WORD): HANDLE;
  174. {$EXTERNALSYM HDROP_32}
  175. function HDC_32(h16: WORD): HANDLE;
  176. {$EXTERNALSYM HDC_32}
  177. function HFONT_32(h16: WORD): HANDLE;
  178. {$EXTERNALSYM HFONT_32}
  179. function HMETAFILE_32(h16: WORD): HANDLE;
  180. {$EXTERNALSYM HMETAFILE_32}
  181. function HRGN_32(h16: WORD): HANDLE;
  182. {$EXTERNALSYM HRGN_32}
  183. function HBITMAP_32(h16: WORD): HANDLE;
  184. {$EXTERNALSYM HBITMAP_32}
  185. function HBRUSH_32(h16: WORD): HANDLE;
  186. {$EXTERNALSYM HBRUSH_32}
  187. function HPALETTE_32(h16: WORD): HANDLE;
  188. {$EXTERNALSYM HPALETTE_32}
  189. function HPEN_32(h16: WORD): HANDLE;
  190. {$EXTERNALSYM HPEN_32}
  191. function HACCEL_32(h16: WORD): HANDLE;
  192. {$EXTERNALSYM HACCEL_32}
  193. function HTASK_32(h16: WORD): HANDLE;
  194. {$EXTERNALSYM HTASK_32}
  195. function FULLHWND_32(h16: WORD): HANDLE;
  196. {$EXTERNALSYM FULLHWND_32}
  197. function HWND_16(h32: HANDLE): WORD;
  198. {$EXTERNALSYM HWND_16}
  199. function HMENU_16(h32: HANDLE): WORD;
  200. {$EXTERNALSYM HMENU_16}
  201. function HDWP_16(h32: HANDLE): WORD;
  202. {$EXTERNALSYM HDWP_16}
  203. function HDROP_16(h32: HANDLE): WORD;
  204. {$EXTERNALSYM HDROP_16}
  205. function HDC_16(h32: HANDLE): WORD;
  206. {$EXTERNALSYM HDC_16}
  207. function HFONT_16(h32: HANDLE): WORD;
  208. {$EXTERNALSYM HFONT_16}
  209. function HMETAFILE_16(h32: HANDLE): WORD;
  210. {$EXTERNALSYM HMETAFILE_16}
  211. function HRGN_16(h32: HANDLE): WORD;
  212. {$EXTERNALSYM HRGN_16}
  213. function HBITMAP_16(h32: HANDLE): WORD;
  214. {$EXTERNALSYM HBITMAP_16}
  215. function HBRUSH_16(h32: HANDLE): WORD;
  216. {$EXTERNALSYM HBRUSH_16}
  217. function HPALETTE_16(h32: HANDLE): WORD;
  218. {$EXTERNALSYM HPALETTE_16}
  219. function HPEN_16(h32: HANDLE): WORD;
  220. {$EXTERNALSYM HPEN_16}
  221. function HACCEL_16(h32: HANDLE): WORD;
  222. {$EXTERNALSYM HACCEL_16}
  223. function HTASK_16(h32: HANDLE): WORD;
  224. {$EXTERNALSYM HTASK_16}
  225. //
  226. // Generic Callbacks.
  227. //
  228. // WOWCallback16 can be used in Win32 code called
  229. // from 16-bit (such as by using Generic Thunks) to call back to
  230. // the 16-bit side.  The function called must be declared similarly
  231. // to the following:
  232. //
  233. // LONG FAR PASCAL CallbackRoutine(DWORD dwParam);
  234. //
  235. // If you are passing a pointer, declare the parameter as such:
  236. //
  237. // LONG FAR PASCAL CallbackRoutine(VOID FAR *vp);
  238. //
  239. // NOTE: If you are passing a pointer, you'll need to get the
  240. // pointer using WOWGlobalAlloc16 or WOWGlobalAllocLock16
  241. //
  242. // If the function called returns a WORD instead of a DWORD, the
  243. // upper 16 bits of the return value is undefined.  Similarly, if
  244. // the function called has no return value, the entire return value
  245. // is undefined.
  246. //
  247. // WOWCallback16Ex allows any combination of arguments up to
  248. // WCB16_MAX_CBARGS bytes total to be passed to the 16-bit routine.
  249. // cbArgs is used to properly clean up the 16-bit stack after calling
  250. // the routine.  Regardless of the value of cbArgs, WCB16_MAX_CBARGS
  251. // bytes will always be copied from pArgs to the 16-bit stack.  If
  252. // pArgs is less than WCB16_MAX_CBARGS bytes from the end of a page,
  253. // and the next page is inaccessible, WOWCallback16Ex will incur an
  254. // access violation.
  255. //
  256. // If cbArgs is larger than the WCB16_MAX_ARGS which the running
  257. // system supports, the function returns FALSE and GetLastError
  258. // returns ERROR_INVALID_PARAMETER.  Otherwise the function
  259. // returns TRUE and the DWORD pointed to by pdwRetCode contains
  260. // the return code from the callback routine.  If the callback
  261. // routine returns a WORD, the HIWORD of the return code is
  262. // undefined and should be ignored using LOWORD(dwRetCode).
  263. //
  264. // WOWCallback16Ex can call routines using the PASCAL and CDECL
  265. // calling conventions.  The default is to use the PASCAL
  266. // calling convention.  To use CDECL, pass WCB16_CDECL in the
  267. // dwFlags parameter.
  268. //
  269. // The arguments pointed to by pArgs must be in the correct
  270. // order for the callback routine's calling convention.
  271. // To call the PASCAL routine SetWindowText,
  272. //
  273. // LONG FAR PASCAL SetWindowText(HWND hwnd, LPCSTR lpsz);
  274. //
  275. // pArgs would point to an array of words:
  276. //
  277. // WORD SetWindowTextArgs[] = {OFFSETOF(lpsz), SELECTOROF(lpsz), hwnd};
  278. //
  279. // In other words, the arguments are placed in the array in reverse
  280. // order with the least significant word first for DWORDs and offset
  281. // first for FAR pointers.
  282. //
  283. // To call the CDECL routine wsprintf, for example
  284. //
  285. // LPSTR lpszFormat = "%d %s";
  286. // int _cdecl wsprintf(lpsz, lpszFormat, nValue. lpszString);
  287. //
  288. // pArgs would point to the array:
  289. //
  290. // WORD wsprintfArgs[] = {OFFSETOF(lpsz), SELECTOROF(lpsz),
  291. //                        OFFSETOF(lpszFormat), SELECTOROF(lpszFormat),
  292. //                        nValue,
  293. //                        OFFSETOF(lpszString), SELECTOROF(lpszString)};
  294. //
  295. // In other words, the arguments are placed in the array in the order
  296. // listed in the function prototype with the least significant word
  297. // first for DWORDs and offset first for FAR pointers.
  298. //
  299. function WOWCallback16(vpfn16: DWORD; dwParam: DWORD): DWORD; stdcall;
  300. {$EXTERNALSYM WOWCallback16}
  301. const
  302.   WCB16_MAX_CBARGS = 16;
  303.   {$EXTERNALSYM WCB16_MAX_CBARGS}
  304.   WCB16_PASCAL     = $0;
  305.   {$EXTERNALSYM WCB16_PASCAL}
  306.   WCB16_CDECL      = $1;
  307.   {$EXTERNALSYM WCB16_CDECL}
  308. function WOWCallback16Ex(vpfn16, dwFlags, cbArgs: DWORD; pArgs: PVOID; pdwRetCode: PDWORD): BOOL; stdcall;
  309. {$EXTERNALSYM WOWCallback16Ex}
  310. implementation
  311. const
  312.   wow32lib = 'wow32.dll';
  313. {$IFDEF DYNAMIC_LINK}
  314. var
  315.   _WOWGetVDMPointer: Pointer;
  316. function WOWGetVDMPointer;
  317. begin
  318.   GetProcedureAddress(_WOWGetVDMPointer, wow32lib, 'WOWGetVDMPointer');
  319.   asm
  320.     mov esp, ebp
  321.     pop ebp
  322.     jmp [_WOWGetVDMPointer]
  323.   end;
  324. end;
  325. {$ELSE}
  326. function WOWGetVDMPointer; external wow32lib name 'WOWGetVDMPointer';
  327. {$ENDIF DYNAMIC_LINK}
  328. {$IFDEF DYNAMIC_LINK}
  329. var
  330.   _WOWGetVDMPointerFix: Pointer;
  331. function WOWGetVDMPointerFix;
  332. begin
  333.   GetProcedureAddress(_WOWGetVDMPointerFix, wow32lib, 'WOWGetVDMPointerFix');
  334.   asm
  335.     mov esp, ebp
  336.     pop ebp
  337.     jmp [_WOWGetVDMPointerFix]
  338.   end;
  339. end;
  340. {$ELSE}
  341. function WOWGetVDMPointerFix; external wow32lib name 'WOWGetVDMPointerFix';
  342. {$ENDIF DYNAMIC_LINK}
  343. {$IFDEF DYNAMIC_LINK}
  344. var
  345.   _WOWGetVDMPointerUnfix: Pointer;
  346. procedure WOWGetVDMPointerUnfix;
  347. begin
  348.   GetProcedureAddress(_WOWGetVDMPointerUnfix, wow32lib, 'WOWGetVDMPointerUnfix');
  349.   asm
  350.     mov esp, ebp
  351.     pop ebp
  352.     jmp [_WOWGetVDMPointerUnfix]
  353.   end;
  354. end;
  355. {$ELSE}
  356. procedure WOWGetVDMPointerUnfix; external wow32lib name 'WOWGetVDMPointerUnfix';
  357. {$ENDIF DYNAMIC_LINK}
  358. {$IFDEF DYNAMIC_LINK}
  359. var
  360.   _WOWGlobalAlloc16: Pointer;
  361. function WOWGlobalAlloc16;
  362. begin
  363.   GetProcedureAddress(_WOWGlobalAlloc16, wow32lib, 'WOWGlobalAlloc16');
  364.   asm
  365.     mov esp, ebp
  366.     pop ebp
  367.     jmp [_WOWGlobalAlloc16]
  368.   end;
  369. end;
  370. {$ELSE}
  371. function WOWGlobalAlloc16; external wow32lib name 'WOWGlobalAlloc16';
  372. {$ENDIF DYNAMIC_LINK}
  373. {$IFDEF DYNAMIC_LINK}
  374. var
  375.   _WOWGlobalFree16: Pointer;
  376. function WOWGlobalFree16;
  377. begin
  378.   GetProcedureAddress(_WOWGlobalFree16, wow32lib, 'WOWGlobalFree16');
  379.   asm
  380.     mov esp, ebp
  381.     pop ebp
  382.     jmp [_WOWGlobalFree16]
  383.   end;
  384. end;
  385. {$ELSE}
  386. function WOWGlobalFree16; external wow32lib name 'WOWGlobalFree16';
  387. {$ENDIF DYNAMIC_LINK}
  388. {$IFDEF DYNAMIC_LINK}
  389. var
  390.   _WOWGlobalLock16: Pointer;
  391. function WOWGlobalLock16;
  392. begin
  393.   GetProcedureAddress(_WOWGlobalLock16, wow32lib, 'WOWGlobalLock16');
  394.   asm
  395.     mov esp, ebp
  396.     pop ebp
  397.     jmp [_WOWGlobalLock16]
  398.   end;
  399. end;
  400. {$ELSE}
  401. function WOWGlobalLock16; external wow32lib name 'WOWGlobalLock16';
  402. {$ENDIF DYNAMIC_LINK}
  403. {$IFDEF DYNAMIC_LINK}
  404. var
  405.   _WOWGlobalUnlock16: Pointer;
  406. function WOWGlobalUnlock16;
  407. begin
  408.   GetProcedureAddress(_WOWGlobalUnlock16, wow32lib, 'WOWGlobalUnlock16');
  409.   asm
  410.     mov esp, ebp
  411.     pop ebp
  412.     jmp [_WOWGlobalUnlock16]
  413.   end;
  414. end;
  415. {$ELSE}
  416. function WOWGlobalUnlock16; external wow32lib name 'WOWGlobalUnlock16';
  417. {$ENDIF DYNAMIC_LINK}
  418. {$IFDEF DYNAMIC_LINK}
  419. var
  420.   _WOWGlobalAllocLock16: Pointer;
  421. function WOWGlobalAllocLock16;
  422. begin
  423.   GetProcedureAddress(_WOWGlobalAllocLock16, wow32lib, 'WOWGlobalAllocLock16');
  424.   asm
  425.     mov esp, ebp
  426.     pop ebp
  427.     jmp [_WOWGlobalAllocLock16]
  428.   end;
  429. end;
  430. {$ELSE}
  431. function WOWGlobalAllocLock16; external wow32lib name 'WOWGlobalAllocLock16';
  432. {$ENDIF DYNAMIC_LINK}
  433. {$IFDEF DYNAMIC_LINK}
  434. var
  435.   _WOWGlobalUnlockFree16: Pointer;
  436. function WOWGlobalUnlockFree16;
  437. begin
  438.   GetProcedureAddress(_WOWGlobalUnlockFree16, wow32lib, 'WOWGlobalUnlockFree16');
  439.   asm
  440.     mov esp, ebp
  441.     pop ebp
  442.     jmp [_WOWGlobalUnlockFree16]
  443.   end;
  444. end;
  445. {$ELSE}
  446. function WOWGlobalUnlockFree16; external wow32lib name 'WOWGlobalUnlockFree16';
  447. {$ENDIF DYNAMIC_LINK}
  448. {$IFDEF DYNAMIC_LINK}
  449. var
  450.   _WOWGlobalLockSize16: Pointer;
  451. function WOWGlobalLockSize16;
  452. begin
  453.   GetProcedureAddress(_WOWGlobalLockSize16, wow32lib, 'WOWGlobalLockSize16');
  454.   asm
  455.     mov esp, ebp
  456.     pop ebp
  457.     jmp [_WOWGlobalLockSize16]
  458.   end;
  459. end;
  460. {$ELSE}
  461. function WOWGlobalLockSize16; external wow32lib name 'WOWGlobalLockSize16';
  462. {$ENDIF DYNAMIC_LINK}
  463. {$IFDEF DYNAMIC_LINK}
  464. var
  465.   _WOWYield16: Pointer;
  466. procedure WOWYield16;
  467. begin
  468.   GetProcedureAddress(_WOWYield16, wow32lib, 'WOWYield16');
  469.   asm
  470.     mov esp, ebp
  471.     pop ebp
  472.     jmp [_WOWYield16]
  473.   end;
  474. end;
  475. {$ELSE}
  476. procedure WOWYield16; external wow32lib name 'WOWYield16';
  477. {$ENDIF DYNAMIC_LINK}
  478. {$IFDEF DYNAMIC_LINK}
  479. var
  480.   _WOWDirectedYield16: Pointer;
  481. procedure WOWDirectedYield16;
  482. begin
  483.   GetProcedureAddress(_WOWDirectedYield16, wow32lib, 'WOWDirectedYield16');
  484.   asm
  485.     mov esp, ebp
  486.     pop ebp
  487.     jmp [_WOWDirectedYield16]
  488.   end;
  489. end;
  490. {$ELSE}
  491. procedure WOWDirectedYield16; external wow32lib name 'WOWDirectedYield16';
  492. {$ENDIF DYNAMIC_LINK}
  493. {$IFDEF DYNAMIC_LINK}
  494. var
  495.   _WOWHandle32: Pointer;
  496. function WOWHandle32;
  497. begin
  498.   GetProcedureAddress(_WOWHandle32, wow32lib, 'WOWHandle32');
  499.   asm
  500.     mov esp, ebp
  501.     pop ebp
  502.     jmp [_WOWHandle32]
  503.   end;
  504. end;
  505. {$ELSE}
  506. function WOWHandle32; external wow32lib name 'WOWHandle32';
  507. {$ENDIF DYNAMIC_LINK}
  508. {$IFDEF DYNAMIC_LINK}
  509. var
  510.   _WOWHandle16: Pointer;
  511. function WOWHandle16;
  512. begin
  513.   GetProcedureAddress(_WOWHandle16, wow32lib, 'WOWHandle16');
  514.   asm
  515.     mov esp, ebp
  516.     pop ebp
  517.     jmp [_WOWHandle16]
  518.   end;
  519. end;
  520. {$ELSE}
  521. function WOWHandle16; external wow32lib name 'WOWHandle16';
  522. {$ENDIF DYNAMIC_LINK}
  523. {$IFDEF DYNAMIC_LINK}
  524. var
  525.   _WOWCallback16: Pointer;
  526. function WOWCallback16;
  527. begin
  528.   GetProcedureAddress(_WOWCallback16, wow32lib, 'WOWCallback16');
  529.   asm
  530.     mov esp, ebp
  531.     pop ebp
  532.     jmp [_WOWCallback16]
  533.   end;
  534. end;
  535. {$ELSE}
  536. function WOWCallback16; external wow32lib name 'WOWCallback16';
  537. {$ENDIF DYNAMIC_LINK}
  538. {$IFDEF DYNAMIC_LINK}
  539. var
  540.   _WOWCallback16Ex: Pointer;
  541. function WOWCallback16Ex;
  542. begin
  543.   GetProcedureAddress(_WOWCallback16Ex, wow32lib, 'WOWCallback16Ex');
  544.   asm
  545.     mov esp, ebp
  546.     pop ebp
  547.     jmp [_WOWCallback16Ex]
  548.   end;
  549. end;
  550. {$ELSE}
  551. function WOWCallback16Ex; external wow32lib name 'WOWCallback16Ex';
  552. {$ENDIF DYNAMIC_LINK}
  553. function HWND_32(h16: WORD): HANDLE;
  554. begin
  555.   Result := WOWHandle32(h16, WOW_TYPE_HWND);
  556. end;
  557. function HMENU_32(h16: WORD): HANDLE;
  558. begin
  559.   Result := WOWHandle32(h16, WOW_TYPE_HMENU);
  560. end;
  561. function HDWP_32(h16: WORD): HANDLE;
  562. begin
  563.   Result := WOWHandle32(h16, WOW_TYPE_HDWP);
  564. end;
  565. function HDROP_32(h16: WORD): HANDLE;
  566. begin
  567.   Result := WOWHandle32(h16, WOW_TYPE_HDROP);
  568. end;
  569. function HDC_32(h16: WORD): HANDLE;
  570. begin
  571.   Result := WOWHandle32(h16, WOW_TYPE_HDC);
  572. end;
  573. function HFONT_32(h16: WORD): HANDLE;
  574. begin
  575.   Result := WOWHandle32(h16, WOW_TYPE_HFONT);
  576. end;
  577. function HMETAFILE_32(h16: WORD): HANDLE;
  578. begin
  579.   Result := WOWHandle32(h16, WOW_TYPE_HMETAFILE);
  580. end;
  581. function HRGN_32(h16: WORD): HANDLE;
  582. begin
  583.   Result := WOWHandle32(h16, WOW_TYPE_HRGN);
  584. end;
  585. function HBITMAP_32(h16: WORD): HANDLE;
  586. begin
  587.   Result := WOWHandle32(h16, WOW_TYPE_HBITMAP);
  588. end;
  589. function HBRUSH_32(h16: WORD): HANDLE;
  590. begin
  591.   Result := WOWHandle32(h16, WOW_TYPE_HBRUSH);
  592. end;
  593. function HPALETTE_32(h16: WORD): HANDLE;
  594. begin
  595.   Result := WOWHandle32(h16, WOW_TYPE_HPALETTE);
  596. end;
  597. function HPEN_32(h16: WORD): HANDLE;
  598. begin
  599.   Result := WOWHandle32(h16, WOW_TYPE_HPEN);
  600. end;
  601. function HACCEL_32(h16: WORD): HANDLE;
  602. begin
  603.   Result := WOWHandle32(h16, WOW_TYPE_HACCEL);
  604. end;
  605. function HTASK_32(h16: WORD): HANDLE;
  606. begin
  607.   Result := WOWHandle32(h16, WOW_TYPE_HTASK);
  608. end;
  609. function FULLHWND_32(h16: WORD): HANDLE;
  610. begin
  611.   Result := WOWHandle32(h16, WOW_TYPE_FULLHWND);
  612. end;
  613. function HWND_16(h32: HANDLE): WORD;
  614. begin
  615.   Result := WOWHandle16(h32, WOW_TYPE_HWND);
  616. end;
  617. function HMENU_16(h32: HANDLE): WORD;
  618. begin
  619.   Result := WOWHandle16(h32, WOW_TYPE_HMENU);
  620. end;
  621. function HDWP_16(h32: HANDLE): WORD;
  622. begin
  623.   Result := WOWHandle16(h32, WOW_TYPE_HDWP);
  624. end;
  625. function HDROP_16(h32: HANDLE): WORD;
  626. begin
  627.   Result := WOWHandle16(h32, WOW_TYPE_HDROP);
  628. end;
  629. function HDC_16(h32: HANDLE): WORD;
  630. begin
  631.   Result := WOWHandle16(h32, WOW_TYPE_HDC);
  632. end;
  633. function HFONT_16(h32: HANDLE): WORD;
  634. begin
  635.   Result := WOWHandle16(h32, WOW_TYPE_HFONT);
  636. end;
  637. function HMETAFILE_16(h32: HANDLE): WORD;
  638. begin
  639.   Result := WOWHandle16(h32, WOW_TYPE_HMETAFILE);
  640. end;
  641. function HRGN_16(h32: HANDLE): WORD;
  642. begin
  643.   Result := WOWHandle16(h32, WOW_TYPE_HRGN);
  644. end;
  645. function HBITMAP_16(h32: HANDLE): WORD;
  646. begin
  647.   Result := WOWHandle16(h32, WOW_TYPE_HBITMAP);
  648. end;
  649. function HBRUSH_16(h32: HANDLE): WORD;
  650. begin
  651.   Result := WOWHandle16(h32, WOW_TYPE_HBRUSH);
  652. end;
  653. function HPALETTE_16(h32: HANDLE): WORD;
  654. begin
  655.   Result := WOWHandle16(h32, WOW_TYPE_HPALETTE);
  656. end;
  657. function HPEN_16(h32: HANDLE): WORD;
  658. begin
  659.   Result := WOWHandle16(h32, WOW_TYPE_HPEN);
  660. end;
  661. function HACCEL_16(h32: HANDLE): WORD;
  662. begin
  663.   Result := WOWHandle16(h32, WOW_TYPE_HACCEL);
  664. end;
  665. function HTASK_16(h32: HANDLE): WORD;
  666. begin
  667.   Result := WOWHandle16(h32, WOW_TYPE_HTASK);
  668. end;
  669. end.