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

Delphi Sources



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

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

Цитата:
Сообщение от helgboy
Этого я и боялся... а в обратном направлении тоесть из окна основной программы я могу передать значения каких-то переменных в dll ?
Передавать данные можно как из EXE в DLL, так и наоборот. Главное представлять, что при этом происходит.
Цитата:
Сообщение от helgboy
Я так и делаю (эти значения устанавливаются combobox расположенным на основной форме) далее запускается dll с ловушкой для отслеживается нажатия клавиатуры,при каждом нажатии клавиш dll записывает значение переменной присвоенной в основной форме(в combobox) в текстовый файл. Так вот когда я открываю текстовый файл а там одни нули.... хотя переменной я присваивал число 1 или любое другое
Строки нужно передавать особым образом.
Когда создаёшь проект новой DLL'ки почитай в шаблоне сверху длинный комментарий по этому поводу.
У EXE и у DLL свои личные менеджеры памяти. В каком менеджере блок памяти был зарезервирован - в таком должен быть и освобождён. Или же используй (как написано в том комментарии) библиотеку borlndmm.dll.
Ответить с цитированием
  #17  
Старый 01.11.2012, 13:00
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Спасибо за то что направляете в нужную
"сторону" .
Вобщем почитал я в инете о Sharemem, многие советуют использовать модуль fastsharemem.
Вообщем как и говорилось в инструкции я скачал этот модуль
fastsharemem ver 2.0 кинул в папку с программой, объявил его в exe и в Dll компилируется все нормально но когда закрываю программу вылетает ошибка Invalid Pointer Operation.
Вы пользовались этим модулем не знаете из-за чего возникает эта ошибка?
Ответить с цитированием
  #18  
Старый 01.11.2012, 13:24
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
Вобщем почитал я в инете о Sharemem, многие советуют использовать модуль fastsharemem.
Вообщем как и говорилось в инструкции я скачал этот модуль
fastsharemem ver 2.0 кинул в папку с программой, объявил его в exe и в Dll компилируется все нормально но когда закрываю программу вылетает ошибка Invalid Pointer Operation.
Вы пользовались этим модулем не знаете из-за чего возникает эта ошибка?
Нет, не пользовался.
Ошибка "Invalid pointer operation" возникает при неправильной работе с указателем, например при попытке повторно освободить уже освобождённую память.
Модуль Sharemem должен быть объявлен в uses самым первым как в exe, так и в dll (думаю к fastsharemem это тоже относится).
Ответить с цитированием
  #19  
Старый 01.11.2012, 16:09
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Разобрался, подключил fastsharemem, все работает ошибок не выдает!
Но значения переменных из exe в dll все равно передаются неправильно , в exe присваиваю 1, в dll записываю ее в текстовый файл, а там при открытии нули..
Ответить с цитированием
  #20  
Старый 01.11.2012, 17:00
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Теперь если засунуть нужную мне переменную в аргументы функции (ловушки) которая запускается из exe то в dll эта переменная считывается правильно , НО!!! только в пределах самой функции-ловушки, в других процедурах и функциях dll эта переменная все равно ноль, что за ...
Ответить с цитированием
  #21  
Старый 01.11.2012, 17:35
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Уже нервов не хватает, походу толку от это fastsharemem ....
кто нибудь может дать универсальный рецепт с примером кода как в exe переменную, записать ее хоть в какой нибудь памяти, и успешно считать с любого места dll ки, не использую тупых ухищрений типа засовывания переменной в аргумент функции и прочего...

Казалось бы что может быть проще присвоить значение переменной в exe считать в dll уже третий день бьюсь, и все впустую
Ответить с цитированием
  #22  
Старый 01.11.2012, 18:10
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Без тупых ухищрений типа засовывания переменной в аргумент функции НЕЛЬЗЯ!
Что можно. Например так.

Раз
Код:
unit UMyParams;
interface
type
  TMyParams = record (* здесь описываем все переменные, 
                                   которые хотим видеть и там и там *)
     Int1 :Integer;
     Int2 :Integer;
     
  end;
  PMyParams = ^TMyParams;
var
  MyParams : PMyParams;
