Идет Илья Муромец по полю. Видит - Змей Горыныч сидит. Ну, тот подкрался к нему и срубил ему голову. У Змея Горыныча две выросло. Срубил Илья ему две - четыре выросло! Срубил четыре - выросло восемь!!! И так далее... И вот когда Илья Муромец срубил 65535 голов Змей Горыныч помер... Потому что был он 16-ти битным.
Посылаю код для определения системных ресурсов (как в "Индикаторе ресурсов").
Использовалась статья "Calling 16-bit code from 32-bit in Windows 95".
{ GetFeeSystemResources routine for 32-bit Delphi.
Works only under Windows 9x }unit SysRes32;
interfaceconst//Constants whitch specifies the type of resource to be checked
GFSR_SYSTEMRESOURCES = $0000;
GFSR_GDIRESOURCES = $0001;
GFSR_USERRESOURCES = $0002;
// 32-bit function exported from this unitfunction GetFeeSystemResources(SysResource: Word):Word;
implementationuses
SysUtils, Windows;
type//Procedural variable for testing for a nil
TGetFSR = function(ResType: Word): Word; stdcall;
//Declare our class exeptions
EThunkError = class(Exception);
EFOpenError = class(Exception);
var
User16Handle : THandle = 0;
GetFSR : TGetFSR = nil;
//Prototypes for some undocumented APIfunction LoadLibrary16(LibFileName: PAnsiChar): THandle; stdcall;
external kernel32 index 35;
function FreeLibrary16(LibModule: THandle): THandle; stdcall;
external kernel32 index 36;
function GetProcAddress16(Module: THandle; ProcName: LPCSTR): TFarProc;stdcall;
external kernel32 index 37;
procedure QT_Thunk; cdecl;
external 'kernel32.dll' name 'QT_Thunk';
{$StackFrames On}function GetFeeSystemResources(SysResource: Word):Word;
var
EatStackSpace: String[$3C];
begin// Ensure buffer isn't optimised away
EatStackSpace := '';
@GetFSR:=GetProcAddress16(User16Handle,'GETFREESYSTEMRESOURCES');
if Assigned(GetFSR) then//Test result for nilasm//Manually push onto the stack type of resource to be checked first
push SysResource
//Load routine address into EDX
mov edx, [GetFSR]
//Call routine
call QT_Thunk
//Assign result to the function
mov @Result, ax
endelseraise EFOpenError.Create('GetProcAddress16 failed!');
end;
initialization//Check Platform for Windows 9xif Win32Platform <> VER_PLATFORM_WIN32_WINDOWS thenraise EThunkError.Create('Flat thunks only supported under Windows 9x');
//Load 16-bit DLL (USER.EXE)
User16Handle:= LoadLibrary16(PChar('User.exe'));
if User16Handle < 32 thenraise EFOpenError.Create('LoadLibrary16 failed!');
finalization//Release 16-bit DLL when doneif User16Handle <> 0 then
FreeLibrary16(User16Handle);
end.
Это модуль Delphi, который предоставляет функцию для получения системных ресурсов на платформе Windows 9x с использованием 16-разрядной DLL. Код разработан для работы с 32-разрядным Delphi и использует функцию GetProcAddress из Win32 API для загрузки 16-разрядной DLL и получение адреса функции GETFREESYSTEMRESOURCES.
Обзор кода:
Единица объявляет константы для различных типов системных ресурсов (системные, GDI и пользовательские) и определяет 32-разрядную функцию GetFeeSystemResources, которая принимает параметр типа WORD, указывающий на тип ресурса для проверки.
В разделе реализации используются модули SysUtils и Windows, а также объявляются несколько переменных процедур, включая TGetFSR, который является тхунком для функции 16-разрядной DLL GETFREESYSTEMRESOURCES.
Код определяет два исключения: EThunkError для ошибок, связанных с плоскими тхунками, и EFOpenError для неудач при открытии 16-разрядной DLL.
В разделе инициализации код проверяет, является ли платформа Windows 9x, и если нет, то выбрасывает исключение. Затем загружается 16-разрядная DLL с помощью LoadLibrary16 и получается адрес функции GETFREESYSTEMRESOURCES с помощью GetProcAddress16.
В разделе финализации код освобождает 16-разрядную DLL, вызвав FreeLibrary16.
Функция GetFeeSystemResources использует тхунк TGetFSR для вызова функции 16-разрядной DLL GETFREESYSTEMRESOURCES, которая загружается на лету с помощью GetProcAddress16. Функция принимает параметр типа WORD, указывающий на тип ресурса для проверки, и возвращает значение типа WORD, представляющее системные ресурсы.
В целом, этот код предоставляет способ взаимодействия с 16-разрядным кодом из 32-разрядного Delphi на платформе Windows 9x. Однако важно отметить, что это код специфичен для Windows 9x и может не работать на других платформах или в современных версиях Windows.
Вызов 16-разрядного кода из 32-разрядного: реализация интерфейса между 32-битными и 16-битными приложениями на примере функции GetFeeSystemResources.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.