Нужно получить C:\Program Files\Example из строкового параметра в реестре. Есть код invoke RegOpenKeyEx,HKEY_CURRENT_USER,ADDR Key,0,KEY_QUERY_VALUE,ADDR hKey invoke RegQueryInfoKey,hKey,0,0,0,0,0,0,0,0,ADDR SizeKey,0,0 invoke RegQueryValueEx,hKey,addr Parametr,0,0,addr ValueKey,ADDR SizeKey invoke MessageBox,0,addr ValueKey,0,MB_OK invoke RegCloseKey,hKey Но MessageBox показывает C:\P. В чём может быть ошибка?
а ValueKey какого размеру? Ты там ниче не затираешь? Я бы в даном случае посоветовал заменить вторую строчку на mov SizeKey,SizeOf ValueKey. Хотя почему не работает твой вариант не знаю. И вообще, посмтори в отладчике, что куда записывает и какая функция что возвращает.
Чтобы определить длину параметра, можно два раза подряд вызвать RegQueryValueEx, первый вызов заполнит переменную dwDataLen значением длины параметра, второй вызов уже имея значение длины, заполнит буфер строкой. Код (Text): ;=возвращает 0 если ошибка, или длину строкового параметра если успешно RegGetStringValue proc hKey:DWORD,lpSubKey:DWORD,lpValueName:DWORD,lpOutput:DWORD LOCAL dwDataLen :DWORD local hHandleKey :DWORD local dwType :DWORD invoke RegOpenKeyEx,hKey,lpSubKey,NULL,KEY_QUERY_VALUE,addr hHandleKey .if eax==ERROR_SUCCESS invoke RegQueryValueEx, hHandleKey, lpValueName, NULL, addr dwType, NULL, addr dwDataLen .if eax==ERROR_SUCCESS invoke RegQueryValueEx, hHandleKey, lpValueName, NULL, addr dwType, lpOutput, addr dwDataLen .if eax==ERROR_SUCCESS invoke RegCloseKey,hHandleKey dec dwDataLen .if dwType==REG_MULTI_SZ dec dwDataLen .endif mov eax,dwDataLen ret .endif .endif .endif invoke RegCloseKey,hHandleKey xor eax,eax ret RegGetStringValue endp