Строка

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

  1. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Код (Text):
    1. ;DLL
    2. .data
    3. szXX1       db 13 dup(0)
    4.  
    5. .code
    6.  
    7. ...
    8. ; на экспорт
    9. GetXXX proc szVID:DWORD
    10.  invoke lstrcpy, [szVID], addr szXX1
    11.  invoke lstrlen, [szVID]
    12.  ret
    13. GetXXX endp
    Эта функция получает указатель на строку и копирует вычисленную строку (13 символов) по полученному указателю. Всё хорошо, до тех пор, пока экспортируемая ф-ия не будет вызвана из проги (вызов явный): прога просто падает (с криками об отправлении отчёта в мс).

    В чём причина?
    ЗЫ: помогите, плз, 2 недели мозги парю!
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    1) что значит "вызов явный"?
    2) первое, что приходит на ум - не выровнен стэк (stdcall или др. очищение стека?)
    3) второе, что приходит на ум - вызов идет не туда. Посмотри под отладчиком, куда идет явный вызов
     
  3. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    1) т.е. вызывается подключением либы и инклудов, а не через loadlibrary, getprocaddress
    2) вообще нужно использовать stdcall, буду проверять ещё раз
    3) отладчик показывает чушь всякую.
     
  4. Noble Ghost

    Noble Ghost New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    204
    Адрес:
    Russia
    длина строки 13 символов с нулем?

    бред.
     
  5. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    13 символов с zero.

    нет! не бред. Оля действительно показывает чушь - например вызов из advapi.dll, хотя я подключаю только kernel32.dll!
     
  6. Noble Ghost

    Noble Ghost New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    204
    Адрес:
    Russia
    Код (Text):
    1. GetXXX proc szVID:DWORD
    2.  invoke lstrcpy, [szVID], addr szXX1
    3.  invoke lstrlen, [szVID]
    4.  [b]ret 8[/b]
    5. GetXXX endp
     
  7. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    исходников бы прицепил, можт быть ктото и подсказал.
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    4 а не 8, но в масме это писать не требуется
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    тогда неплохо проконтролировать дизассемблировав файл, возможно ты что-то неверно
    указал и масм оформил процедуру как cdecl
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Если из-за ошибки не восстанавливается или еще хуже затирается стек, то все возможно ;)
    Стек может затираться, например, если в проге szVID выделена в стеке и в нее по ошибке копируется больше чем нужно (надежнее юзать lstrcpyn), или если szVID локальный указатель или параметр другой функции, а в GetXXX передается по ошибке как adr szVID. Да мало ли чего может быть - или показывай код или смотри в отладчике в пошаге как происходит вызов
     
  11. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Всё! Нашёл ошибку. Надо было всего лишь перед вычислением szXX1 её очистить.
    ЗЫ: вот что могет сделать с человеком просиживание за компом по 2 суток!

    ЗЗЫ: тему можно закрывать.
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Ну у меня был ваще заскок, часа 2 мучился, почему код не работает как надо. Оказалось что я забыл ! перед RtlCompareUnicodeString.
     
  13. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Самое страшное для программиста - это когда 10 человек пытаются найти у тебя ошибку, а а ты уже все понял, но боишься сказать, т.к. это что-то вопиюще глупое :)))
     
  14. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Да, бывает совесть моя просыпается и я начинаю признавать свои ошибки.

    ВСЕМ СПАСИБО!