функция ReadConsole

Тема в разделе "WASM.BEGINNERS", создана пользователем allexUnder, 24 мар 2008.

  1. allexUnder

    allexUnder New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2008
    Сообщения:
    4
    Здраствуйте. Цель: получить файл размером 600000 байт. Программа должна спрашивать имя файла.
    программа:

    .386
    .model flat, stdcall
    option casemap:none
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib
    BSIZE equ 128
    .data
    fName db ?
    msg db "a"
    fHandle dd ?
    cWritten dd ?
    cRead dd ?
    stdin dd ?
    .code
    start:
    invoke GetStdHandle, STD_INPUT_HANDLE
    mov stdin, eax
    invoke ReadConsole, stdin, ADDR fName, BSIZE, ADDR cRead, NULL
    invoke CreateFile, ADDR fName, GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,0
    mov fHandle, eax
    mov edx,1
    mov ecx,600000
    nxt:
    push ecx
    push edx
    invoke WriteFile, fHandle, ADDR msg, sizeof msg, ADDR cWritten, NULL
    pop edx
    inc edx
    pop ecx
    loop nxt
    invoke CloseHandle, fHandle
    invoke ExitProcess,0
    end start

    Файл не создается :dntknw: По-моему функция CreateFile не знает какой длинны переменная fName (это мои домыслы).
    Объясните, если не трудно, в чем дело и где ошибка. Спасибо.
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    allexUnder
    lpFileName Points to a null-terminated string that specifies the name of the object

    1) Надо отвести под fName не один байт, а "скоко нужно"
    2) ReadConsole по-моему не ставит нолик в конце считанного текста, т.ч. поставь сам
    В доках написано, что ReadConsole вообще может и в Unicode читать ...
    3) цикл на 600000 записей будет много времени выполнятся. Если содержимое
    неважно, то просто переведи указатель в файле на 599999 (SetFilePointer)
    и запиши один байт. Если нужно заполнить, то уж не байтами конечно пиши.
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    лучше SetFilePointer/SetEndOfFile
     
  4. allexUnder

    allexUnder New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2008
    Сообщения:
    4
    fName db 80 dup(?)
    Так правильно?
     
  5. allexUnder

    allexUnder New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2008
    Сообщения:
    4
    тогда так: fName db 80 dup(?), 0 правильно?
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    allexUnder
    Размер буфера должен быть равен максимальной длине имени.
    Нолик ты должен поставить сам в конце имени, если ReadConsole его не ставит.
    Не исключен вариант Unicode, тогда длина буфера в 2 раза больше и нужно
    будет еще конвертировать. А вообще с "кавалерийскими" замашками лучше
    программированием не заниматься - прочти для начала что-нибудь и разбери
    пару готовых исходников.
     
  7. allexUnder

    allexUnder New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2008
    Сообщения:
    4
    Спасибо всем.