Последние записи
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
- wprintf как напечатать кириллицу
- Взаимодействие через командную строку
- Сравнение языков на массивах. Часть 1
- Сравнение языков по скорости
- Чтение огромных xml-файлов
- Как в Python+Selenium webdriver открыть новую вкладку в уже открытом браузере?
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
19th
Ноя
Универсальная загрузка dll
Posted by Chas under Delphi
эта «уникальная» функция должна уметь загружать библиотеки, и использовать их функции, основоваясь на входящих аргументах: имя длл, имя функции, внутренние аргументы, заданные строкой.
Biohazard
конечный результат функции
function SetFunction(dll, adress, param: String): DWORD;
var
hdll: HMODULE;
LastError: DWORD;
proc: Pointer;
Params: array of DWORD;
Strings: array of String;
PrmCount, StrCount, p: Integer;
p1, p2: String;
//param = integer:8;boolean:true; ...
begin
hdll := LoadLibrary(Pointer(dll));
if hdll = 0 then
begin
LastError := GetLastError;
RaiseErrorFmt('Ïðè çàãðóçêå áèáëèîòåêè "%s" âîçíèêëà îøèáêà ¹%d: "%s"',
[dll, LastError, SysErrorMessage(LastError)]);
end;
try
proc := GetProcAddress(hdll, Pointer(adress));
if not Assigned(proc) then
RaiseErrorFmt('Â áèáëèîòåêå "%s" îòñóòñòâóåò ïðîöåäóðà "%s"', [dll, adress]);
PrmCount := 0;
StrCount := 0;
while param <> '' do
begin
p := Pos(':', param);
if p = 0 then RaiseErrorFmt('Îæèäàëñÿ ñèìâîë ":" â ñòðîêå "%s"', [param]);
p1 := LowerCase(Copy(param, 1, p - 1));
Delete(param, 1, p);
p := Pos(';', param);
if p = 0 then RaiseErrorFmt('Îæèäàëñÿ ñèìâîë ";" â ñòðîêå "%s"', [param]);
p2 := Copy(param, 1, p - 1);
Delete(param, 1, p);
if Length(Params) = PrmCount then SetLength(Params, PrmCount + 10);
if p1 = 'integer' then
begin
Params[PrmCount] := StrToInt(p2);
end else
if p1 = 'boolean' then
begin
Params[PrmCount] := StrToInt(p2);
end else
if p1 = 'pchar' then
begin // Çäåñü ñòðîêè íèãäå íå ñîõðàíÿëèñü, ïîýòîìó óêàçàòåëè íà íèõ òåðÿëè àêòóàëüíîñòü
if Length(Strings) = StrCount then SetLength(Strings, StrCount + 10);
Strings[StrCount] := p2;
Params[PrmCount] := DWORD(Strings[StrCount]);
Inc(StrCount);
end else
begin
RaiseErrorFmt('Íåïîääåðæèâàåìûé òèï "%s"', [p1]);
end;
Inc(PrmCount);
end;
asm
PUSH ESI
PUSH EDI
MOV ESI, Params
MOV ECX, PrmCount
NEG ECX
LEA ESP, [ESP + ECX * 4] // Çäåñü áûëà îøèáî÷íàÿ èíñòðóêöèÿ lea esp, [esp - ecx * 4]
NEG ECX
MOV EDI, ESP
CLD
REP MOVSD
MOV EAX, proc
CALL EAX
MOV Result, EAX // Ñîõðàíÿåì ðåçóëüòàò ðàáîòû âûçâàííîé ôóíêöèè
POP EDI
POP ESI
end;
finally
FreeLibrary(hdll);
end;
end;
// Ïðèìåð âûçîâà (â èñõîäíîì âàðèàíòå çäåñü áûëà îøèáêà):
procedure TForm1.Button1Click(Sender: TObject);
begin
SetFunction('shell32.dll', 'ShellExecuteA', 'Integer:0;PChar:;PChar:calc.exe;PChar:;PChar:;Integer:0;');
end;
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)