Главная страница
    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.01 c
1-89927
UNick
2003-11-18 11:26
2003.11.27
Как упорядочить закладки в TabControl e


3-89767
Max_
2003-11-07 11:58
2003.11.27
ADOStoredProc и вызов функции из Package


11-89795
tamerlan311
2003-03-19 16:53
2003.11.27
memproof


1-89836
DimaK
2003-11-16 17:45
2003.11.27
ProgressBar


1-89986
Olga_Oo
2003-11-17 10:59
2003.11.27
Label





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