Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.11;
Скачать: CL | DM;

Вниз

Массивы и ReadFile   Найти похожие ветки 

 
monogandhi   (2008-11-10 21:08) [0]

Добрый вечер. Мой вопрос до слез прост: как нужно передавать в функцию ReadFile динамические массивы байтов?

Дело в том, что я, как и всякий уважающий себя сиплюсплюсник, с Дельфи на вы. Но вот возникла надобность подправить соответствующую программку, работающую по USB с некоторым устройством.
При получении данных с этого устройства используется функция Windows API ReadFile, которая на C в данном случае работает прекрасно. Насколько я знаю, на Дельфи в место непосредственно api функции обертка, и кроме того, у Дельфи есть собственный менеджер памяти.
Проблема в том, что при передаче массива примерно таким образом:

anArray := GetMemory(someBytes);
ReadFile(handle, anArray, ...);

Данные не читаются, а GetLastError возвращает ERROR_NOACCESS (при этом, размер буфера достаточен для получаемых данных).
Если передавать статический массив на стеке, функция работает.
Может быть я что-то делаю не так?


 
Германн ©   (2008-11-10 21:17) [1]


> ReadFile(handle, anArray[0], ...);


 
Palladin ©   (2008-11-10 21:18) [2]

Var
a:Array of Byte;

SetLength(a,someBytes);
ReadFile(handle,a[0],...


 
monogandhi   (2008-11-10 21:19) [3]

Германн ©   (10.11.08 21:17) [1]
Palladin ©   (10.11.08 21:18) [2]

Спасибо, что-то такое я предполагал, завтра попробую.


 
Юрий Зотов ©   (2008-11-12 15:04) [4]

> monogandhi   (10.11.08 21:08)  

> на Дельфи в место непосредственно api функции обертка

Неверно. Вызывается непосредственно api функция, без всякой обертки.

> у Дельфи есть собственный менеджер памяти.

Есть, но в данном случае это не играет никакой роли.

==============

При вызове функций API между Delphi и C нет никакой разницы. Отличия только в синтаксисе.


 
DevilDevil   (2008-11-12 15:10) [5]

> monogandhi   (10.11.08 21:08)

в сях используют FILE* и всякие потоки ввода/вывода, что тоже не API.
При программировании файлов на API, код на Си, на Delphi, на Бейсике и т.д. практически идентичен.


 
@!!ex ©   (2008-11-12 15:53) [6]

> [4] Юрий Зотов ©   (12.11.08 15:04)

Вот нереально бесит, эти const и var в дельфевых функциях.
Я минут 30 ломал себе мозг, почему у меня в файле данные бредовые...
А потому что я по старой доброй привычке, в соответствии с документацие(MSDN) передаю в функцию указатель. В итоге этот указатель передается через const и записываются не данные, а указатель...
Нахрена это сделали???


 
KSergey ©   (2008-11-12 15:56) [7]

> @!!ex ©   (12.11.08 15:53) [6]
> Нахрена это сделали???

для удобства и волшебности счастья.
А без гемороя - жить скучно, значит счастья нет :)


 
clickmaker ©   (2008-11-12 16:02) [8]

> Нахрена это сделали???

я думаю, так сделали для функций, в которые по определению не передается nil (хотя, где-то я видел исключения). Для удобства, опять же


 
Юрий Зотов ©   (2008-11-12 16:07) [9]

> @!!ex ©   (12.11.08 15:53) [6]

Так я и говорю - отличия только в синтаксисе. А синтаксис языка, на котором работаешь, неплохо было бы все же знать.
:о)


 
Palladin ©   (2008-11-12 16:10) [10]

та эта ладно... мне импортер TLB выдал

 ISAXContentHandler = interface(IUnknown)
   ["{1545CDFA-9E4E-4497-A8A4-2BF7D0112C44}"]
   function putDocumentLocator(const pLocator: ISAXLocator): HResult; stdcall;
   function startDocument: HResult; stdcall;
   function endDocument: HResult; stdcall;
   function startPrefixMapping(var pwchPrefix: Word; cchPrefix: SYSINT; var pwchUri: Word;
                               cchUri: SYSINT): HResult; stdcall;
   function endPrefixMapping(var pwchPrefix: Word; cchPrefix: SYSINT): HResult; stdcall;
   function startElement(var pwchNamespaceUri: Word; cchNamespaceUri: SYSINT;
                         var pwchLocalName: Word; cchLocalName: SYSINT; var pwchQName: Word;
                         cchQName: SYSINT; const pAttributes: ISAXAttributes): HResult; stdcall;
   function endElement(var pwchNamespaceUri: Word; cchNamespaceUri: SYSINT;
                       var pwchLocalName: Word; cchLocalName: SYSINT; var pwchQName: Word;
                       cchQName: SYSINT): HResult; stdcall;
   function characters(var pwchChars: Word; cchChars: SYSINT): HResult; stdcall;
   function ignorableWhitespace(var pwchChars: Word; cchChars: SYSINT): HResult; stdcall;
   function processingInstruction(var pwchTarget: Word; cchTarget: SYSINT; var pwchData: Word;
                                  cchData: SYSINT): HResult; stdcall;
   function skippedEntity(var pwchName: Word; cchName: SYSINT): HResult; stdcall;
 end;


