Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.03.20;
Скачать: CL | DM;

Вниз

Подскажите как прочитать из переменой   Найти похожие ветки 

 
dreamse   (2010-12-23 21:48) [0]

Добрый вечер.

Есть функция которая получает данные в переменную

inBuf: array[0..IN_BUF_SIZE] of WideChar;

где IN_BUF_SIZE = 1000

Необходимо преобразовать inBuf в string и вывести результат полученных текстовых данных. Подскажите как это релизовать.


 
Anatoly Podgoretsky ©   (2010-12-23 21:50) [1]

> dreamse  (23.12.2010 21:48:00)  [0]

А что должно получиться? И не поможет ли тут цикл?


 
dreamse   (2010-12-23 22:01) [2]

Пытаюсь переделать код из статьи Игоря Шевченко для работы с Pipes.
http://www.delphimaster.ru/articles/named_pipes/index.html

Код клиентского потока асинхронного чтения данных из канала:


procedure ReadPipe (hPipe: PHANDLE); stdcall;
var
 inBuf: array[0..IN_BUF_SIZE] of WideChar;
 bytesRead: DWORD;
 rc: Boolean;
 lastError: DWORD;
 hEventRd: THANDLE;
 OverLapRd: OVERLAPPED;
 bytesTrans: DWORD;
begin
 inBuf[0] := #0;
 hEventRd := CreateEventW (nil, true, false, nil);
 FillChar (OverLapRd, sizeof(OVERLAPPED), 0);
 OverLapRd.hEvent := hEventRd;
 // Бесконечный цикл чтения из канала, до тех пор,пока не разорвется соединение
 // Чтение происходит асинхронно, с ожиданием по событию. После того, как сооб-
 // щение прочитано, оно помещается в элемент редактирования.
 while true do begin
   rc := ReadFile (hPipe^, inBuf, IN_BUF_SIZE*sizeof(WideChar), bytesRead,
     @OverLapRd);
   if not rc then begin
     lastError := GetLastError;
     // Проверка на три вида ошибки:
     // IO_PENDING (ожидать завершения операции), BROKEN_PIPE (выйти из цикла)
     // и остальные (выдать сообщение, выйти из цикла и умереть)
     if lastError = ERROR_IO_PENDING then begin
       WaitForSingleObject (hEventRd, INFINITE);
     end else begin
       if lastError = ERROR_BROKEN_PIPE then
         MessageBoxW (hWndClient,
           "The connection to this client has been broken.", "", MB_OK)
       else
         ShowLastErrorMessage(hWndClient,
           PAnsiChar("Client: Debug():ReadFile"));
       Break;
     end;
   end;
   GetOverlappedResult (hPipe^, OverLapRd, bytesTrans, false);
   inBuf[bytesTrans div SizeOf(WideChar)] := #0; // Завершить полученную строку
   SendMessageW (GetDlgItem (hWndClient, IDD_EDITREAD), EM_REPLACESEL,
     0, LPARAM(@inBuf));
   // Перевести курсор на следующую строку в элементе редактирования :)
   SendMessageW (GetDlgItem (hWndClient, IDD_EDITREAD), EM_REPLACESEL,
     0, LPARAM(PWideChar(CrLf)));
 end;
 // Если соединение с каналом разорвано, завершить программу
 PostMessageW (hWndClient, WM_GO_AWAY, 0,0);
 ExitThread(0);
end;


Код выводит результат который получил в динамически созданую форму ( в компонент Memo помоему на этой форме )

Этот вариант не устраивает так как нужно сделать вывод полученных данных в свою функцию и там уже ее обработку.

Код подключения и отправки переработал без использования окон а вот код принятия данных не могу.


 
dreamse   (2010-12-23 22:12) [3]

Точно, циклом тут все отлично читается


var
 s:string;
 i:integer;
begin
....
s:="";
for i := 0 to IN_BUF_SIZE -1 do
  s:= s+ inBuf[i];

 MessageBox(0,PChar(s),"",0);


> Anatoly Podgoretsky

Спасибо :)


 
Игорь Шевченко ©   (2010-12-23 23:13) [4]


> Этот вариант не устраивает так как нужно сделать вывод полученных
> данных в свою функцию и там уже ее обработку.



>   inBuf[bytesTrans div SizeOf(WideChar)] := #0; // Завершить
> полученную строку


без циклов после этого вызвать

WideCharToString(@inbuf)

Кроме того, никто не мешает передавать не unicode-строки, а ansi, соответственно, убрав буковки W из имен функций.



Страницы: 1 вся ветка

Текущий архив: 2011.03.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
2-1293359993
radiokarazinec
2010-12-26 13:39
2011.03.20
Поиск максимальных трех элементов в массиве


1-1249200301
Ruzzz
2009-08-02 12:05
2011.03.20
Создание полупрозрачного компонента


15-1289326102
DiamondShark
2010-11-09 21:08
2011.03.20
Высокий/низкий уровень, ручное/автоматическое управление


3-1255340705
Yurikon
2009-10-12 13:45
2011.03.20
Ошибка с драйвером Access


15-1291671003
Юрий
2010-12-07 00:30
2011.03.20
С днем рождения ! 7 декабря 2010 вторник