Имя: Пароль:
IT
 
Delphi. Именованные каналы и доступ к памяти.
0 H A D G E H O G s
 
09.10.13
18:15
День добрый.
Нуавдруг кто сталкивался.

Работаю с именованным каналом.
Синхронный, блокирующий.
Сервер ждет данных от клиента в отдельном потоке.
Код:
    
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 также не помогает.

Почему работа с ReadFile Именно в потоке требует буфера в стэке, а не в динамичной памяти?
1 Rie
 
09.10.13
18:26
(0) Не понял. Почему в ReadFile параметром идёт buffer, а не buffer^?
2 H A D G E H O G s
 
09.10.13
18:29
Балин. Точно.
3 H A D G E H O G s
 
09.10.13
18:30
http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_readfile.htm

lpBuffer
[out] Указатель на буфер, который принимает прочитанные данные из файла.

Прочитал указатель - передал указатель.
4 Rie
 
09.10.13
18:32
(3) Это в C. В Delphi это - var-параметр, а не указатель.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший