Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.10.2012, 16:06
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
Вопрос Не все функции работают в DLL

Доброго времени суток! Я новичек в использовании библиотек dll . Вот суть проблемы:
Есть основная программа main.dpr в ней объявлена процедура

Код:
procedure keyctrl();
begin
writedata;   // обявлено в другом модуле  mod.pas 
writeln(ft,' x='+inttostr(x)+' writedata'); // 
end;

есть библиотека
libr.dll в ней создана ловушка для перехвата сообщений с клавиатуры, в определенный момент с библиотеки вызывается процедура keyctrl();
так вот почему то в этой вызванной процедуре выполняются все действия кроме writedata; // обявлено в другом модуле mod.pas

Во время выполнения программы никаких ошибок не возникает ... просто проходит мимо этого действия и все...
Ответить с цитированием
  #2  
Старый 31.10.2012, 03:56
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
так вот почему то в этой вызванной процедуре выполняются все действия кроме writedata; // обявлено в другом модуле mod.pas
А вот меня интересует как Delphi у тебя смог скомпилировать модуль с таким именем? У меня наотрез отказывается так как mod это зарезервированное слово.
Ты на 100% уверен, что вызываешь writedata именно из модуля mod.pas, а не из какого-то другого?
Ответить с цитированием
  #3  
Старый 31.10.2012, 10:17
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

нет, прошу прощения называется он tmod.pas и процедура writedata успешно вызывается из любого места программы кроме библиотеки
Ответить с цитированием
  #4  
Старый 31.10.2012, 10:25
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
нет, прошу прощения называется он tmod.pas и процедура writedata успешно вызывается из любого места программы кроме библиотеки
Т.е. в процедуре keyctrl вызывается writeln, но не вызывается writedata? Не верю.
Ответить с цитированием
  #5  
Старый 31.10.2012, 12:27
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

какой-то полтергейст, вчера никак не хотело работать, сегодня после десятка манипуляций, открытий сохранений перезагрузок, функция writedata стала выполнятся, правда с кое-каками мат. ошибками. И вот попутная проблема.
Чтоб все было совсем хорошо надо объявить процедуру не после var а в type и дальше в программе описать ее так:
Код:
procedure Tmain.keyctrl();
begin
writedata;   // обявлено в другом модуле  mod.pas
writeln(ft,' x='+inttostr(x)); //
Nperemennoy();// Необходим вызов этой функции... как сделать правильно?
end;

procedure Tmain.Nperemennoy();
begin
...
end;


Так вот теперь уже проблема вызвать keyctrl() из библиотеки пишет что не может найти такую процедуру, а
если обьявляю так:
Код:
procedure keyctrl();
begin
writedata;   // обявлено в другом модуле  mod.pas
writeln(ft,' x='+inttostr(x)); //
Nperemennoy();// Необходим вызов этой функции... как сделать правильно?
end;
то процедура вызывается из библиотеки но тогда не вызвается Nperemennoy(); Как сделать чтоб все вызывалось?
Ответить с цитированием
  #6  
Старый 31.10.2012, 12:49
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Тут сказывается мое плохое понимание для работы с классами
Код:
type
  Tmain = class(TForm)
procedure keyctrl();
procedure Nperemennoy();
end;

var
....
implementation

begin
procedure Tmain.keyctrl();
begin
writedata;   // обявлено в другом модуле  mod.pas
writeln(ft,' x='+inttostr(x)); //
Nperemennoy();// Необходим вызов этой функции... как сделать правильно?
end;
 
procedure Tmain.Nperemennoy();
begin
...
end;
.....
end.

Вот нужно переделать походу чтоб функция keyctrl не присваивалась к классу главной формы и тем не менее могла сама вызывать Nperemennoy();
а также без проблем вызываться из библиотеки.
Ответить с цитированием
  #7  
Старый 31.10.2012, 12:49
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
Так вот теперь уже проблема вызвать keyctrl() из библиотеки пишет что не может найти такую процедуру,
Ну компилятор врать не будет. Возможно ты пытаешься вызвать метод как процедуру?
Цитата:
Сообщение от helgboy
а
если обьявляю так:
Код:
procedure keyctrl();
begin
writedata;   // обявлено в другом модуле  mod.pas
writeln(ft,' x='+inttostr(x)); //
Nperemennoy();// Необходим вызов этой функции... как сделать правильно?
end;
то процедура вызывается из библиотеки но тогда не вызвается Nperemennoy(); Как сделать чтоб все вызывалось?
А каким образом ты определяешь, что Nperemennoy не вызывается? Поставь внутри процедуры Nperemennoy в самом начале MessageBeep(0); (только модуль Windows подключи) - слышно звук при вызове процедуры keyctrl?
Ответить с цитированием
  #8  
