Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2011, 15:04   #1
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию Вопрос о DLL

Сразу прошу прощения за такого рода вопрос, но нигде найти не могу причину проблемы. Есть проект и прикрепленная к нему библиотека DLL. В последней описаны пару процедур и отправлены на экспорт:
Код:
procedure Proc1; export;
begin
...
end;

exports Proc1 resident;
Далее в главном проекте получаем эти процедуры:
Код:
implementation

{$R *.dfm}

    procedure Proc1; stdcall; external 'libname.dll';
Пробую вызвать процедуру при клике:
Код:
procedure TForm1.Button1Click(Sender:TObject);
begin
Proc1;
end;
В итоге получаю ошибку Access Violation. Подскажите почему так?

Последний раз редактировалось kettanaito; 25.08.2011 в 15:41.
kettanaito вне форума Ответить с цитированием
Старый 25.08.2011, 15:18   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

процедуру показывайте, ибо раз запускается то функция есть(и длл найдена).

хм, зачем у вас какой то extport, resident.
а из ошибок вижу что в ДЛЛ функция не stdcall(значит register) а в приложении описали как stdcall.
хотя если нет параметров то это не критично.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.08.2011, 15:43   #3
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

Процедура:
Код:
procedure NewFile; export;
begin
if cdpmain.current<>'' then
cdpmain.document.Lines.SaveToFile(cdpmain.current) else cdpmain.Refresh;
  if cdpmain.document.Text<>'' then
  begin
  case MessageDlg(cdpmain.messages.onclose,mtCustom, mbYesNoCancel, 0) of
  mrYes: SaveFileAs;
  mrNo: begin
        cdpmain.document.clear;
        cdpmain.document.Highlighter:=nil;
        cdpmain.current:='';
        cdpmain.refreshCaption;
        cdpmain.openNode:=cdpmain.tempNode;
        cdpmain.tempNode.Selected:=True;
        end;
  mrCancel: cdpmain.Refresh;
  end;
end;
end;
Процедура должна выполнять действия с элементами, что в главном проекте. В Uses библиотеки включен главный проект.
Вызываю пр-уру после создания проекта, когда он уже появился как рабочее окно (полагаю, если бы одновременно то ошибка была ясна).
kettanaito вне форума Ответить с цитированием
Старый 25.08.2011, 15:45   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

как DLL получает объект cdpmain?
rpy3uH вне форума Ответить с цитированием
Старый 25.08.2011, 15:47   #5
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

rpy3uH, вот так:
Код:
library libname;
uses
  ... main;
Где main.pas - и есть исходник с Tcdpmain.
kettanaito вне форума Ответить с цитированием
Старый 25.08.2011, 15:47   #6
DenNik2006
Пользователь
 
Аватар для DenNik2006
 
Регистрация: 27.07.2011
Сообщений: 71
По умолчанию

а как ты таким образом из библиотеки хочешь получить доступ к другому приложению?! О_о

а если в Uses библиотеки включен главный проект, то это вообще каша получится, так как главный проект скомпилируется в библиотеку!
Техника несовершенна: компьютеру, чтобы прийти в себя, нужно три пальца, человеку - всего два!
DenNik2006 вне форума Ответить с цитированием
Старый 25.08.2011, 15:49   #7
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

DenNik2006, как тогда правильно описать библиотеку, чтобы она могла выполнять действия с элементами в проекте, который ее вызывает?
kettanaito вне форума Ответить с цитированием
Старый 25.08.2011, 16:17   #8
DenNik2006
Пользователь
 
Аватар для DenNik2006
 
Регистрация: 27.07.2011
Сообщений: 71
По умолчанию

это слишком обширная тема, чтобы в трех словах описать. почитай Тейксейра/Пачеко или Дарахвелидзе/Марков
Техника несовершенна: компьютеру, чтобы прийти в себя, нужно три пальца, человеку - всего два!
DenNik2006 вне форума Ответить с цитированием
Старый 25.08.2011, 16:26   #9
DenNik2006
Пользователь
 
Аватар для DenNik2006
 
Регистрация: 27.07.2011
Сообщений: 71
По умолчанию

вот, в качестве бонуса, глава из книги, посвященная DLL
Вложения
Тип файла: zip Тейксейра С., Пачеко К. - Borland Delphi 6 DLL.zip (464.3 Кб, 8 просмотров)
Техника несовершенна: компьютеру, чтобы прийти в себя, нужно три пальца, человеку - всего два!
DenNik2006 вне форума Ответить с цитированием
Старый 25.08.2011, 17:22   #10
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Цитата:
Сообщение от kettanaito Посмотреть сообщение
DenNik2006, как тогда правильно описать библиотеку, чтобы она могла выполнять действия с элементами в проекте, который ее вызывает?
Передавать сам объект через параметр, либо адрес объекта (поскольку библ. работает в адресном пространстве проги)
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по dll ahpun Win Api 9 09.08.2011 13:41
Вопрос по dll Waqq Общие вопросы Delphi 4 20.02.2011 15:06
Вопрос по dll Exact Общие вопросы Delphi 2 20.12.2009 13:20
Вопрос по .DLL user_jasser Общие вопросы Delphi 3 09.11.2008 14:26
Вопрос о dll Altera Общие вопросы Delphi 9 26.04.2008 06:55