|
Вопрос # 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) - всё по старому - для каждого приложения - своя копия
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|