![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Последовательный доступ к MMF [D7, XP]
Muxa/Ibl4 © (2009-07-14 22:12:00)Уважаемые коллеги, прошу помочь в реализации.
Что_имеем:2 программы(или более) на одном компе, каждая имеет некую DLL(по сути это одна библиотечка просто для портативности для каждой проги нужна копия DLL).
Что_нуна:Реализовать в DLL механизм чтения/записи данных в MMF (можно последовательный - но не обязательно).
Что_получилось:получилось реализовать 2 приложения работающие с DLL, и саму DLL. Но проблема в том что если 1приложение работает со совей копией DLL то 2 уже не может работать со своей.
Как быть? Если кто то швырнет в меня примером библиотечки (желательно с возможность последовательного доступа) - то я буду очень счастливым человеком.
Loginov Dmitry (2009-07-14 22:44:00) [21]Это именно говнокод. Все верно.
Здесь
http://www.delphimaster.ru/cgi-bin/forum.pl?n=6&id=1247596906
можно в целях изучения MMFпосмотреть, что когда-то предлагали Тейксера и Пачека.
Игорь Шевченко (2009-07-14 22:42:00) [22]program files\borland\bds\x.0\demos\DelphiWin32\vclwin32\IPCDemos\*.*
Muxa/Ibl4 (2009-07-14 22:36:00) [23]Вот подобие моего говнокода
library DllMmfDate;
uses
ShareMem,
SysUtils,
windows,
md5 in 'md5.pas';
type
User = record
sName : string;
iId : integer;
end;
aUser = array of User;
Command = record
sTitle : string;
iId: integer;
end;
aCommand = array of Command;
info = record
ListUser : aUser;
ListCommand: aCommand;
end;
tinfo = ^info;
var
SendMMF: THandle;
SendData: PChar;
const
NameAreaForWwork = 'trulala';
function writeMMF ( param : info ) : boolean;
var
rw : tinfo;
begin
if (MapViewOfFile(SendMMF, FILE_MAP_WRITE, 0, 0, 0) = nil ) then Begin
SendMMF := CreateFileMapping( $FFFFFFFF, Nil, PAGE_READWRITE, 0, SizeOf(DWORD), NameAreaForWwork);
end;
rw := MapViewOfFile(SendMMF, FILE_MAP_WRITE, 0, 0, 0);
rw^ := param;
Result :=true;
end;
function readMMF() : tinfo;
begin
if ( MapViewOfFile(SendMMF, FILE_MAP_READ, 0, 0, 0) = nil ) then Begin
SendMMF := CreateFileMapping( $FFFFFFFF, Nil, PAGE_READWRITE, 0, SizeOf(DWORD), NameAreaForWwork);
end else begin
SendMMF := OpenFileMapping(FILE_MAP_READ, False, NameAreaForWwork);
end;
Result := MapViewOfFile(SendMMF, FILE_MAP_READ, 0, 0, 0);
end;
function addUser( sUserName, iIdUser : PChar ): PChar; stdcall;
var
r : info;
rp : tinfo;
aUsers : aUser;
begin
rp := readMMF();
r := rp^;
aUsers := r.aUser;
setLength(termW, Length(aUsers)+1);
termW[Length(aUsers)-1].sName := sUserName;
termW[Length(aUsers)-1].terminalName := iIdUser;
r.aUser := aUsers;
writeMMF( r );
//.........
Result := 'тут текстовый результ';
end;
function getUserAll(): aUser; stdcall;
var
r : info;
rp : tinfo;
begin
rp := readMMF();
r := rp^;
Result := r.aUser;
end;
exports addUser, getUserAll;
begin
end.
Muxa/Ibl4 (2009-07-14 22:36:00) [24]Долго объяснять но так требуют великие боги.
Юрий Зотов (2009-07-14 22:31:00) [25]Не понял насчет копий DLL. Почему каждый EXE не может загрузить одну и ту же DLL и с ней работать?
Loginov Dmitry (2009-07-14 22:29:00) [26]Отсутствует наиболее важное:
Как пытался получить
Rouse_ (2009-07-14 22:14:00) [27]
> если 1приложение работает со совей копией DLL то 2 уже не
> может работать со своей.
SHARE_ права выставилил при открытии?