Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизПомогите с dll разобраться! Найти похожие ветки
← →
Petr (2005-11-24 20:50) [0]В ДЛЛ функция:
procedure GetFireZone(s, vm: Double; var res : TStringList); stdcall;
var
d, rr, Q, h, h1, s1, a, b : Double;
factor1, f2, f3, tau : Double;
i :Integer;
begin
d := df(s);
rr := d/2; // находит минимально допустимое растояние для заданной площади разлива s
Q := 0;
h := hf(d,vm,r0,g);
h1 := h1f(h, d);
for i := 0 to 5 do begin
while (abs(Q - efc[i].q) > 0.9) do begin
rr := rr + 0.1; // шаг можно изменить на более меньший
s1 := s1f(rr, d);
a := af(h1,s1);
b := bf(s1);
factor1:= fv(s1, h1, a);
f2:= fh(s1, a, b);
f3:= sqrt(power(factor1,2) + power(f2,2));
tau := exp((-0.0007)*(rr - 0.5*d));
Q := ef*f3*tau; // Интенсивность теплового излучения
end;
res.add("На растоянии "+FloatToStrF(rr, ffFixed, 4, 1)+" м наблюдается "+efc[i].c); // запоминаем найденный радиус
end;
end;
Вызываю:
d := TStringList.Create;
LibHandle := LoadLibrary("MyDll.dll");
if LibHandle >= 32 then begin
@MyFunc := GetProcAddress(LibHandle,"GetFireZone");
if @MyFunc <> nil then
MyFunc(580, 0.06, d)
else ShowMessage("11");
FreeLibrary(LibHandle);
end;
ShowMessage(d.strings[1]); // ВОТ СДЕСЬ ЭКСЕПШЕН хотя d.count = 6
← →
Petr (2005-11-25 05:20) [1]Может TStringList как-то по-другому передавать нужно?
← →
Джо © (2005-11-25 05:28) [2]Петр, когда создаешь проект с новым DLL, среда в самом начале файла пишет длиннющий комментарий... Вы его читали?
← →
Юрий Зотов © (2005-11-25 05:38) [3]И еще - как объявлена переменная MyFunc? Если в DLL стоит stdcall, то и в EXE она быть объявлена так же.
======================
PS
Петр, Вы к ВНИИПО отношения не имеете, часом?
← →
Petr (2005-11-25 05:52) [4]Не-а не имею
MyFunc : procedure (s, vm: Double;var res : TStringList); stdcall;
← →
Petr (2005-11-25 05:55) [5]Джо пасиб :)
ShareMem
← →
Джо © (2005-11-25 06:12) [6]К стати, зачем тут stdcall? Нет никакого ведь смысла, лучше оставить как есть и там и там, тогда будет использоваться более быстрая модель register.
← →
Petr (2005-11-25 07:02) [7]А как в этой модели параметры передаются.
я просто потом процедуру вызываю ассемблером, сам параметры в стек кладу.
Задача стоит следующая
Дано ДЛЛ, имя функции, типы и значения входных параметров.
Можно ли выполнить процедуру из длл заранее ее так не объявляя
MyFunc : procedure (s, vm: Double;var res : TStringList); stdcall;
или только самому на ассемблере.
← →
Digitman © (2005-11-25 08:46) [8]
> как в этой модели параметры передаются
при stdcall параметры передаются через стек справа налево (в порядке их перечисления в объявлении ф-ции), за балансировку стека ответственна сама вызываемая ф-ция
при соглашении по умолчанию первые три параметра (слева направо в порядке объявления) передаются в регистрах EAX (1-й), EDX (2-й), ECX (3-й), остальные - через стек, за балансировку стека так же как и при stdcall ответственна сама вызываемая ф-ция ... правило передачи параметров через регистры действует только для типов, размер которых не превышает 4 байта, в случае, например, с Double (8 байт) параметр передается через стек
пример передачи параметров для данного случая при соглашении по умолчанию :
var
s, vm: Double;
res: TStringList;
procedure TForm1.Button1Click(Sender: TObject);
begin
s := 1;
vm :=2;
res := Pointer(3);
asm
push dword ptr [s + 4]
push dword ptr [s]
push dword ptr [vm + 4]
push dword ptr [vm]
lea eax, res
call GetFireZone
end;
end;
← →
Petr (2005-11-25 08:56) [9]И при подключении к проекту ShareMem
при закрытии приложения возникает ошибка?
Просто запускаеш приложение и закрываеш его - ошибка?
← →
begin...end © (2005-11-25 08:56) [10]> Digitman © (25.11.05 08:46) [8]
> правило передачи параметров через регистры действует только
> для типов, размер которых не превышает 4 байта
Не для всех. Single передаётся через стек.
← →
Digitman © (2005-11-25 09:07) [11]
> begin...end © (25.11.05 08:56) [10]
да, конечно ... но это особый случай ... передача single через стек оправдана тем что вызываемой ф-ции в этом случае не нужно выполнять лишние "телодвижения" - подразумевается что работа с single будет происходить в FPU, и для загрузки single-значения в FPU-стек уже все готово, в отличии от варианта когда тот же single был бы передан через РОН, что потребовало бы предварительное сохранение содержимого РОН в память для последующей загрузки значения из памяти в FPU-стек
← →
Petr (2005-11-25 09:17) [12]при закрытии приложения возникает ошибка?
Просто запускаеш приложение и закрываеш его - ошибка?
Как с этим быть?
"Invalid pointer operation"
← →
Petr (2005-11-25 09:20) [13]Это возникает при подключении ShareMem
← →
Digitman © (2005-11-25 09:21) [14]
> Petr (25.11.05 09:17) [12]
убери ShareMem везде где ты его написал, пересобери оба проекта с установленной опцией Build With Run-Time packages и не мучайся
← →
Petr (2005-11-25 09:23) [15]щас попробую
← →
Petr (2005-11-25 09:40) [16]а потом приложение будет работать на машине где не стоит делфи?
← →
Digitman © (2005-11-25 09:42) [17]будет, если на этой машине будут те самые ран-тайм-пакеты, которые приложения используют в ходе работы
← →
Petr (2005-11-25 09:47) [18]Вроде работает.
А с ShareMem почему глючит?
← →
Digitman © (2005-11-25 10:04) [19]потому что, скорей всего, ты нарушил условия его использования
ShareMem должен присутствовать первым в uses-списке всех заинтересованных проектов (т.е. в dpr-файлах, а не в pas-файлах) !
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.059 c