Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.03.09;
Скачать: CL | DM;

Вниз

переменные в DLL   Найти похожие ветки 

 
Suffer   (2013-05-18 18:15) [0]

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

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

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


 
clickmaker ©   (2013-05-18 18:53) [1]

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

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


 
clickmaker ©   (2013-05-18 19:37) [2]

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


 
clickmaker ©   (2013-05-18 19:51) [3]

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


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

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


 
NoUser ©   (2013-05-19 02:35) [5]

>  как по 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 04:09) [6]


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

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2014.03.09;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
4-1268922249
Nilm
2010-03-18 17:24
2014.03.09
Запуск процесса с пониженными привилегиями


15-1379519131
Необычный порошок
2013-09-18 19:45
2014.03.09
вифи камера и роутер за так


4-1268848506
tippa
2010-03-17 20:55
2014.03.09
uptime системы


15-1379622602
Юрий
2013-09-20 00:30
2014.03.09
С днем рождения ! 20 сентября 2013 пятница


15-1379709002
Юрий
2013-09-21 00:30
2014.03.09
С днем рождения ! 21 сентября 2013 суббота