implementation
end.

В DLL

Код:
Library MyDLL;
uses UMyParams;
  
procedure SetMyParams(Params:PMyParams); stdcall;
begin
   MyParams := Params;
end;

procedure Work; stdcall;// любая другая процедура
begin
  writeln(ft,' Int1='+inttostr(MyParams.Int1)); 
  writeln(ft,' Int2='+inttostr(MyParams.Int2)); 
end;

export SetMyParams; 
export Work;

end.

В Exe

Код:
project MyExe;
uses UMyParams;
  
procedure SetMyParams(Params:PMyParams); stdcall; extern 'MyDLL.dll';
procedure Work;stdcall; extern 'MyDLL.dll';

begin
   new(MyParams);// создаём структуру с параметрами
   MyParams.Int1:=10;
   MyParams.Int2:=20;

   SetMyParams(MyParams);// передаём её адрес в DLL

  Work; // проверяем, что получилось

   MyParams.Int1:=30;
   MyParams.Int2:=40;

  Work; // проверяем, что получилось
      
end.

Ежели в структуре будут строки - необходимо подключать Sharemem или fastsharemem. Если там будут объектные типы, то стоит иметь ввиду, что операторы is и as работать не будут.

Ну как-то так
Ответить с цитированием
  #23  
Старый 01.11.2012, 18:25
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
Уже нервов не хватает, походу толку от это fastsharemem ....
кто нибудь может дать универсальный рецепт с примером кода как в exe переменную, записать ее хоть в какой нибудь памяти, и успешно считать с любого места dll ки, не использую тупых ухищрений типа засовывания переменной в аргумент функции и прочего...

Казалось бы что может быть проще присвоить значение переменной в exe считать в dll уже третий день бьюсь, и все впустую
Нервы нужно беречь и от программирования получать наслаждение
Вот тебе простейший пример во вложении.
После распаковки сначала открой DLL_Project1.dpr и откомпилируй его (получим dll-ку).
Потом открой EXE_Project1.dpr, запусти на выполнение, вводи разные числа, нажимай кнопку Button1 и смотри что появляется в текстовом файле test.log.

UPD
Немного усложнил пример. Теперь можно передавать в dll-ку не только числа но и короткие строки (ShortString) и длинный текст (PChar).
Вложения
Тип файла: 7z TestDll.7z (2.3 Кбайт, 24 просмотров)

Последний раз редактировалось poli-smen, 01.11.2012 в 19:03.
Ответить с цитированием
  #24  
Старый 02.11.2012, 16:03
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Вообщем изучил я оба варианта и для себя окончательно уяснил чтоб использовать в dll переменные объявленные в exe необходимо их постоянно за собой "тянуть в аргументах функции". Причем в каждой функции в Dll.
Меня такой вариант не устраивает, поэтому я решил переделать структуру программы.

В exe вызывается ловушка из DLL, считывается нажатие клавиши на клавиатуре - запускается функция keyctrl в exe которая уже производит мат операции со всеми нужными мне переменными.

Все это сделал, все функции успешно вызываются, но опять облом... внутри keyctrl опять все переменные равны нулю... конечно я не объявлял их в аргументах и не тянул все 35 переменных в dll и обратно в exe хотябы из соображения безопасности. Почему переменные обнуляются.. ведь они используются внутри одного PASа в главной программе...
Ответить с цитированием
  #25  
Старый 02.11.2012, 16:19
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

А ну да я вернулся туда откуда начал... переменные не будут обнуляться если присвоить keyctrl к классу формы main, потому что все остальные функции где используються необходимые переменные присвоены к этому классу, а если присвой keyctrl к классу формы то он не запуститься из dll вот опять замкнулся круг, выход один, тянуть все 35 переменных в dll и обратно через аргументы или есть какой нибудь фокус в работе с классами???? И вообще че то не заметил я толку от подключенного FastShareMem ...
Ответить с цитированием
  #26  
Старый 02.11.2012, 17:13
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

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

