0

GetCaretPosNSISインストーラーからUser32.dllの関数を呼び出そうとしていますが、メモリロケーションへの無効なアクセスエラーが発生する可能性があります。

これが私のコードです:

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

編集WindowsAPIを使用してテキストカレットを移動することに興味がある人のために、私はそれについてブログに書きました。アンダースの答えを使用すると、NSISスクリプトでこれを行うのは簡単です。

4

1 に答える 1

1

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
于 2011-06-17T14:26:47.133 に答える