Помогите новичку

Applications development, KoOS API questions
  • В Wiki написано, что функция 18.10 сворачивает собственное окно.
    Но у меня почему-то сворачивается именно активное окно(это не обязательно собственное).
    Я пробовал это в сборках svn2696-img и в 0.7.7.0.
    Но скриншотер как-то ведь работает!? Судя по исходнику он тоже использует функцию 18.10.

    Code: Select all

    macro min_window
    {
            mov     eax,18
            mov     ebx,10
            mcall
    }
    Как вообще такое может быть?

    Если скомпилировать приведённый ниже код и запустить полученную программу, то она свернёт запускающее её приложение(например Eolite или Run):

    Code: Select all

    ORG 0
    BITS 32
    MENUET01            db 'MENUET01'
    version             dd 1
    program.start       dd start_
    program.end         dd end_
    program.memory      dd end_ + 256
    program.stack       dd end_ + 256
    program.params      dd 0
    program.path        dd 0
    start_:
    
    	mov eax, 18
    	mov ebx, 10
    	int 64		
    
    
    	or eax, -1
    	int 64
    
    end_:
    Хотя тут и не создаётся окно, но всё равно, чужое окно ведь не должно было сворачиваться?
    И с окном у меня такая же ситуация.

    Я сперва было подумал, что каким-то образом могла вызываться 18.22 вместо 18.10, но как тогда в регистры попали нужные параметры?
  • 18.10 предполагает, что у активного приложения и окно - активное.
    Его и сворачивают.
    Но если у приложения нет своего окна - тогда сворачивается чужое...

    А у скриншотера-таки есть своё собственное окно, в котором задаются все нужные настройки. Программе нужно свернуть свое окно, чтобы прочитать то, что "под ним". Так что здесь все работает правильно.
  • art_zh, спасибо за разъяснение.
    Меня сбило с толку "собственное окно".
    В Wiki не сказано, что оно должно быть активным.

    Тогда, чтобы свернуть не обязательно активное, но именно своё окно можно использовать
    18.22 или можно сначала активизировать своё окно с помощью 18.3, а потом свернуть с помощью 18.10.

    Я просто тоже делал свой скриншотер и хотел прикрутить к нему клавишу PrintScreen.
    Вот здесь я приводил скриншот своего скриншотера viewtopic.php?p=39839#p39839
    Теперь он уже почти готов.
  • А ведь может так получиться, что после вызова 18.3 произойдёт переключение на другой поток,
    который тоже захочет активизировать какое-либо другое окно?
    Тогда, после вызова 18.10, скорее всего, это другое окно и будет минимизировано.
    А, значит, чтобы гарантированно свернуть своё окно надо использовать 18.22, верно?
  • Я хочу проверить не равнали строка 0.

    В программе уже есть:
    cmp [params],byte 0

    Я пишу:
    cmp [params],0

    Выдаёт ошибку. Хотя в docpack такая строка есть и работает нормально.
    Из хаоса в космос
  • Что-то не очень ясно, Leency.
    У меня программа

    Code: Select all

    label:
    cmp [params], 0
    jz label
    params db 0
    
    отлично собирается с помощью fasm. Так что поясни, что за ошибка и где.
  • downloader

    Code: Select all

    align 4
    params:		; db 4096 dup(0)
    	rb 4096
    446 строка

    Code: Select all

    ; if called from command line, then exit
    	cmp	[params],byte 0
    заменил на

    Code: Select all

    cmp	[params],0
    ошибка "error: operand size not specified". Замел на

    Code: Select all

    	;cmp	[params],byte 0
        mov        esi,params
        cmp        dword[esi],0
    Работает.

    Но тут ошибка у меня где-то в HTMLv... сейчас разбираюсь.
    Из хаоса в космос
  • При таком объявлении fasm не может определить, какого размера "единица" данных, расположенных по метке params, поэтому размер операнда нужно указывать явно:

    Code: Select all

    params:
        rb 4096
        ...
        cmp byte[params],0
    А при таком объявлении ассемблер сам сможет определить размер операнда:

    Code: Select all

    params rb 4096
    ...
    cmp   [params],0
    Машинный код по идее получится один и тот же.
  • Есть такая штука:

    Code: Select all

    struct path_string {
    char Item[4096];
    };
    
    path_string history_list[40];
    sizeof(history_list) возвращает не 40, а 40*4096, можно ли узнать длинну исключительно history_list, то есть получить число 40?
    Из хаоса в космос
  • Leency wrote:sizeof(history_list) возвращает не 40, а 40*4096...
    Но ведь это и есть размер history_list в байтах. SizeOf его и возвращает.
  • Code: Select all

    sizeof(history_list)/sizeof(*history_list)
    Может, красивее можно.
  • Всем спасибо.
    sizeof(history_list)/sizeof(*history_list) - ругается. наверно с-- это не умеет
    sizeof(history_list)/sizeof(path_string) - работает
    Из хаоса в космос
  • в никсовых прогах пишут обычно sizeof(history_list)/sizeof(history_list[0]) , точнее, используют ARRAY_SIZE, который сделан либо через макрос, либо в компилятор встроен.

    Code: Select all

    #define ARRAY_SIZE(array) ((sizeof(array) / sizeof(array[0])))
    http://lxr.free-electrons.com/source/in ... rnel.h#L45
  • Выглядит очень круто, но в С-- не работает Т_Т
    Из хаоса в космос
  • Who is online

    Users browsing this forum: No registered users and 1 guest