минут пять пытался понять, что это за лажа - var pwchChars:Word
потом понял, что придется обрабатывать напильником на pwchChars:PWideChar

:)


 
@!!ex ©   (2008-11-12 16:17) [11]

> [9] Юрий Зотов ©   (12.11.08 16:07)

Вот если бы в дельфе нельзя было бы передать указатель в принципе. ТОгда да, отличие синтаксиса.
А так - угадай, какой синтаксис использовали разрпаботчики.


 
Anatoly Podgoretsky ©   (2008-11-12 16:36) [12]

> @!!ex  (12.11.2008 15:53:06)  [6]

А зачем ты пользуешься прототипами от другого языка и при этом обижаешься?
Ты смотри прототипы из Дельфи, если точно не помнишь его наизусть.


 
@!!ex ©   (2008-11-12 16:44) [13]

> [12] Anatoly Podgoretsky ©   (12.11.08 16:36)

Я вобще то так и делаю. Просто в данном случае протупил.
Не вижу причин, по которым надо менять указатель на var или const в случае опеределния внешних функций.
В конце концов у этих функций есть документация, и если есть возможность следовать ей, то стоит следовать, чтобы не было множественного толкования.
Как ни крути, но вместо указателя передать переменную не получится. А вот var и const кушают и указатели и переменные.


 
Anatoly Podgoretsky ©   (2008-11-12 16:59) [14]

> @!!ex  (12.11.2008 16:44:13)  [13]

Надо, если внешняя функция изменяет значения. Иначе надо делать указатель на указатель.


 
DevilDevil   (2008-11-12 17:07) [15]

> @!!ex ©   (12.11.08 15:53) [6]

а я вот наоборот бесконечно рад от элегантных const, var и out, которые есть в Delphi и нет в С++, например. В сях есть ссылка, но большинство сипипистов до сих пор предпочитают ей указатель. Меня бесит код, в котором юзается указатель там, где логично использовать ссылку (var, ...). Указатель на указатель - отдельный разговор.


 
@!!ex ©   (2008-11-12 17:08) [16]

> [14] Anatoly Podgoretsky ©   (12.11.08 16:59)

DirectX часто использует указатели на указатели.
Работаю одновременно и в С++ и в дельфи.
Постоянно путаюсь, где надо указатель передать, а где указатель на указатель...


 
@!!ex ©   (2008-11-12 17:22) [17]

> [15] DevilDevil   (12.11.08 17:07)

я не против const,var,out. Только за. Сам их много использую. удобно.
Но в случае объясвления внешних функций считаю нелогичным смену синтаксиса.
ИМХО стандартность важнее удобства.
Тем более, что часто API подразумевает иногда передачу nil... и что мы тогда имеем? Либо часть функций с var, часть с POinter. Либо(что еще хуже, но всеже имеет место быть) - все с var, а там где надо передать nil - воротим извращения.
ИМХО куда логичнее и правильнее везде во внешних функциях делать указатели. Тогда и полное соответствие документации, и однообразие кода, и передача параметров одинаковая во всех языках.


 
Ping-Pong   (2008-11-12 17:24) [18]

Работаю одновременно и в С++ и в дельфи.
Постоянно путаюсь, где надо указатель передать, а где указатель на указатель...


А я, когда по-русски разговариваю, тоже иногда казахские слова использую. Постоянно путаюсь в этих русских словах. Долбаный русский язык...


 
DevilDevil   (2008-11-12 17:33) [19]

> Ping-Pong   (12.11.08 17:24) [18]
> А я, когда по-русски разговариваю, тоже иногда казахские слова использую. Постоянно путаюсь в этих русских словах.
>  Долбаный русский язык...

+1

Я вот не "Работаю одновременно и в С++ и в дельфи", по крайней мере с API. И меня абсолютно устраивает дельфийский подход к этому делу. А родной (камень в сторону двойных указателей DX-а) - раздражает.


 
@!!ex ©   (2008-11-12 19:07) [20]

> А я, когда по-русски разговариваю, тоже иногда казахские
> слова использую. Постоянно путаюсь в этих русских словах.
> Долбаный русский язык...

Я не говорил, что дельфи долбанное. Я говорил об идиотском подходе к определению внешних функций. Подробнее можете прочитать в [17]. Если есть что противопоставить - пожалуйста, я всегда рад конструктивному спору.


 
Leonid Troyanovsky ©   (2008-11-12 19:16) [21]


> @!!ex ©   (12.11.08 17:22) [17]

> Тем более, что часто API подразумевает иногда передачу nil.
> .. и что мы тогда имеем? Либо часть функций с var, часть
> с POinter. Либо(что еще хуже, но всеже имеет место быть)
> - все с var, а там где надо передать nil - воротим извращения.

Наука изощряет ум; ученье вострит память [К.Прутков]

- Меня тошнит.
- Это - нормально.

--
Regards, LVT.


 
@!!ex ©   (2008-11-12 19:18) [22]

> [18] Ping-Pong   (12.11.08 17:24)