Цитата:
Сообщение от helgboy
Все это сделал, все функции успешно вызываются, но опять облом... внутри keyctrl опять все переменные равны нулю... конечно я не объявлял их в аргументах и не тянул все 35 переменных в dll и обратно в exe хотябы из соображения безопасности. Почему переменные обнуляются.. ведь они используются внутри одного PASа в главной программе...
Сами по себе переменные не обнуляться. Ты явно делаешь что-то не то.
Цитата:
Сообщение от helgboy
А ну да я вернулся туда откуда начал... переменные не будут обнуляться если присвоить keyctrl к классу формы main, потому что все остальные функции где используються необходимые переменные присвоены к этому классу, а если присвой keyctrl к классу формы то он не запуститься из dll вот опять замкнулся круг,
По моему ты всё усложняешь на пустом месте. Похоже что у тебя неверно спроектирована структура приложения.
Цитата:
Сообщение от helgboy
выход один, тянуть все 35 переменных в dll и обратно через аргументы или есть какой нибудь фокус в работе с классами????
А разве при работе с классами тебе не пришлось бы тянуть все 35 переменных? Если тебе обязательно нужны классы с которыми можно было бы работать через библиотеки, то используй bpl-ки вместо dll-ок. Но предупреждаю, что это довольно хлопотно. Лучше работать через традиционные структуры - записи (record) или массивы.
Цитата:
Сообщение от helgboy
И вообще че то не заметил я толку от подключенного FastShareMem ...
Смысл в том, что если не использовать borlndmm.dll, то у exe и у dll будет у каждого личный диспетчер памяти, из-за чего нужно строго следить чтобы память зарезервированная под переменную в одном диспетчере памяти в нём же потом и освобождалась. А автоматические типы (строки, динамические массивы и т.п.) и вовсе использовать нельзя. Если же использовать borlndmm.dll, то будет один единственный диспетчер памяти, поэтому переменная зарезервировавшая память в exe-шнике, может преспокойно освободить её в dll-ке и наоборот.
Цитата:
Сообщение от helgboy
думаю может плюнуть на все и использовать запись в обычный файл или это очень медленно будет?
А разве это не будет тасканием 35 переменных в dll и обратно?
Ответить с цитированием
  #28  
Старый 05.11.2012, 01:52
helgboy helgboy вне форума
Прохожий
 
Регистрация: 30.10.2012
Сообщения: 33
Репутация: 10
По умолчанию

Уважаемый poli-smen, по-моему мы уже все запутались.
В структуре у меня все верно. Объяснять на пальцах долго, поэтому я взял вами же написанный пример и в exe добавил процедуру summa , а вызвал ее из dll .
Так вот вместо того чтоб выдать сообщение с удвоенным числом она выдает ноль...
Вложения
Тип файла: rar TestDll.rar (343.4 Кбайт, 4 просмотров)
Ответить с цитированием
  #29  
Старый 05.11.2012, 02:08
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от helgboy
Уважаемый poli-smen, по-моему мы уже все запутались.
В структуре у меня все верно. Объяснять на пальцах долго, поэтому я взял вами же написанный пример и в exe добавил процедуру summa , а вызвал ее из dll .
Так вот вместо того чтоб выдать сообщение с удвоенным числом она выдает ноль...
Что-то я не увидел, чтобы dll-ка вызывала функцию summa из exe-шника. Я вижу только, что dll-ка подключает к себе тот же модуль (EXE_Unit1) который подключает себе и exe-шник. Итого получается, что exe-шник работает со своей копией EXE_Unit1.pas, а dll-ка со своей копией EXE_Unit1.pas. Естественно, что между этими модулями нет никакой связи. Одна копия этого модуля "вкомпилирована" в exe-шник, другая "вкомпилирована" в dll-ку. Поэтому когда dll-ка вызывает функцию summa, то она вызывает ту, которая внутри неё, а вовсе не внутри exe-шника.
Фух. Ну вроде понятно объяснил?
Ответить с цитированием
  #30  
Старый 05.11.2012, 02:33
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Если проблема с вызовами процедур из экзшника можешь передавать в параметре указатель на них и вызывать по указателю. Без параметров не обойтись никак . Все точно так и обстоит, как пишет poli-smen -модули для экзшника и длл-ки компилируются отдельно.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter