Как заставить функцию вернуть в еах результат? Код (Text): regREAD proc subnod :dword, opt:dword, def:dword LOCAL Result:dword LOCAL lData :dword LOCAL lensub :dword LOCAL cic :dword invoke lstrlen,addr subnod mov lensub,eax invoke lstrlen,addr RegKey add eax,lensub mov lensub,eax invoke GlobalAlloc,GMEM_FIXED or GMEM_MOVEABLE or GMEM_ZEROINIT,[lensub+1] mov lData,eax invoke lstrcpy, lData,addr RegKey invoke lstrcat, lData, subnod invoke lstrlen, lData invoke RegOpenKey,HKEY_LOCAL_MACHINE,lData,addr Result .If Result == 0 invoke RegCreateKey,HKEY_LOCAL_MACHINE,lData,addr Result .If Result == 0 fn MessageBox,0,"Error while creating the Key!!","Ошибка",MB_OK invoke GlobalFree,lData ret .EndIf .EndIf invoke RtlZeroMemory,lData,lensub invoke GlobalFree,lData invoke GlobalAlloc,GMEM_FIXED or GMEM_MOVEABLE or GMEM_ZEROINIT,1024 mov lData,eax mov cic,1024 invoke RegQueryValueEx,Result,opt,NULL,addr lValueType,lData,addr cic .If eax == 0 .else invoke lstrlen,def invoke RegSetValueEx,Result,opt,0,REG_SZ,def,eax .If Result == 0 fn MessageBox,0,"Error while creating the Key!!","Ошибка",MB_OK invoke GlobalFree,lData ret .EndIf .EndIf invoke RegCloseKey,Result invoke RtlZeroMemory,lData,1024 invoke GlobalFree,lData mov eax,lData ret regREAD endp
интересна логика вышеописаних действий Код (Text): invoke RtlZeroMemory,lData,1024 invoke GlobalFree,lData mov eax,lData ret <br> .....ах да, совсем забыл, а что она тебе вернуть то должна ?
lData - Должна вернуть. А обнуление и освобождение делаю по привычке. А может винда сама за меня это сделает? Или данную операцию придеться все равно производить где-то после обращения к данной функции?
OFFSIDE 1) Убери из GlobalAlloc флаг GMEM_MOVEABLE. Иначе ты получаешь не указатель на выделенный блок, а его хэндл - тоже указатель, но на отдельный 8-байтный дескриптор, который в итоге засир-ся при lstrcpy. Если нужно непременно MOVEABLE, то не забывай про GlobalLock\Unlock 2) вызов RtlZeroMemory перед GlobalFree не имеет смысла 3) возвращать в eax инвалидный указатель на освобожденный блок lData - тоже бессмысленно. Если функция должна возвращать данные в lData, то ес-но нельзя освобождать блок внутри самой функции - придется делать это "самому в другом месте"