Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подскажите как прочитать из переменой [D7]


dreamse ©   (2010-12-23 21:48:00) 

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

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

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

где IN_BUF_SIZE = 1000

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


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


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



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


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

WideCharToString(@inbuf)

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


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

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


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

Спасибо :)


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

Пытаюсь переделать код из статьи Игоря Шевченко для работы с 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 помоему на этой форме )

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

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


Anatoly Podgoretsky   (2010-12-23 21:50:00) [4]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо