Saya memiliki kode berikut

ClearErrors
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Office\ClickToRun\Configuration" "ProductReleaseIds"
IfErrors done                       ;+19 if error
${StrLoc} $R1 $R0 "365" ">"
    StrCmp $R1 "" next 0            ;+8 if substring is not found
    ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Office\ClickToRun\Configuration" "Platform"
        ${If} $R1 = "x86"
            StrCpy $R1 "365x32"
        ${Else}
            StrCpy $R1 "365x64"
        ${EndIf}
        Goto found_${ID}
next: ${StrLoc} $R1 $R0 "2019" ">"
    StrCmp $R1 "" done 0            ;+8 if substring is not found
    ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Office\ClickToRun\Configuration" "Platform"
        ${If} $R1 = "x86"
            StrCpy $R1 "2019x32"
        ${Else}
            StrCpy $R1 "2019x64"
        ${EndIf}
        Goto found_${ID}
done: ClearErrors

Bahkan jika tidak ada kesalahan / peringatan yang dibebankan selama kompilasi kode, perilaku kode tidak seperti yang diharapkan. Setelah 2 jam debugging "imajinatif", saya mengerti penyebab perilaku aneh yang saya alami.

Dalam kode pada akhirnya saya menggunakan label "Berikutnya" dan "Selesai" dan semua masalah saya hilang! Pada awalnya saya telah menggunakan angka untuk melompat (lihat ke dalam string komentar angka-angka yang seharusnya berfungsi tetapi itu tidak berhasil!).

Apakah ada yang tahu alasan mengapa angka-angka itu digunakan untuk melompat salah?

Dalam kondisi normal, saya bersumpah saya tidak punya masalah untuk dihitung sampai 20, tetapi tampaknya ini bukan masalahnya :)

0
Jumpy73 5 April 2021, 00:42

1 menjawab

Jawaban Terbaik

Anda tidak boleh menggunakan offset untuk melompati makro karena Anda tidak tahu berapa banyak instruksi yang mereka berisi (dan dapat berubah antara versi NSIS).

Dalam kasus Anda, Strloc dan jika / lain / endif adalah makro.

Label memiliki nol overhead di installer yang dihasilkan dan harus digunakan (dan / atau jika / endif) di sebagian besar tempat. Offset langsung berguna dalam makro yang mungkin dimasukkan beberapa kali di fungsi / bagian yang sama di mana Anda tidak dapat menggunakan jika / endif / sementara (jarang) tetapi dengan cepat keluar dari tangan. Anda dapat menggunakan sesuatu seperti !define MyLabel L${__COUNTER__} untuk membuat label untuk makro seperti itu:

!macro Test
!define MyLabel L${__COUNTER__}
...
StrCmp $1 $2 ${MyLabel}_end
...
${MyLabel}_end:
!undef MyLabel
!macroend
0
Anders 5 April 2021, 00:31