Старый 31.10.2012, 12:54
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
Вот нужно переделать походу чтоб функция keyctrl не присваивалась к классу главной формы и тем не менее могла сама вызывать Nperemennoy();
а также без проблем вызываться из библиотеки.
Чтобы "функция keyctrl не присваивалась к классу главной формы" убери её объявление из класса Tmain и в описании убери "Tmain." перед именем.
Ответить с цитированием
  #9  
Старый 31.10.2012, 13:52
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Чтобы "функция keyctrl не присваивалась к классу главной формы" убери её объявление из класса Tmain и в описании убери "Tmain." перед именем.
Да это все понятно если убирую keyctrl из класса Tmain то компиляция останавливается на строчке :

Nperemennoy();


и выдает ошибку
[Error] main.pas(165): Undeclared identifier: 'Nperemennoy'
Ответить с цитированием
  #10  
Старый 31.10.2012, 13:57
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
Да это все понятно если убирую keyctrl из класса Tmain то компиляция останавливается на строчке :

Nperemennoy();


и выдает ошибку
[Error] main.pas(165): Undeclared identifier: 'Nperemennoy'
И правильно он ошибку выдаёт, потому что ты пытаешься вызывать метод "Tmain.Nperemennoy" как будто обычную процедуру "Nperemennoy".
Ответить с цитированием
  #11  
Старый 31.10.2012, 14:15
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
И правильно он ошибку выдаёт, потому что ты пытаешься вызывать метод "Tmain.Nperemennoy" как будто обычную процедуру "Nperemennoy".

Ну хорошо как же мне вызвать метод из обычной процедуры???? если сделать так:
Код:
procedure keyctrl();
begin
writedata;   // обявлено в другом модуле  mod.pas
writeln(ft,' x='+inttostr(x)); //
Tmain.Nperemennoy();// Необходим вызов этой функции... как сделать правильно?
end;

то ругается так:
[Error] main.pas(166): This form of method call only allowed for class methods
Ответить с цитированием
  #12  
Старый 31.10.2012, 15:07
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
Ну хорошо как же мне вызвать метод из обычной процедуры???? если сделать так:
Код:
procedure keyctrl();
begin
writedata;   // обявлено в другом модуле  mod.pas
writeln(ft,' x='+inttostr(x)); //
Tmain.Nperemennoy();// Необходим вызов этой функции... как сделать правильно?
end;

то ругается так:
[Error] main.pas(166): This form of method call only allowed for class methods
Правильно ругается Если тебе нужно вызывать метод из класса (а не из объекта как обычно), то такой метод тебе нужно объявить как классовый. Только вот зачем ты оформил Nperemennoy как метод класса Tmain, а не как обычную процедуру?
Ответить с цитированием
  #13  
Старый 31.10.2012, 15:19
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Правильно ругается Если тебе нужно вызывать метод из класса (а не из объекта как обычно), то такой метод тебе нужно объявить как классовый. Только вот зачем ты оформил Nperemennoy как метод класса Tmain, а не как обычную процедуру?

Потому что с ней завязано куча элементов который расположены на главной форме Combobox , label, и др.... Вообщем никак по другому. Nperemennoy() - должно быть объявлено как метод ... Другими словами моя злополучная библиотека отслеживает нажатия клавиш и в соответствии от этого меняются значения и свойства элементов расположенных на главной форме

Цитата:
Сообщение от poli-smen
метод тебе нужно объявить как классовый.
как это делается?
Ответить с цитированием
  #14  
Старый 31.10.2012, 15:39
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
Потому что с ней завязано куча элементов который расположены на главной форме Combobox , label, и др.... Вообщем никак по другому. Nperemennoy() - должно быть объявлено как метод ... Другими словами моя злополучная библиотека отслеживает нажатия клавиш и в соответствии от этого меняются значения и свойства элементов расположенных на главной форме
Ты хочешь чтобы dll-ка вызывала метод класса Tmain который объявлен в exe-шнике? Так у тебя не получится.
Цитата:
Сообщение от helgboy
как это делается?
Нужно поставить слово class перед словом procedure или function. Только это тебе не поможет, так как классовые методы не могут использовать поля объекта (потому что объекта никакого и нету).
Ответить с цитированием
  #15  
Старый 31.10.2012, 16:24
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Этого я и боялся... а в обратном направлении тоесть из окна основной программы я могу передать значения каких-то переменных в dll ?
Я так и делаю (эти значения устанавливаются combobox расположенным на основной форме) далее запускается dll с ловушкой для отслеживается нажатия клавиатуры,при каждом нажатии клавиш dll записывает значение переменной присвоенной в основной форме(в combobox) в текстовый файл. Так вот когда я открываю текстовый файл а там одни нули.... хотя переменной я присваивал число 1 или любое другое
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter