| 
| 
 | Вопрос # 1 156/ вопрос открыт / | 
 |  Здравствуйте!Как сделать в dll или COM-объекте статическую переменную? Например, есть счётчик, который считает, сколько раз вызвалась ф-ия и возвращает это значение. Загвоздка в том, что если запущено приложение А и приложение B и оба используют эту dll(COM-объект), то если приложение А вызвало эту ф-ию 3 раза, последний раз ему вернут 3. После этого, приложение B вызывает ф-ию и ему должно вернуться 4.
 
|  |   Вопрос задал: mvp (статус: 4-ый класс)Вопрос отправлен: 29 ноября 2007, 12:06
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Feniks Здравствуйте, mvp!Я конечно же не большой специалист в этой области, но в голову мне лезит только один мне известный способ - это использовать FileMapping функцией CreateFileMapping. Кажется она была описана в Хелпе. Суть ее заключается в том, что в памяти резервируется участок указанным Вами размером и туда можно пихать что угодно, как в поток. А потом из других приложений обращатся туда и читать. Приблизительный пример смотрите в атаче.
 Успехов Вам.
 К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)
 
 
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 29 ноября 2007, 12:42
 
 |  
 Мини-форум вопросаВсего сообщений: 15; последнее сообщение — 30 ноября 2007, 16:08; участников в обсуждении: 3. 
|   | Feniks (статус: Бакалавр), 29 ноября 2007, 12:33 [#1]:Правильно ли я Вас понял ? Вам нужна некая переменная-счетчик, которая будет хранить свое значения не зависимо от того, какая внешняя программа вызвала функцию из ДЛЛки ? |  
|   | mvp (статус: 4-ый класс), 29 ноября 2007, 12:33 [#2]:Обмен через файлы - не предлагать. В вопросе числа - лишь для простоты. На самом деле, там будет объект |  
|   | mvp (статус: 4-ый класс), 29 ноября 2007, 12:36 [#3]:2Feniks: не успел прочесть Ваше сообщение. Мне просто нужен доступ к одному экземпляру объекта с нескольких приложений. Что-то вроде сервера, к которому коннектятся клиенты, но через фызов ф-ий для передачи информации |  
|   | Feniks (статус: Бакалавр), 29 ноября 2007, 12:43 [#4]:Хотя наверняка можно еще 2-3 способа найти. Это все зависит от самой задачи и требований... |  
|   | mvp (статус: 4-ый класс), 29 ноября 2007, 12:46 [#5]:Вот пример простенькой dll: 
 library Project3dpr;
 uses
 SysUtils,
 Classes, Dialogs;
 const z : integer = 0;
 {$R *.res}
 function Test : integer; stdcall;
 
 begin
 inc(z);
 REsult := z;
 end;
 
 exports Test;
 begin
 end.
 
 Пример вызывающей программы:
 
 unit Unit4;
 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
 
 type
 proc = function : integer;
 TForm1 = class(TForm)
 Button1: TButton;
 procedure FormCreate(Sender: TObject);
 procedure Button1Click(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 z : proc;
 end;
 
 var
 Form1: TForm1;
 
 implementation
 
 {$R *.dfm}
 
 procedure TForm1.FormCreate(Sender: TObject);
 
 var h : integer;
 
 begin
 h := LoadLibrary('project3dpr.dll');
 if h > 32 then
 @z := GetProcAddress(h, 'Test');
 
 end;
 
 procedure TForm1.Button1Click(Sender: TObject);
 begin
 SHowmessage(intTOStr(z));
 end;
 
 end.
 |  
|   | mvp (статус: 4-ый класс), 29 ноября 2007, 12:49 [#6]:Возвращаемое значение - для каждой возвращаемой программы - своё  Думаю, если бы с числами разобраться, то и объекты будут по аналогии |  
|   | mvp (статус: 4-ый класс), 29 ноября 2007, 13:01 [#7]:2Feniks: не то... На самом деле, в объекте множество потоков и нельзя ничего никуда выгружать, мне нужна лишь ссылка на рабочий объект. Хотя попробую и Вашу идею - запишу в память ссылку, хотя тут тоже куча проблем... |  
|   | Вадим К (статус: Академик), 29 ноября 2007, 13:03 [#8]:Не стоит записывать в память ссылку и передавать между разными процессами - она будет невалидна. Для этого делают ком объекты.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Feniks (статус: Бакалавр), 29 ноября 2007, 13:06 [#9]:Естественно. У каждого экземпляра программы свой адресат памяти... |  
|   | mvp (статус: 4-ый класс), 29 ноября 2007, 13:16 [#10]:Вот и я о том же, что ссылка будет не валидна. Вадим, а как с COM? Аналогичный пример на COM у меня также не работает (для каждого exe - свой счётчик). Подозреваю, что нужно как-то по особому создавать COM-компонент, но кроме обычного Create, как ещё можно? |  
|   | mvp (статус: 4-ый класс), 29 ноября 2007, 13:18 [#11]:Глюк? У меня мини-форум пропал |  
|   | mvp (статус: 4-ый класс), 29 ноября 2007, 13:19 [#12]:Андрею нужно передать, что если написано последнее сообщение на первой(?) страничке минифорума, то мини-форум не виден, пока не напишут ещё одно сообщение |  
|   | Вадим К (статус: Академик), 29 ноября 2007, 13:49 [#13]:для COM объектов есть разные модели. вам нужно правильную выбрать. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | mvp (статус: 4-ый класс), 29 ноября 2007, 14:32 [#14]:2Вадим К: перебрал все комбинации Instancing (ciInternal, ciSingleInstance, ciMultiInstance) и ThreadingModel (tmSingle, tmApartment, tmFree, tmBoth, tmNeutral) - всё по старому - для каждого приложения - своя копия |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |