Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.049 c
3-89753
Inkotex
2003-11-07 16:19
2003.11.27
Запись картинки jpeg формата в поле blob.


3-89710
Ольга
2003-11-07 14:43
2003.11.27
Как создать алиас на компьютере пользователя моей программы


1-89908
olookin
2003-11-14 21:59
2003.11.27
Пожалуйста гляньте - есть тут ошибка?


1-89889
don_dampster
2003-11-15 10:19
2003.11.27
Анализ сценариев


6-90052
Anonimus
2003-09-19 11:27
2003.11.27
Передача файла с помощью TServerSocket и TClientSocket





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский