Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

Помогите с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.037 c
1-1131936511
Razor
2005-11-14 05:48
2005.12.11
Как правильнее передавать строки в DLL?


14-1132583518
ArtemESC
2005-11-21 17:31
2005.12.11
Как програмно выключить или перезагрузить компьютер?


2-1132847531
qp
2005-11-24 18:52
2005.12.11
Массив констант моего типа?


14-1132149687
Red_imp
2005-11-16 17:01
2005.12.11
Прикольная задачка но может быть и была она тут тогда извините


4-1128481280
Rentgen
2005-10-05 07:01
2005.12.11
Изменить настройки БИОСа компьютера через RS232





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский