Archive: Problem with $INSTDIR: a bug?


Problem with $INSTDIR: a bug?
When I click "Cancel" button of the Dir-Browsing dialog of DirPage, $INSTDIR becomes the last path I have clicked in the cancelled dialog, though the original value (maybe different from the real value of $INSTDIR) is displayed in the edit box. As a result, I cannot verify the correct $INSTDIR in my own LeaveDirPage function :-(

To make the above description clearer, see the following code segment and example.


PageEx directory
DirVerify leave
PageCallbacks "" "" LeaveDirPage
PageExEnd

Function LeaveDirPage
...
FunctionEnd


-- The original value of $INSTDIR is "C:\temp"
-- Click "Browse" button, click a different folder "C:\abc", then click "Cancel" button to close the dir-browsing dialog.
-- Then, "C:\temp" remains in the edit box, however, now $INSTDIR = "C:\abc" if you check it in .onVerifyInstDir or LeaveDirPage function.
-- After LeaveDirPage runs, $INSTDIR is assigned to the original value (i.e., the one displayed in the edit box) "C:\temp".
-- Though NSIS will not install to a wrong dir, but LeaveDirPage cannot catch a correct one.

Do you think it is a BUG? Or did I misuse antything?

Two possible solutions to my problem:

1) In LeaveDirPage function, read $INSTDIR from the edit box. Could anyone please tell me how to do so?

2) In the pre function of the next page, verify $INSTDIR. If it is invalid, automatically back to DirPage. I failed to find a instruction to mimic the Back button. Please help me if you know. Thanks.


I think there is two bugs:
1. Problem you post
2. SendMessage with WM_GETTEXT
    (crash: SendMessage $0 ${WM_GETTEXT} ${NSIS_MAX_STRLEN} $0)

Try this:

Name "Output"
OutFile "Output.exe"
InstallDir "C:\temp"

!include "WinMessages.nsh"


PageEx directory
DirVerify leave
PageCallbacks "" "" LeaveDirPage
PageExEnd

Page instfiles


Function LeaveDirPage
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 1019
System::Call "user32::SendMessage(i $0, i ${WM_GETTEXT}, i ${NSIS_MAX_STRLEN}, t .r0)"

MessageBox MB_OK "$$INSTDIR={$INSTDIR}$\n$$0={$0}"
FunctionEnd

Section
SectionEnd

Thanks for the code. Using GetWindowText may be simpler ;-)


FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $1 $0 1019 ; IDC_DIR
System::Call 'User32::GetWindowText(i $1, t .R0, i 256)'

The problem is indeed a bug. I have fix this in CVS. Thanks.

The SendMessage is not a bug. When you use $0, you use its value, not a pointer to it.


Originally posted by kichik
The problem is indeed a bug. I have fix this in CVS. Thanks.

The SendMessage is not a bug. When you use $0, you use its value, not a pointer to it.
Can you write an example using SendMessage $0 ${WM_GETTEXT} ...

I can't give you an example because it's impossible. You can't define pointers in the script without the System plug-in.