Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.03.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
11-1227810366
Jon
2008-11-27 21:26
2011.03.20
Activemovie


2-1293130116
dreamse
2010-12-23 21:48
2011.03.20
Подскажите как прочитать из переменой


2-1291712288
NickName
2010-12-07 11:58
2011.03.20
Слияние массивов


1-1249657830
ягость
2009-08-07 19:10
2011.03.20
Удалить строки из RichEdit


4-1244378006
Nikfel
2009-06-07 16:33
2011.03.20
Как файл иконки new.ico поместить в EXE или Dll файл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский