Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.27;
Скачать: CL | DM;

Вниз

проблемы с dll   Найти похожие ветки 

 
avkar   (2003-11-17 22:22) [0]

Помогите разобраться!!!
Есть DLL файл с функциеей с входным параметром типа TADOTable.
При вызове функции из основной программы возникает ошибка.
Что я делаю неправильно?
Текст функции в DLL примерно такой:

function ShowForm(DS :TADOTable): Boolean; stdcall;
begin
Form1 := TForm1.Create(Application);
Form1.Edit1.Text := DS.FieldByName("Name").AsString;
Result := (Form1.ShowModal = mrOk);
Form1.Free;
end;
exports ShowForm;

Текст основной программы:

var
function ShowForm(DS: TADOTable): Boolean; far; еxternal "project1.dll";
begin
ADOTable1.Open;
ShowForm(ADOTable1);
end;


 
Владислав ©   (2003-11-17 22:27) [1]

Ошибка в строке #17. Copyright известно чей.
Вопрос номер 1. Какая ошибка?


 
avkar   (2003-11-17 22:46) [2]

Ошибка такая: Программа выдала исключение EAccessViolation с сообщением ошибка по адресу 00215 в модуле project.exe


 
Владислав ©   (2003-11-17 22:48) [3]

ShareMem используем?


 
Юрий Федоров ©   (2003-11-17 22:50) [4]

function ShowForm(DS: TADOTable): Boolean; far; еxternal "project1.dll";

Почему far ? В библиотеке же stdcall
Это первое, второе
сборка с ран-тайм пакетами (и exe и dll)? Если нет, поимеешь дополнительные проблемы


 
avkar   (2003-11-17 22:54) [5]

ShareMem не использую, а надо?
Попробую без Far.


 
Юрий Зотов ©   (2003-11-17 22:58) [6]

Тут могут быть проблемы, связанные с передачей объекта и/или с разными для EXE и DLL экземплярами Application и Session. Еще могут быть проблемы из-за разных объявлений функции. И еще могут быть проблемы, если Вы пытаетесь обращаться к Form1 после вызова ShowForm.

Попробуйте так (var, far и stdcall уберите и не забудьте о ShareMem):

function ShowForm(S: string): boolean;
begin
with TForm1.Create(nil) do
try
Edit1.Text := S;
Result := ShowModal = mrOk
finally
Free
end
end;

function ShowForm(S: string): boolean; еxternal "project1.dll";

ADOTable1.Open;
ShowForm(ADOTable1.FieldByName("Name").AsString);


 
avkar   (2003-11-17 23:09) [7]

Не подходит, так как необходимо вывести не только поле "Name", но и кучу других полей.

А ShareMem при передаче объектов использовать надо или нет?


 
Владислав ©   (2003-11-17 23:20) [8]

Смотря как и каких параметров. Например со string надо обращаться "с умом". В общем, без кода не разобраться.


 
Юрий Зотов ©   (2003-11-17 23:28) [9]

> avkar (17.11.03 23:09) [7]

ShareMem надо использовать при передаче параметров с управляевым временем жизни - например, длинных строк и динамических массивов.

Объекты к таким не относятся, поэтому для них ShareMem не нужен. Но тут может возникнуть другая проблема. Дело в том, что EXE и DLL компилятся, как два совершенно раздельных проекта, которым друг о друге ничего не известно. Поэтому в каждом из них компилятор строит для каждого класса свою VMT и другие таблицы. Получается, что один и тот же класс в EXE и в DLL - это два РАЗНЫХ класса.

Кроме того, по той же причине EXE и DLL имеют каждый свои глобальные объекты Screen, Application, Session и другие. Это тоже может создавать проблемы (хотя и легко решаемые).

В общем, чтобы не было совсем никаких проблем, вынесите все общее для EXE и DLL в отдельный run-time пакет, а эти EXE и DLL компилируйте с run-time пакетами. Это самое простое и полностью надежное решение.


 
Владислав ©   (2003-11-18 00:01) [10]

Юрий Зотов © (17.11.03 23:28) [9]

"Объекты к таким не относятся..."

А как же их свойства?.. Например, тип string?



Страницы: 1 вся ветка

Текущий архив: 2003.11.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.059 c
1-89863
rosl
2003-11-18 02:36
2003.11.27
копирование


3-89720
lovres
2003-11-10 09:43
2003.11.27
Ошибка Invalid use of keyword в запросе


3-89712
AndrewCh
2003-11-06 12:16
2003.11.27
D5+Sybase SQL Any + W2Kru - error


3-89772
Vick
2003-11-10 15:18
2003.11.27
OnDrawColumnCell


14-90074
Stas
2003-11-05 12:12
2003.11.27
Структура EXE файла