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

Вниз

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

Наверх




Память: 0.54 MB
Время: 0.008 c
2-1227985085
Надуев Алексей
2008-11-29 21:58
2009.01.11
Как можно осуществить в Delphi запуск программ


15-1226462765
Slider007
2008-11-12 07:06
2009.01.11
С днем рождения ! 12 ноября 2008 среда


2-1227776113
cvg
2008-11-27 11:55
2009.01.11
Как отключить загрузку ODBC-драйвера?


15-1226741443
timekiller
2008-11-15 12:30
2009.01.11
Мобильная Delphi


8-1185558850
Ронин
2007-07-27 21:54
2009.01.11
Звук





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский