Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 156

/ вопрос открыт /

Здравствуйте!
Как сделать в dll или COM-объекте статическую переменную? Например, есть счётчик, который считает, сколько раз вызвалась ф-ия и возвращает это значение. Загвоздка в том, что если запущено приложение А и приложение B и оба используют эту dll(COM-объект), то если приложение А вызвало эту ф-ию 3 раза, последний раз ему вернут 3. После этого, приложение B вызывает ф-ию и ему должно вернуться 4.

mvp Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

Feniks (статус: Бакалавр), 29 ноября 2007, 12:33 [#1]:

Правильно ли я Вас понял ? Вам нужна некая переменная-счетчик, которая будет хранить свое значения не зависимо от того, какая внешняя программа вызвала функцию из ДЛЛки ?
mvp

mvp (статус: 4-ый класс), 29 ноября 2007, 12:33 [#2]:

Обмен через файлы - не предлагать. В вопросе числа - лишь для простоты. На самом деле, там будет объект
mvp

mvp (статус: 4-ый класс), 29 ноября 2007, 12:36 [#3]:

2Feniks: не успел прочесть Ваше сообщение. Мне просто нужен доступ к одному экземпляру объекта с нескольких приложений. Что-то вроде сервера, к которому коннектятся клиенты, но через фызов ф-ий для передачи информации
Feniks

Feniks (статус: Бакалавр), 29 ноября 2007, 12:43 [#4]:

Хотя наверняка можно еще 2-3 способа найти. Это все зависит от самой задачи и требований...
mvp

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

mvp (статус: 4-ый класс), 29 ноября 2007, 12:49 [#6]:

Возвращаемое значение - для каждой возвращаемой программы - своё :( Думаю, если бы с числами разобраться, то и объекты будут по аналогии
mvp

mvp (статус: 4-ый класс), 29 ноября 2007, 13:01 [#7]:

2Feniks: не то... На самом деле, в объекте множество потоков и нельзя ничего никуда выгружать, мне нужна лишь ссылка на рабочий объект. Хотя попробую и Вашу идею - запишу в память ссылку, хотя тут тоже куча проблем...
Вадим К

Вадим К (статус: Академик), 29 ноября 2007, 13:03 [#8]:

Не стоит записывать в память ссылку и передавать между разными процессами - она будет невалидна.
Для этого делают ком объекты.
Галочка "подтверждения прочтения" - вселенское зло.
Feniks

Feniks (статус: Бакалавр), 29 ноября 2007, 13:06 [#9]:

Естественно. У каждого экземпляра программы свой адресат памяти...
mvp

mvp (статус: 4-ый класс), 29 ноября 2007, 13:16 [#10]:

Вот и я о том же, что ссылка будет не валидна. Вадим, а как с COM? Аналогичный пример на COM у меня также не работает (для каждого exe - свой счётчик). Подозреваю, что нужно как-то по особому создавать COM-компонент, но кроме обычного Create, как ещё можно?
mvp

mvp (статус: 4-ый класс), 29 ноября 2007, 13:18 [#11]:

Глюк? У меня мини-форум пропал
mvp

mvp (статус: 4-ый класс), 29 ноября 2007, 13:19 [#12]:

Андрею нужно передать, что если написано последнее сообщение на первой(?) страничке минифорума, то мини-форум не виден, пока не напишут ещё одно сообщение
Вадим К

Вадим К (статус: Академик), 29 ноября 2007, 13:49 [#13]:

для COM объектов есть разные модели. вам нужно правильную выбрать.
Галочка "подтверждения прочтения" - вселенское зло.
mvp

mvp (статус: 4-ый класс), 29 ноября 2007, 14:32 [#14]:

2Вадим К: перебрал все комбинации Instancing (ciInternal, ciSingleInstance, ciMultiInstance) и ThreadingModel (tmSingle, tmApartment, tmFree, tmBoth, tmNeutral) - всё по старому - для каждого приложения - своя копия
mvp

mvp (статус: 4-ый класс), 30 ноября 2007, 16:08 [#15]:

Вопрос снят. Нужно было COM-объект делать в виде exe и кой-чего подправить. Если кому интересно, сиотрите статью http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1317
Только нужно сделать exe.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:48
Выполнено за 0.02 сек.