-
Добрый вечер. Мой вопрос до слез прост: как нужно передавать в функцию ReadFile динамические массивы байтов?
Дело в том, что я, как и всякий уважающий себя сиплюсплюсник, с Дельфи на вы. Но вот возникла надобность подправить соответствующую программку, работающую по USB с некоторым устройством. При получении данных с этого устройства используется функция Windows API ReadFile, которая на C в данном случае работает прекрасно. Насколько я знаю, на Дельфи в место непосредственно api функции обертка, и кроме того, у Дельфи есть собственный менеджер памяти. Проблема в том, что при передаче массива примерно таким образом:
anArray := GetMemory(someBytes); ReadFile(handle, anArray, ...);
Данные не читаются, а GetLastError возвращает ERROR_NOACCESS (при этом, размер буфера достаточен для получаемых данных). Если передавать статический массив на стеке, функция работает. Может быть я что-то делаю не так?
-
> ReadFile(handle, anArray[0], ...);
-
Var a:Array of Byte;
SetLength(a,someBytes); ReadFile(handle,a[0],...
-
Германн © (10.11.08 21:17) [1] Palladin © (10.11.08 21:18) [2]
Спасибо, что-то такое я предполагал, завтра попробую.
-
> monogandhi (10.11.08 21:08)
> на Дельфи в место непосредственно api функции обертка
Неверно. Вызывается непосредственно api функция, без всякой обертки.
> у Дельфи есть собственный менеджер памяти.
Есть, но в данном случае это не играет никакой роли.
==============
При вызове функций API между Delphi и C нет никакой разницы. Отличия только в синтаксисе.
-
> monogandhi (10.11.08 21:08)
в сях используют FILE* и всякие потоки ввода/вывода, что тоже не API. При программировании файлов на API, код на Си, на Delphi, на Бейсике и т.д. практически идентичен.
-
> [4] Юрий Зотов © (12.11.08 15:04)
Вот нереально бесит, эти const и var в дельфевых функциях. Я минут 30 ломал себе мозг, почему у меня в файле данные бредовые... А потому что я по старой доброй привычке, в соответствии с документацие(MSDN) передаю в функцию указатель. В итоге этот указатель передается через const и записываются не данные, а указатель... Нахрена это сделали???
-
> @!!ex © (12.11.08 15:53) [6] > Нахрена это сделали???
для удобства и волшебности счастья. А без гемороя - жить скучно, значит счастья нет :)
-
> Нахрена это сделали???
я думаю, так сделали для функций, в которые по определению не передается nil (хотя, где-то я видел исключения). Для удобства, опять же
-
> @!!ex © (12.11.08 15:53) [6]
Так я и говорю - отличия только в синтаксисе. А синтаксис языка, на котором работаешь, неплохо было бы все же знать. :о)
-
та эта ладно... мне импортер TLB выдал ISAXContentHandler = interface(IUnknown)
['']
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 :)
-
> [9] Юрий Зотов © (12.11.08 16:07)
Вот если бы в дельфе нельзя было бы передать указатель в принципе. ТОгда да, отличие синтаксиса. А так - угадай, какой синтаксис использовали разрпаботчики.
-
> @!!ex (12.11.2008 15:53:06) [6]
А зачем ты пользуешься прототипами от другого языка и при этом обижаешься? Ты смотри прототипы из Дельфи, если точно не помнишь его наизусть.
-
> [12] Anatoly Podgoretsky © (12.11.08 16:36)
Я вобще то так и делаю. Просто в данном случае протупил. Не вижу причин, по которым надо менять указатель на var или const в случае опеределния внешних функций. В конце концов у этих функций есть документация, и если есть возможность следовать ей, то стоит следовать, чтобы не было множественного толкования. Как ни крути, но вместо указателя передать переменную не получится. А вот var и const кушают и указатели и переменные.
-
> @!!ex (12.11.2008 16:44:13) [13]
Надо, если внешняя функция изменяет значения. Иначе надо делать указатель на указатель.
-
> @!!ex © (12.11.08 15:53) [6]
а я вот наоборот бесконечно рад от элегантных const, var и out, которые есть в Delphi и нет в С++, например. В сях есть ссылка, но большинство сипипистов до сих пор предпочитают ей указатель. Меня бесит код, в котором юзается указатель там, где логично использовать ссылку (var, ...). Указатель на указатель - отдельный разговор.
-
> [14] Anatoly Podgoretsky © (12.11.08 16:59)
DirectX часто использует указатели на указатели. Работаю одновременно и в С++ и в дельфи. Постоянно путаюсь, где надо указатель передать, а где указатель на указатель...
-
> [15] DevilDevil (12.11.08 17:07)
я не против const,var,out. Только за. Сам их много использую. удобно. Но в случае объясвления внешних функций считаю нелогичным смену синтаксиса. ИМХО стандартность важнее удобства. Тем более, что часто API подразумевает иногда передачу nil... и что мы тогда имеем? Либо часть функций с var, часть с POinter. Либо(что еще хуже, но всеже имеет место быть) - все с var, а там где надо передать nil - воротим извращения. ИМХО куда логичнее и правильнее везде во внешних функциях делать указатели. Тогда и полное соответствие документации, и однообразие кода, и передача параметров одинаковая во всех языках.
-
Работаю одновременно и в С++ и в дельфи. Постоянно путаюсь, где надо указатель передать, а где указатель на указатель...
А я, когда по-русски разговариваю, тоже иногда казахские слова использую. Постоянно путаюсь в этих русских словах. Долбаный русский язык...
-
> Ping-Pong (12.11.08 17:24) [18] > А я, когда по-русски разговариваю, тоже иногда казахские слова использую. Постоянно путаюсь в этих русских словах. > Долбаный русский язык...
+1
Я вот не "Работаю одновременно и в С++ и в дельфи", по крайней мере с API. И меня абсолютно устраивает дельфийский подход к этому делу. А родной (камень в сторону двойных указателей DX-а) - раздражает.
-
> А я, когда по-русски разговариваю, тоже иногда казахские > слова использую. Постоянно путаюсь в этих русских словах. > Долбаный русский язык...
Я не говорил, что дельфи долбанное. Я говорил об идиотском подходе к определению внешних функций. Подробнее можете прочитать в [17]. Если есть что противопоставить - пожалуйста, я всегда рад конструктивному спору.
-
> @!!ex © (12.11.08 17:22) [17]
> Тем более, что часто API подразумевает иногда передачу nil. > .. и что мы тогда имеем? Либо часть функций с var, часть > с POinter. Либо(что еще хуже, но всеже имеет место быть) > - все с var, а там где надо передать nil - воротим извращения.
Наука изощряет ум; ученье вострит память [К.Прутков]
- Меня тошнит. - Это - нормально.
-- Regards, LVT.
-
> [18] Ping-Pong (12.11.08 17:24)
Кстати, я бы тоже вставлял казахские слова, если бы у меня был словарь только с казахскими словами, без русских. Документация с дельфи идет с примерами на С. И там не обозначено где const, где var, а где указатель.
-
> @!!ex © (12.11.08 19:18) [22]
> Документация с дельфи идет с примерами на С. И там не обозначено > где const, где var, а где указатель.
Find declaration спасет ОРД!
-- Regards, LVT.
-
> [23] Leonid Troyanovsky © (12.11.08 19:22)
не всегда с API идет pas файл. а в dcu FindDeclaration не работает. К тому же лазить по каждой фукнции из API(их используется в проекте порядка двух сотни из трех разных систем(WinAPI, OpenGL, OpenAL)) это не лучшая идея, тем более что есть хелп, почему я не могу верить хелпу?
-
> @!!ex © (12.11.08 19:28) [24]
> хелп, почему я не могу верить хелпу?
Верить хелпу в его сегодняшнем изложении - чрезмерный оптимизм. Там даже не обозначен год релиза мсдн, легший в его основу.
msdn.microsoft.com forever!
-- Regards, LVT.
-
> @!!ex © (12.11.08 19:28) [24]
> не всегда с API идет pas файл. а в dcu FindDeclaration не > работает.
А ты не пользуй такие dcu. И твои волосы станут шелковистыми.
-- Regards, LVT.
-
> [26] Leonid Troyanovsky © (12.11.08 19:38)
Да не станут все равно. Проблемы(с которыми столкнулся на практике): -Не соответствие параметров хелпу, всегда основываешься на мануалах, статьях, хелпу и прочих материалах от разработчиков. Соответственно сделаешь, а потом удивляешь, че оно не работает... Не работает, из-за того, что тот, кто переделывал хедеры решил поумничать. именно поэтому у меня OGL хаголовочные файлы собственного изготовления. Так надежнее и работает как мне надо. -Не соответствие параметров в дельфи и С++. Приходится вести несколько проектов, на разных языках. Очень напрягает, что в одном языке одна структура, в другом - другая. И кстати, ошибки допускаю только в дельфи, в С++ - никогда, хотя опыт работы в дельфи в разы больше. -Каверзы в духе - передай в качества var/const параметра nil. -Код не понятен человеку, работающему на других языках. Были ситуации, когда приходилось сдавать проекты человеку, который в дельфи не разбирается... Не думал, что возникнут пробелмы, потому что VCL Не использовал, все на API. проблемы возникли, т.к. заказчик удивлялся каждому несоответствию вызова функции тому, что про функцию написано в документации. Целый список составил, мне потом пришлось объяснять что такое const и var.
-
> @!!ex © (12.11.08 19:49) [27]
> решил поумничать. именно поэтому у меня OGL хаголовочные > файлы собственного изготовления. Так надежнее и работает > как мне надо.
Логичный вывод.
> человеку, который в дельфи не разбирается... Не думал, что > возникнут пробелмы, потому что VCL Не использовал, все на > API. проблемы возникли, т.к. заказчик удивлялся каждому > несоответствию вызова функции тому, что про функцию написано > в документации. Целый список составил, мне потом пришлось > объяснять что такое const и var.
Современному ЯВУ считается стыдным пользоваться указателями. Мол, так будет проще для чайников, которые оные понятия не в силах постичь, и, сл-но, они будут осуществлять меньше разрушительных деяний.
Возможно, что это именно так.
Тебе просто не повезло - дельфи, как и си, остаются в плену разрушительных парадигм, а ты будешь между молотом и наковальней. Бо, основной грех указателя - в интерпретации указуемого, и никакие строгости приведения здесь не спасут.
Поэтому, см. выше.
-- Regards, LVT.
-
> @!!ex (12.11.2008 19:49:27) [27]
А как ты прикажешь быть, когда многие функции в АПИ являются по несколькими разными функциями.
В одних случаях результат интерпритируется как BOOL В других случаях результат интерпритируется как Integer В других случаях результат интерпритируется как Cardinal
И это про одну и туже функцию. Причина Си почти не типизированый язык, качество разработчиков сильно различается, очень много таких вот хитрунов.
|