Код (Text): ;DLL .data szXX1 db 13 dup(0) .code ... ; на экспорт GetXXX proc szVID:DWORD invoke lstrcpy, [szVID], addr szXX1 invoke lstrlen, [szVID] ret GetXXX endp Эта функция получает указатель на строку и копирует вычисленную строку (13 символов) по полученному указателю. Всё хорошо, до тех пор, пока экспортируемая ф-ия не будет вызвана из проги (вызов явный): прога просто падает (с криками об отправлении отчёта в мс). В чём причина? ЗЫ: помогите, плз, 2 недели мозги парю!
1) что значит "вызов явный"? 2) первое, что приходит на ум - не выровнен стэк (stdcall или др. очищение стека?) 3) второе, что приходит на ум - вызов идет не туда. Посмотри под отладчиком, куда идет явный вызов
1) т.е. вызывается подключением либы и инклудов, а не через loadlibrary, getprocaddress 2) вообще нужно использовать stdcall, буду проверять ещё раз 3) отладчик показывает чушь всякую.
13 символов с zero. нет! не бред. Оля действительно показывает чушь - например вызов из advapi.dll, хотя я подключаю только kernel32.dll!
Код (Text): GetXXX proc szVID:DWORD invoke lstrcpy, [szVID], addr szXX1 invoke lstrlen, [szVID] [b]ret 8[/b] GetXXX endp
тогда неплохо проконтролировать дизассемблировав файл, возможно ты что-то неверно указал и масм оформил процедуру как cdecl
Если из-за ошибки не восстанавливается или еще хуже затирается стек, то все возможно Стек может затираться, например, если в проге szVID выделена в стеке и в нее по ошибке копируется больше чем нужно (надежнее юзать lstrcpyn), или если szVID локальный указатель или параметр другой функции, а в GetXXX передается по ошибке как adr szVID. Да мало ли чего может быть - или показывай код или смотри в отладчике в пошаге как происходит вызов
Всё! Нашёл ошибку. Надо было всего лишь перед вычислением szXX1 её очистить. ЗЫ: вот что могет сделать с человеком просиживание за компом по 2 суток! ЗЗЫ: тему можно закрывать.
Ну у меня был ваще заскок, часа 2 мучился, почему код не работает как надо. Оказалось что я забыл ! перед RtlCompareUnicodeString.
Самое страшное для программиста - это когда 10 человек пытаются найти у тебя ошибку, а а ты уже все понял, но боишься сказать, т.к. это что-то вопиюще глупое ))