GetUserName

Тема в разделе "WASM.BEGINNERS", создана пользователем vg, 30 сен 2007.

  1. vg

    vg New Member

    Публикаций:
    0
    Почему при вызове(в WinXP) GetUserName
    Код (Text):
    1. username              db 255 dup (?)
    2.  
    3. invoke GetUserName,addr username,sizeof username
    4. invoke MessageBox,hwnd,addr username,0, MB_OK
    выскакивает ошибка?
     
  2. Aspire

    Aspire New Member

    Публикаций:
    0
    Зашибись! Какая?
     
  3. vg

    vg New Member

    Публикаций:
    0
    Aspire
    Инструкция по адресу такуму-то обратилась к память по адресу такому-то. Память не может быть "read".
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    под отладчиком прогони
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    vg
    так у тебя может наверное данные в нечитаемой секции...
    по твоему кусочку кода точно нескажеш
     
  6. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Подскажите пожалуйста по похожему вопросу. Есть код, но почему-то функция возвращает пустую строку. Тестил на разных учетных записях - результат аналогичный. Система ХР. Или функция устарела, или (что более вероятно), где-то ошибка в коде.

    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\kernel32.inc
    6. include \masm32\include\windows.inc
    7. include \masm32\include\user32.inc
    8. include \masm32\include\Advapi32.inc
    9. includelib \masm32\lib\kernel32.lib
    10. includelib \masm32\lib\user32.lib
    11. includelib \masm32\lib\Advapi32.lib
    12.  
    13. .const
    14.  
    15.  
    16. .data
    17. lpUsername db 256 dup (0)
    18. capt db "Asm",0
    19.  
    20.  
    21. .data?
    22. nSize dd ?
    23.  
    24. .code
    25. Start:
    26. Invoke GetUserName,addr lpUsername,addr nSize
    27. Invoke MessageBox,0,addr lpUsername,addr capt,0
    28.  
    29. Invoke ExitProcess,0
    30. end Start
     
  7. artkar

    artkar New Member

    Публикаций:
    0
    Образец Ваш не компилил может эта:
    из мздэна

    DWORD bufCharCount = INFO_BUFFER_SIZE;

    // Get and display the name of the computer.
    bufCharCount = INFO_BUFFER_SIZE;
    if( !GetComputerName( infoBuf, &bufCharCount ) )
    printError( TEXT("GetComputerName") );
    _tprintf( TEXT("\nComputer name: %s"), infoBuf );

    // Get and display the user name.
    bufCharCount = INFO_BUFFER_SIZE;
    if( !GetUserName( infoBuf, &bufCharCount ) )
    printError( TEXT("GetUserName") );
    _tprintf( TEXT("\nUser name: %s"), infoBuf );
     
  8. h0t

    h0t Member

    Публикаций:
    0
    GetUserName - возвращает юникод, а MessageBox возможно ANSII
    попробуйте использовать MessageBoxW
    + размер валидный указывайте
     
  9. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    artkar, а что значит в Си код bufCharCount = INFO_BUFFER_SIZE; ? В плане, как это выглядит в Асме - обычный буфер или что-то другое?

    h0t, к сожалению, не помогло.

    Что интересно, на Си все получилось. Тоже не получалось, потом убрал в MessageBox указатель на буфер, и вставил его напрямую - и заработало.

    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3.  
    4. int main()
    5.     {
    6. char buf [256];
    7. DWORD sized;
    8. sized=sizeof(buf);
    9. GetUserName(buf,&sized);
    10. MessageBox (0,buf,"cc",MB_OK);
    11.  
    12.     }
     
  10. artkar

    artkar New Member

    Публикаций:
    0
    Попробуй nSize dd ? заменить на nSize dd 256
     
  11. h0t

    h0t Member

    Публикаций:
    0
     
  12. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    nSize dd 256 - когда указал это, все заработало. Большое спасибо за помощь. Я думал, что в данном случае, nSize это out, т.е. в него передается к-тво байт.
     
  13. K10

    K10 New Member

    Публикаций:
    0
    Почему ADDR а не OFFSET?
     
  14. h0t

    h0t Member

    Публикаций:
    0
    на самом деле одно к другому преобразуется
     
  15. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    K10
    в Invoke используется ADDR, так записывать удобней и проще, чем OFFSET и call.
     
  16. K10

    K10 New Member

    Публикаций:
    0
    M0rg0t
    При чем здесь CALL?
    По Вашему OFFSET не используется в invoke?