Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.10.2013, 17:48
Hadgehogs Hadgehogs вне форума
Прохожий
 
Регистрация: 02.09.2013
Сообщения: 7
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию ReadFile в потоке

День добрый.
Работаю с именованным каналом.
Синхронный, блокирующий.
Сервер ждет данных от клиента в отдельном потоке.
Код:
  hNewHeap:=HeapCreate(HEAP_NO_SERIALIZE,SizeOfWaitingData,0);
  Buffer:=HeapAlloc(hNewHeap,0,SizeOfWaitingData);
  repeat
    SuccessRead:=ReadFile(hPipe, buffer, SizeOfWaitingData, bytesRead, nil);
    if not SuccessRead then begin
    ShowMessage(_GetErrorMsg( GetLastError ));
    break;
    end;

  Until false;

По результату - всегда SuccessRead=false, с ошибкой "Неверная попытка доступа к адресу памяти".
Замена на
Код:
HeapAlloc(GetProcessHeap,0,SizeOfWaitingData);
не помогает.

Помогает выделение буфера в стэке, вида:
Код:
var bufferar:array[0..2000] of byte;

но мне это не надо.

Также нормально работает в основном потоке программы, но это мне тоже не надо.

VurtualAlloc не пробовал пока.
Ответить с цитированием
  #2  
Старый 10.10.2013, 18:34
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

SuccessRead:=ReadFile(hPipe, buffer^, SizeOfWaitingData, bytesRead, nil);
Второй параметр ReadFile - var Buffer; - безтиповая переменная.
В случае, когда buffer - статический массив, то так передавать можно,
var buffer:array[0..2000] of byte;
адрес статического массива совпадает с адресом его первого элемента.
В случае динамического массива, или когда
var buffer:Pointer;
адрес памяти и адрес самой переменной buffer - это две большие разницы.
Поэтому нужно указывать не buffer, а разыменовать - buffer^
Вот.
Ответить с цитированием
  #3  
Старый 10.10.2013, 20:12
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

На самом деле в обоих случаях достаточно передавать Buffer[0].
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #4  
Старый 11.10.2013, 08:43
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Восклицание

подытожим:

Buffer: array [0..$ff] of Char

Код:
var
  hFile: THandle;
  Buffer: array [0..$ff] of Char;
  Dummy: DWORD;
begin
  hFile:=CreateFile('Unit1.pas', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
  ReadFile(hFile,
    Buffer[0],
    $100,
    Dummy, nil); 
  ShowMessage(Copy(Buffer, 1, Dummy));
  CloseHandle(hFile);
end;

Buffer: array of Char

Код:
var
  hFile: THandle;
  Buffer: array of Char;
  Dummy: DWORD;
begin
  SetLength(Buffer, $100);
  hFile:=CreateFile('Unit1.pas', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
  ReadFile(hFile,
    Buffer[0],
    $100,
    Dummy, nil); 
  ShowMessage(Copy(String(@Buffer[0]), 1, Dummy));
  CloseHandle(hFile);
end;

Buffer: Pointer

Код:
var
  hFile: THandle;
  Buffer: Pointer; 
  Dummy: DWORD;
begin
  Buffer:=GetMemory($100);
  hFile:=CreateFile('Unit1.pas', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
  ReadFile(hFile,
    Buffer^,
    $100,
    Dummy, nil); 
  ShowMessage(Copy(PChar(Buffer), 1, Dummy));
  CloseHandle(hFile);
  FreeMemory(Buffer);
end;

Buffer: String

Код:
var
  hFile: THandle;
  Buffer: String;
  Dummy: DWORD;
begin
  SetLength(Buffer, $100);
  hFile:=CreateFile('Unit1.pas', GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
  ReadFile(hFile,
    PChar(@Buffer[1])^,
    $100,
    Dummy, nil);
  ShowMessage(Copy(Buffer, 1, Dummy));
  CloseHandle(hFile);
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:52.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter