Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

переменные в DLL [D7, XP]


Suffer ©   (2013-05-18 18:15:00) 

Нужна помощь. Есть DLL, которую подгружают в свое адресное пространство несколько программ, но каждый раз при подключении к новому адресному пространству создается новый экземпляр Dll и все переменные описанные в DLL в блоке VAR стираются(становятся пустыми).

при помощи LoadLibrary я могу узнать Hinstance у текущей подгруженной DLL.

Подскажите пожалуйста как по Hinstance можно присвоить значение переменной описанной в Экземпляре библиотеки???


Suffer   (2013-05-20 00:10:00) [1]

Обращение к переменным не делаю, но так как с File Maping не разбирался то создал типизированный file и помещал туда объекты, а в DLL уже извлекал!!


Suffer   (2013-05-20 00:07:00) [2]

С File Mapping не знаком, но разберусь, спасибо!!!


Германн   (2013-05-19 04:09:00) [3]


> NoUser ©   (19.05.13 02:35) [5]
>
> >  как по Hinstance можно присвоить значение переменной
> ...
> никак.
>

Этого заявления было вполне достаточно.


NoUser   (2013-05-19 02:35:00) [4]

>  как по Hinstance можно присвоить значение переменной ...
никак.


library DllVar;
uses Windows;
//---------------------
type
 PMyData = ^TMyData;
 TMyData = record
   D1 :Integer;
   D2 :Integer;
   SubData : record
     A1 :Cardinal;
     A2 :Cardinal;
   end;
 end;
//---------------------
var
 hMap      : THandle;
 MyDataPtr : PMyData;
//---------------------
procedure MyDllProc(Reason:Integer);
begin
 if Reason = DLL_PROCESS_DETACH then begin
   UnmapViewOfFile(MyDataPtr);
   CloseHandle(hMap);
 end;
end;
//---------------------
function MyDataInDll:PMyData;
begin
 Result:=MyDataPtr;
end;
exports
 MyDataInDll;
//---------------------
begin
 hMap := CreateFileMapping(INVALID_HANDLE_VALUE,nil,PAGE_READWRITE,0,sizeof(TMyData),PCha r('MyData'));
 MyDataPtr := MapViewOfFile(hMap ,FILE_MAP_WRITE or FILE_MAP_READ,0,0,0);
 DllProc := @MyDllProc;
end.


Но, Suffer, помни! File Mapping  - не панацея.     :)


Плохиш   (2013-05-19 00:13:00) [5]

DLL работают в адресном пространстве вызвавшего процесса, т.к. не получится легко тырит данные из других програм.


clickmaker   (2013-05-18 19:51:00) [6]

в принципе можно и File Mapping использовать для создания разделяемой области. Создавать маппинг в DLL_PROCESS_ATTACH, отмапливать в DLL_PROCESS_DETACH


clickmaker   (2013-05-18 19:37:00) [7]

а, хрен, вру. В дельфи  data_seg не сделаешь...
Тогда через экспортирумые функции получать/записывать значения


clickmaker   (2013-05-18 18:53:00) [8]

> каждый раз при подключении к новому адресному пространству
> создается новый экземпляр Dll и все переменные описанные
> в DLL в блоке VAR стираются

глобальные переменные являются разделяемыми


Наверх

Титульная страница Поиск, карта сайта Написать письмо