Главная страница
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.008 c
6-1235727155
d@vinchi
2009-02-27 12:32
2011.03.20
TTcpServer: Ответ на запрос - что не так?


1-1248801245
Sergey
2009-07-28 21:14
2011.03.20
Ищу функцию, чтобы рисовать на картинке формулы с дробью


1-1248958891
igordth
2009-07-30 17:01
2011.03.20
Record - сравнивание записей


2-1293354617
radiokarazinec
2010-12-26 12:10
2011.03.20
поиск максимальных элементов в массиве


3-1254149519
Diplomat
2009-09-28 18:51
2011.03.20
Использование доменов в IB FB