Конференция "Прочее" » Массивы и ReadFile
 
  • monogandhi (10.11.08 21:08) [0]
    Добрый вечер. Мой вопрос до слез прост: как нужно передавать в функцию ReadFile динамические массивы байтов?

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

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

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

    > ReadFile(handle, anArray[0], ...);
  • Palladin © (10.11.08 21:18) [2]
    Var
    a:Array of Byte;

    SetLength(a,someBytes);
    ReadFile(handle,a[0],...
  • monogandhi (10.11.08 21:19) [3]
    Германн ©   (10.11.08 21:17) [1]
    Palladin ©   (10.11.08 21:18) [2]

    Спасибо, что-то такое я предполагал, завтра попробую.
  • Юрий Зотов © (12.11.08 15:04) [4]
    > monogandhi   (10.11.08 21:08)  

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

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

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

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

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

    При вызове функций API между Delphi и C нет никакой разницы. Отличия только в синтаксисе.
  • DevilDevil (12.11.08 15:10) [5]
    > monogandhi   (10.11.08 21:08)

    в сях используют FILE* и всякие потоки ввода/вывода, что тоже не API.
    При программировании файлов на API, код на Си, на Delphi, на Бейсике и т.д. практически идентичен.
  • @!!ex © (12.11.08 15:53) [6]
    > [4] Юрий Зотов ©   (12.11.08 15:04)

    Вот нереально бесит, эти const и var в дельфевых функциях.
    Я минут 30 ломал себе мозг, почему у меня в файле данные бредовые...
    А потому что я по старой доброй привычке, в соответствии с документацие(MSDN) передаю в функцию указатель. В итоге этот указатель передается через const и записываются не данные, а указатель...
    Нахрена это сделали???
  • KSergey © (12.11.08 15:56) [7]
    > @!!ex ©   (12.11.08 15:53) [6]
    > Нахрена это сделали???

    для удобства и волшебности счастья.
    А без гемороя - жить скучно, значит счастья нет :)
  • clickmaker © (12.11.08 16:02) [8]
    > Нахрена это сделали???

    я думаю, так сделали для функций, в которые по определению не передается nil (хотя, где-то я видел исключения). Для удобства, опять же
  • Юрий Зотов © (12.11.08 16:07) [9]
    > @!!ex ©   (12.11.08 15:53) [6]

    Так я и говорю - отличия только в синтаксисе. А синтаксис языка, на котором работаешь, неплохо было бы все же знать.
    :о)
  • Palladin © (12.11.08 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 © (12.11.08 16:17) [11]
    > [9] Юрий Зотов ©   (12.11.08 16:07)

    Вот если бы в дельфе нельзя было бы передать указатель в принципе. ТОгда да, отличие синтаксиса.
    А так - угадай, какой синтаксис использовали разрпаботчики.
  • Anatoly Podgoretsky © (12.11.08 16:36) [12]
    > @!!ex  (12.11.2008 15:53:06)  [6]

    А зачем ты пользуешься прототипами от другого языка и при этом обижаешься?
    Ты смотри прототипы из Дельфи, если точно не помнишь его наизусть.
  • @!!ex © (12.11.08 16:44) [13]
    > [12] Anatoly Podgoretsky ©   (12.11.08 16:36)

    Я вобще то так и делаю. Просто в данном случае протупил.
    Не вижу причин, по которым надо менять указатель на var или const в случае опеределния внешних функций.
    В конце концов у этих функций есть документация, и если есть возможность следовать ей, то стоит следовать, чтобы не было множественного толкования.
    Как ни крути, но вместо указателя передать переменную не получится. А вот var и const кушают и указатели и переменные.
  • Anatoly Podgoretsky © (12.11.08 16:59) [14]
    > @!!ex  (12.11.2008 16:44:13)  [13]

    Надо, если внешняя функция изменяет значения. Иначе надо делать указатель на указатель.
  • DevilDevil (12.11.08 17:07) [15]
    > @!!ex ©   (12.11.08 15:53) [6]

    а я вот наоборот бесконечно рад от элегантных const, var и out, которые есть в Delphi и нет в С++, например. В сях есть ссылка, но большинство сипипистов до сих пор предпочитают ей указатель. Меня бесит код, в котором юзается указатель там, где логично использовать ссылку (var, ...). Указатель на указатель - отдельный разговор.
  • @!!ex © (12.11.08 17:08) [16]
    > [14] Anatoly Podgoretsky ©   (12.11.08 16:59)

    DirectX часто использует указатели на указатели.
    Работаю одновременно и в С++ и в дельфи.
    Постоянно путаюсь, где надо указатель передать, а где указатель на указатель...
  • @!!ex © (12.11.08 17:22) [17]
    > [15] DevilDevil   (12.11.08 17:07)

    я не против const,var,out. Только за. Сам их много использую. удобно.
    Но в случае объясвления внешних функций считаю нелогичным смену синтаксиса.
    ИМХО стандартность важнее удобства.
    Тем более, что часто API подразумевает иногда передачу nil... и что мы тогда имеем? Либо часть функций с var, часть с POinter. Либо(что еще хуже, но всеже имеет место быть) - все с var, а там где надо передать nil - воротим извращения.
    ИМХО куда логичнее и правильнее везде во внешних функциях делать указатели. Тогда и полное соответствие документации, и однообразие кода, и передача параметров одинаковая во всех языках.
  • Ping-Pong (12.11.08 17:24) [18]
    Работаю одновременно и в С++ и в дельфи.
    Постоянно путаюсь, где надо указатель передать, а где указатель на указатель...


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

    +1

    Я вот не "Работаю одновременно и в С++ и в дельфи", по крайней мере с API. И меня абсолютно устраивает дельфийский подход к этому делу. А родной (камень в сторону двойных указателей DX-а) - раздражает.
 
Конференция "Прочее" » Массивы и ReadFile
Есть новые Нет новых   [134446   +31][b:0][p:0.002]