Ошибка GetCaretPos Неверный доступ к памяти - PullRequest
0 голосов
/ 17 июня 2011

Я пытаюсь вызвать функцию GetCaretPos в User32.dll из установщика NSIS, и единственное, что я могу получить, - это неверный доступ к ошибке расположения в памяти.

Вот мой код:

Function fixUpRegKeyText
     Exch $0 ; HWND to text box
     Push $1 ; text of edit box
     Push $2 ; pointer to point structure
     Push $3 ; getlasterror result


     System::Alloc 16 ;struct long, long
     pop $2
     ;messageBox MB_OK $2
     ;get the caret position
     System::Call "User32::GetCaretPos(p .r2) i.. ? e"
     pop $3

     messageBox MB_OK $3 ; 998!

     ${NSD_GetText} $0 $1

     Push $1
     call StrUpper
     Pop $1

     ${NSD_SetText} $0 $1

     ; now set the caret position
     ;System::call "user32::SetCaretPos(p s.) i .."

     Pop $3
     Pop $2
     Pop $1
     Pop $0
FunctionEnd

Редактировать Если кому-то интересно использовать Windows API для перемещения текстовой каретки, я написал об этом в блоге . Используя ответ Андерса, это легко сделать в сценарии NSIS.

1 Ответ

1 голос
/ 17 июня 2011

Тип указателя p не работает в 2.46, используйте i.(Используйте автономный справочный файл, онлайновый справочный файл имеет функции, доступные только в SVN) *

Кроме того, когда функции требуется указатель на выделенную вами структуру, используйте «i register», а не «i .register»(Функция должна знать адрес памяти, чтобы заполнить его данными)

System::Call '*(i,i)i.r0'
System::Call "USER32::GetCaretPos(i r0)i.r3"
System::Call '*$0(i.r1,i.r2)'
DetailPrint "$1x$2 return=$3"
System::Free $0
...