Посл.ответ |
Сообщение |
Ранг: 533.6 (!), 232thx Активность: 0.45↘0 Статус: Uploader retired
|
Создано: 13 июля 2008 13:03 · Личное сообщение · #1
В примере к FakeDll dll экспортируются только процедуры, а я хочу импортировать с моёй фэйк-длл функцию, пробывал не получается. Можно ли это, или нет, и как?
----- Лучше быть одиноким, но свободным © $me | Сообщение посчитали полезным: |
|
Ранг: 617.3 (!), 677thx Активность: 0.54↘0 Статус: Участник
|
Создано: 13 июля 2008 13:29 · Личное сообщение · #2
В каком именно примере?
Как пытался?
Правильно заданный вопрос содержит в себе минимум половину ответа!!!!
| Сообщение посчитали полезным: |
Ранг: 2014.5 (!!!!), 1278thx Активность: 1.34↘0.25 Статус: Модератор retired
|
Создано: 13 июля 2008 15:20 · Личное сообщение · #3
Что за процедуры и функции? Это в дельфи такое разделение, в асме нет понятия процедура и функции, они все функции. И как ты пробовал? Пример где? И вопрос вообще по-русски задай.
| Сообщение посчитали полезным: |
Ранг: 533.6 (!), 232thx Активность: 0.45↘0 Статус: Uploader retired
|
Создано: 13 июля 2008 16:24 · Личное сообщение · #4
Простой примерчик: в длл функция возращает сумму двух чисел, и по нажатии на кнопку вызывается эта ф-ия, а результат выодим в кэпшене.
Вот исходники: 3fea_13.07.2008_CRACKLAB.rU.tgz - for forum.7z
----- Лучше быть одиноким, но свободным © $me | Сообщение посчитали полезным: |
Ранг: 533.6 (!), 232thx Активность: 0.45↘0 Статус: Uploader retired
|
Создано: 13 июля 2008 19:54 · Поправил: borov · Личное сообщение · #5
дело не в том что это, функция или процедура, а в том что оно не хочет(или я не так что-то делаю) работать с ф-ми или процедурами с параметрами.
В примере который был вместе с фэйк-длл:
...
// переменая через которую будут работать с процедурой
Proc : procedure;
...
procedure TForm1.Button6Click(Sender: TObject);
begin
Proc := FakeDll.GetFDProcAddress(Proc1Name); // присваиваем адрес процедуры
Proc; // вызываем процедуру
end;
...
А я хочу так:
...
Proc : procedure(n: integer);
...
procedure TForm1.Button6Click(Sender: TObject);
begin
Proc := FakeDll.GetFDProcAddress(Proc1Name); // присваиваем адрес процедуры
Proc(2); // вызываем процедуру
end;
...
выдает ошибку
при нормальном вызове все работает
может я не правильно объявляю переменую, или еще что-то не так делаю
----- Лучше быть одиноким, но свободным © $me | Сообщение посчитали полезным: |
Ранг: 793.4 (! !), 568thx Активность: 0.74↘0 Статус: Участник Шаман
|
Создано: 13 июля 2008 21:35 · Личное сообщение · #6
зависит от соглашений.
Либо объявляй так
...
// переменая через которую будут работать с процедурой
Proc : procedure(n: integer); stdcall;
...
Либо так
...
// переменая через которую будут работать с процедурой
Proc : procedure(n: integer); cdecl;
...
----- Yann Tiersen best and do not fuck | Сообщение посчитали полезным: |
Ранг: 63.8 (постоянный), 2thx Активность: 0.03↘0 Статус: Участник
|
Создано: 13 июля 2008 22:04 · Поправил: drin · Личное сообщение · #7
PE_Kill
на самом деле и со стандартным борладовским fastcall все будет нормально, главное объявлять их абсолютно идентично
borov
когда ты вызывал Proc(2); как у тебя она была объявлена в FakeDll?
| Сообщение посчитали полезным: |
Ранг: 793.4 (! !), 568thx Активность: 0.74↘0 Статус: Участник Шаман
|
Создано: 13 июля 2008 22:15 · Личное сообщение · #8
drin пишет:
на самом деле и со стандартным борладовским fastcall все будет нормально
Не понял, если proc в dll - stdcall, то как она может корректно работать при вызове ее как fastcall?
----- Yann Tiersen best and do not fuck | Сообщение посчитали полезным: |
Ранг: 63.8 (постоянный), 2thx Активность: 0.03↘0 Статус: Участник
|
Создано: 13 июля 2008 22:57 · Поправил: drin · Личное сообщение · #9
PE_Kill
я же говорю что объявлять абсолютно идентично, если в fake_dll объявлять stdcall то и в том месте от куда вызывать объявлять как stdcall... или автор мапит не свою dll и не знает какие там соглашения внутри?
| Сообщение посчитали полезным: |
Ранг: 533.6 (!), 232thx Активность: 0.45↘0 Статус: Uploader retired
|
Создано: 13 июля 2008 23:11 · Личное сообщение · #10
у меня stdcall, а вобще это я решил потренироватся фэйкать дллки, для того чтобы за собой не таскать кучу длл'ок
----- Лучше быть одиноким, но свободным © $me | Сообщение посчитали полезным: |
Ранг: 50.3 (постоянный), 2thx Активность: 0.02↘0 Статус: Участник
|
Создано: 13 июля 2008 23:30 · Личное сообщение · #11
Не уверен, но помоему должно быть через указатель:
@Proc := FakeDll.GetFDProcAddress(Proc1Name);
И понавтыкать кучу проверок. =)
Но самое простое - в отладчике посмотреть кто там что со стеком делает =)
| Сообщение посчитали полезным: |
Ранг: 199.6 (ветеран), 12thx Активность: 0.1↘0 Статус: Участник www.uinc.ru
|
Создано: 07 октября 2008 23:35 · Поправил: Модератор · Личное сообщение · #12
Правильно описанный прототип и указатель на него это - уже пол дела.
Дельфи уже лет 8 в глаза не видел, могу ошибаться, но должно быть примерно так:
соответсно calling convention и тип результата подгоняется под конкретные нужды.
| Сообщение посчитали полезным: |
Ранг: 65.7 (постоянный) Активность: 0.05↘0 Статус: Участник
|
Создано: 08 октября 2008 20:15 · Поправил: Halt · Личное сообщение · #13
type
TDLLFunction = function(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall;
var
HdeProcess: TDLLFunction;
.........................
hinstDLL := LoadLibrary(Pchar(dll_name2));
if hinstDLL=0 then
begin
exit;
end;
HdeProcess := TDLLFunction(GetProcAddress(hinstDLL,'HideProcess'));
if not Assigned(HdeProcess) then
begin
FreeLibrary(hinstDLL);
hinstDLL:=0;
exit;
end;
try
HdeProcess(GetCurrentProcessId, true);
except
end;
в ДЛЛ
function HideProcess(pid:DWORD; HideOnlyFromTaskManager:BOOL):BOOL; stdcall;
может поможет....
| Сообщение посчитали полезным: |