Форум: "Основная";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];
Внизпроблемы с 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c