|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
Цитата:
Цитата:
Когда создаёшь проект новой DLL'ки почитай в шаблоне сверху длинный комментарий по этому поводу. У EXE и у DLL свои личные менеджеры памяти. В каком менеджере блок памяти был зарезервирован - в таком должен быть и освобождён. Или же используй (как написано в том комментарии) библиотеку borlndmm.dll. |
#17
|
|||
|
|||
Спасибо за то что направляете в нужную
"сторону" . Вобщем почитал я в инете о Sharemem, многие советуют использовать модуль fastsharemem. Вообщем как и говорилось в инструкции я скачал этот модуль fastsharemem ver 2.0 кинул в папку с программой, объявил его в exe и в Dll компилируется все нормально но когда закрываю программу вылетает ошибка Invalid Pointer Operation. Вы пользовались этим модулем не знаете из-за чего возникает эта ошибка? |
#18
|
||||
|
||||
Цитата:
Ошибка "Invalid pointer operation" возникает при неправильной работе с указателем, например при попытке повторно освободить уже освобождённую память. Модуль Sharemem должен быть объявлен в uses самым первым как в exe, так и в dll (думаю к fastsharemem это тоже относится). |
#19
|
|||
|
|||
Разобрался, подключил fastsharemem, все работает ошибок не выдает!
Но значения переменных из exe в dll все равно передаются неправильно , в exe присваиваю 1, в dll записываю ее в текстовый файл, а там при открытии нули.. |
#20
|
|||
|
|||
Теперь если засунуть нужную мне переменную в аргументы функции (ловушки) которая запускается из exe то в dll эта переменная считывается правильно , НО!!! только в пределах самой функции-ловушки, в других процедурах и функциях dll эта переменная все равно ноль, что за ...
|
#21
|
|||
|
|||
Уже нервов не хватает, походу толку от это fastsharemem ....
кто нибудь может дать универсальный рецепт с примером кода как в exe переменную, записать ее хоть в какой нибудь памяти, и успешно считать с любого места dll ки, не использую тупых ухищрений типа засовывания переменной в аргумент функции и прочего... Казалось бы что может быть проще присвоить значение переменной в exe считать в dll уже третий день бьюсь, и все впустую |
#22
|
|||
|
|||
Без тупых ухищрений типа засовывания переменной в аргумент функции НЕЛЬЗЯ!
Что можно. Например так. Раз Код:
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
|
||||
|
||||
Цитата:
Вот тебе простейший пример во вложении. После распаковки сначала открой DLL_Project1.dpr и откомпилируй его (получим dll-ку). Потом открой EXE_Project1.dpr, запусти на выполнение, вводи разные числа, нажимай кнопку Button1 и смотри что появляется в текстовом файле test.log. UPD Немного усложнил пример. Теперь можно передавать в dll-ку не только числа но и короткие строки (ShortString) и длинный текст (PChar). Последний раз редактировалось poli-smen, 01.11.2012 в 19:03. |
#24
|
|||
|
|||
Вообщем изучил я оба варианта и для себя окончательно уяснил чтоб использовать в dll переменные объявленные в exe необходимо их постоянно за собой "тянуть в аргументах функции". Причем в каждой функции в Dll.
Меня такой вариант не устраивает, поэтому я решил переделать структуру программы. В exe вызывается ловушка из DLL, считывается нажатие клавиши на клавиатуре - запускается функция keyctrl в exe которая уже производит мат операции со всеми нужными мне переменными. Все это сделал, все функции успешно вызываются, но опять облом... внутри keyctrl опять все переменные равны нулю... конечно я не объявлял их в аргументах и не тянул все 35 переменных в dll и обратно в exe хотябы из соображения безопасности. Почему переменные обнуляются.. ведь они используются внутри одного PASа в главной программе... |
#25
|
|||
|
|||
А ну да я вернулся туда откуда начал... переменные не будут обнуляться если присвоить keyctrl к классу формы main, потому что все остальные функции где используються необходимые переменные присвоены к этому классу, а если присвой keyctrl к классу формы то он не запуститься из dll вот опять замкнулся круг, выход один, тянуть все 35 переменных в dll и обратно через аргументы или есть какой нибудь фокус в работе с классами???? И вообще че то не заметил я толку от подключенного FastShareMem ...
|
#26
|
|||
|
|||
думаю может плюнуть на все и использовать запись в обычный файл или это очень медленно будет?
|
#27
|
|||||
|
|||||
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
#28
|
|||
|
|||
Уважаемый poli-smen, по-моему мы уже все запутались.
В структуре у меня все верно. Объяснять на пальцах долго, поэтому я взял вами же написанный пример и в exe добавил процедуру summa , а вызвал ее из dll . Так вот вместо того чтоб выдать сообщение с удвоенным числом она выдает ноль... |
#29
|
||||
|
||||
Цитата:
Фух. Ну вроде понятно объяснил? |
#30
|
||||
|
||||
Если проблема с вызовами процедур из экзшника можешь передавать в параметре указатель на них и вызывать по указателю. Без параметров не обойтись никак . Все точно так и обстоит, как пишет poli-smen -модули для экзшника и длл-ки компилируются отдельно.
|