Форум: "Начинающим";
Текущий архив: 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