NamedPipesFPC (
https://github.com/dezlov/NamedPipesFPC) от Дезлова заработал ... И даже влез на канал wmrcam (программа WMRViewer и example могут как то ""мешать друг другу" ) но предать и принять что-то кроме строк пока не выходит ...
- Код: Выделить всё
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls,NamedPipes;
...
Const
ServerInstances = 5;
ClientInstances = 20;
ClientDelayMin = 100;
ClientDelayMax = 500;
ClientNumMessages = 3;
ServerIdleTimeout = 5000;
UniquePipeName = 'wmrcam';
function GetInstanceInfo: String;
begin
Result := Format('$%x:$%x', [GetProcessID, GetThreadID]);
end;
...
procedure TForm1.Button3Click(Sender: TObject);
var
Server: TNamedPipeServerStream;
Client: TNamedPipeClientStream;
PB,PB2:Pointer;
BB,B1,b2:tBitmap ;
PBB^:Array[1..2] of byte;
begin
// На форму закинуты Image1 и Image2 , Image1 пустой
B1:=Image1.Picture.Bitmap ;b1.SetSize(640,480);
//... а в Image2 лежит тестовая картинка 640,480....
B2:=Image2.Picture.Bitmap ;
// Конверсия ( просто картинка попалась 32 бита )
bb:=tBitmap.Create; bb.SetSize(640,480);bb.PixelFormat:=pf24bit;; bb.Canvas.Draw(0,0,b2);
// Создаю сервер
Server := TNamedPipeServerStream.Create(UniquePipeName);
try
Server.Open; //Открываю канал на сервере ...
// Создаю клиент
Client := TNamedPipeClientStream.Create(UniquePipeName);
try
Client.Open; //Открываю канал на клиенте
// Тест передачи строк. Server-> Client
Server.WriteAnsiString('Server ->TEST');
Memo1.Lines.Add (Client.ReadAnsiString);
// Тест передачи строк. Client ->Server
Client.WriteAnsiString('Client -> Test message at ' + DateTimeToStr(Now));
Memo1.Lines.Add (Server.ReadAnsiString);
// Пытаюсь предать картину
B1.BeginUpdate;
PB:=B1.RawImage.Data;
PB2:=Bb.RawImage.Data;
GetMem(PBB,Bb.RawImage.DataSize);
move (pb2^,PBB^,Bb.RawImage.DataSize);
Server.WriteBuffer(pbb^ ,Bb.RawImage.DataSize ); // Весит тут!
FillChar(PBB^,Bb.RawImage.DataSize,0);
Client.ReadBuffer( pbb^,Bb.RawImage.DataSize);
move (PBB^,pb^,Bb.RawImage.DataSize);
FreeMem(PBB,Bb.RawImage.DataSize);
B1.EndUpdate;
bb.Free;
Image1.Refresh;
finally
Client.Free;
end;
finally
Server.Free;
end;
form1.Memo1.Lines.Add ('Finished. Press enter key...');
end;
На этапе Server.WriteBuffe прога вешается ...
(Кстати интересно то что канал двухсторонний передача идет как в строну Server-> Client так и Client ->Server )
Зы
Есть идея что нужно сделать два разных параллельных потока, но со строками все работает и так...
Добавлено спустя 37 минут 14 секунд:serbod писал(а):Самый простой способ использовать Named pipes через компонент DataPort (доступен через Online package manager).
Это он ?
https://github.com/serbod/dataport (Полезная штука, спасибо ! Но сомневаюсь, что она проще чем модуль NamedPipesFPC от Дезлова )
Ну до собственно чтения графических данных из WMRViewer-а я пока не добрался ...
Как я понял передача идет четырьмя протоками и из них два текстовые ... так что пока задача прочитать хотя-бы их (ну и разобраться с передачей "абстрактной картинки" ).
Добавлено спустя 54 минуты 36 секунд:Вообще, использование "трубо каналов" это личный заскок хука WMRInterceptHost.dll и по идее можно обойтись без них ...
Но сам хук зараза мрачная ....

Копнул исходники и тут-же получил весьма мрачную головную боль