Archive: Problem with macro parameters (bug?)


Problem with macro parameters (bug?)
Hello!

I've found one thing. If we have macro, that accepts some parameter and then try to call it:

!insertmacro foo 'bar' ; blah

then compiler exits with error. Isn't it bug in expanding macro? I think that it is, because comments should be removed from the line before expansion. I am using 2.28.


What is the exact error?
Comments works fine on my machine with makensis 2.29.

Stu


Sorry guys, I must have made a make mistake elsewhere. When I was in an office, the compilator produced this error. I thought about it on the train on my way home and I simply couldn't believe that such a great installer could contain such a stupid bug. I came home and tried to write that macro and produce the error again. And nothing happened (either in 2.28 nor 2.30)! My aim was a macro, that executes command and checks for errors, something like this:

!macro MyExec command
ClearErrors
ExecWait command
${If} ${Errors}
MessageBox MB_OK|MB_ICONSTOP "Error! (${command})"
${EndIf}
!macroend

And then I replaced all occurencies of "ExecWait" to "!insertmacro MyExec", that should be OK.

So I am very sorry for starting this thread, delete it if you want. Have a nice weekend guys!


Stu, the compilator said that I had 3 arguments to macro instead of 1 or 2. So I thought that it was a parser problem.


I know where was problem - the ';' character was placed immediately after last character of macro. No whitespaces.


I am having this problem, I have searched the forum for 'ExecWait macro' and found this thread. The compiler says that I am passing 8 arguments to ExecWait. This is my macro:

!macro MyExecWait comando
ExecWait ${comando}
IfErrors +1 +3
${MSG_ERROR} 'Não foi possÃ_vel executar comando. Instalação será abortada'
Abort
!macroend
!define MyExecWait '!insertmacro MyExecWait'


And I call it this way:

${MyExecWait} 'mysqldump -uroot -p123456 -a -c -r $INSTDIR\backup\controle.sql controle'


pospec I noticed that your ExecWait call does not use ${} around the command. I have tryed this, but then the ExecWait will execute 'command', literally.

Any help, please?

gustavo-serra, you need to do something like this to solve the problem:


!macro MyExecWait comando
ExecWait "${comando}"
IfErrors +1 +3
${MSG_ERROR} 'Não foi poss�_vel executar comando. Instalação será abortada'
.
.
.


Note the additional two " on the ExecWait line.

I have just done this. However, I had to change my old commands, for example:

ExecWait 'mysql -e"commands to mysql"'

to
${MyExecWait} 'mysql -e$\"commands to mysql$\"'


Is this the normal behavior? If so, then everything is solved.
Thanks for the help!

If you think about it, if you pass 'my name is "stu"' into your macro as argument which in turn places it in Command "${argument}", then Command "${argument}" will become Command "my name is "stu"" which is of course an invalid string. Best thing to do is to use ``: Command `${argument}`.

Stu


Oh! Thanks! I didn't know that I could use ` to group arguments. :-)