Главная страница
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.073 c
14-90097
Шурик Ш
2003-11-04 10:05
2003.11.27
Уважаемые профессионалы, используете ли вы в своих разработках...


3-89743
Sherbacov
2003-11-07 23:59
2003.11.27
Вопрос по ADO


14-90091
vuk
2003-11-04 14:04
2003.11.27
Получите! Распишитесь!


1-89903
limk
2003-11-14 17:28
2003.11.27
memo


6-90047
Wadim
2003-10-03 02:05
2003.11.27
Lan