Кстати, я бы тоже вставлял казахские слова, если бы у меня был словарь только с казахскими словами, без русских.
Документация с дельфи идет с примерами на С. И там не обозначено где const, где var, а где указатель.


 
Leonid Troyanovsky ©   (2008-11-12 19:22) [23]


> @!!ex ©   (12.11.08 19:18) [22]

> Документация с дельфи идет с примерами на С. И там не обозначено
> где const, где var, а где указатель.

Find declaration спасет ОРД!

--
Regards, LVT.


 
@!!ex ©   (2008-11-12 19:28) [24]

> [23] Leonid Troyanovsky ©   (12.11.08 19:22)

не всегда с API идет pas файл. а в dcu FindDeclaration не работает.
К тому же лазить по каждой фукнции из API(их используется в проекте порядка двух сотни из трех разных систем(WinAPI, OpenGL, OpenAL)) это не лучшая идея, тем более что есть хелп, почему я не могу верить хелпу?


 
Leonid Troyanovsky ©   (2008-11-12 19:34) [25]


> @!!ex ©   (12.11.08 19:28) [24]

> хелп, почему я не могу верить хелпу?

Верить хелпу в его сегодняшнем изложении - чрезмерный оптимизм.
Там даже не обозначен год релиза мсдн, легший в его основу.

msdn.microsoft.com forever!

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2008-11-12 19:38) [26]


> @!!ex ©   (12.11.08 19:28) [24]

> не всегда с API идет pas файл. а в dcu FindDeclaration не
> работает.

А ты не пользуй такие dcu.
И твои волосы станут шелковистыми.

--
Regards, LVT.


 
@!!ex ©   (2008-11-12 19:49) [27]

> [26] Leonid Troyanovsky ©   (12.11.08 19:38)

Да не станут все равно.
Проблемы(с которыми столкнулся на практике):
-Не соответствие параметров хелпу, всегда основываешься на мануалах, статьях, хелпу и прочих материалах от разработчиков. Соответственно сделаешь, а потом удивляешь, че оно не работает... Не работает, из-за того, что тот, кто переделывал хедеры решил поумничать. именно поэтому у меня OGL хаголовочные файлы собственного изготовления. Так надежнее и работает как мне надо.
-Не соответствие параметров в дельфи и С++. Приходится вести несколько проектов, на разных языках. Очень напрягает, что в одном языке одна структура, в другом - другая. И кстати, ошибки допускаю только в дельфи, в С++ - никогда, хотя опыт работы в дельфи в разы больше.
-Каверзы в духе - передай в качества var/const параметра nil.
-Код не понятен человеку, работающему на других языках. Были ситуации, когда приходилось сдавать проекты человеку, который в дельфи не разбирается... Не думал, что возникнут пробелмы, потому что VCL Не использовал, все на API. проблемы возникли, т.к. заказчик удивлялся каждому несоответствию вызова функции тому, что про функцию написано в документации. Целый список составил, мне потом пришлось объяснять что такое const и var.


 
Leonid Troyanovsky ©   (2008-11-12 20:06) [28]


> @!!ex ©   (12.11.08 19:49) [27]

> решил поумничать. именно поэтому у меня OGL хаголовочные
> файлы собственного изготовления. Так надежнее и работает
> как мне надо.

Логичный вывод.

> человеку, который в дельфи не разбирается... Не думал, что
> возникнут пробелмы, потому что VCL Не использовал, все на
> API. проблемы возникли, т.к. заказчик удивлялся каждому
> несоответствию вызова функции тому, что про функцию написано
> в документации. Целый список составил, мне потом пришлось
> объяснять что такое const и var.

Современному ЯВУ считается стыдным пользоваться указателями.
Мол, так будет проще для чайников, которые оные понятия не в
силах постичь, и, сл-но, они будут осуществлять меньше
разрушительных деяний.

Возможно, что это именно так.

Тебе просто не повезло - дельфи, как и си, остаются в плену
разрушительных парадигм, а ты будешь между молотом и наковальней.
Бо, основной грех указателя - в интерпретации указуемого,
и никакие строгости приведения здесь не спасут.

Поэтому, см. выше.

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2008-11-12 20:44) [29]

> @!!ex  (12.11.2008 19:49:27)  [27]

А как ты прикажешь быть, когда многие функции в АПИ являются по несколькими разными функциями.

В одних случаях результат интерпритируется как BOOL
В других случаях результат интерпритируется как Integer
В других случаях результат интерпритируется как Cardinal

И это про одну и туже функцию. Причина Си почти не типизированый язык, качество разработчиков сильно различается, очень много таких вот хитрунов.



Страницы: 1 вся ветка

Текущий архив: 2009.01.11;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.019 c
2-1227990525
demon
2008-11-29 23:28
2009.01.11
RGB


2-1227864512
Golden
2008-11-28 12:28
2009.01.11
Позиция в таблице


4-1203943522
Gool
2008-02-25 15:45
2009.01.11
WIN API


2-1227701460
2B
2008-11-26 15:11
2009.01.11
Переделать код


15-1226908281
AIK
2008-11-17 10:51
2009.01.11
Чё то непонятно с округлением round