การลบคีย์รีจิสทรีเป็นขั้นตอนสุดท้ายของรูทีนการติดตั้ง

เนื่องจากเป็นมือใหม่ที่มี "Inno Setup" และ "Inno Script Studio" ตอนนี้ฉันต้องการ Reg-Delete คีย์ที่สร้างขึ้นระหว่างการติดตั้งรายการใดรายการหนึ่งที่รวมอยู่ในโปรแกรมติดตั้งของฉัน หมายความว่าควรเป็นขั้นตอนสุดท้าย เนื่องจากคีย์นี้จะไม่มีอยู่ในขั้นตอนการติดตั้งก่อนหน้าของฉัน

จริงๆ แล้ว ฉันแค่ขาดไวยากรณ์ Pascalscript ที่ถูกต้องเท่านั้น

ฉันรู้ว่าฉันสามารถทำเช่นนี้ผ่านส่วน [Registry] ได้อย่างไร แต่ฉันก็ไม่รู้ว่าจะต้องทำอย่างไรเป็นขั้นตอนสุดท้าย

[Registry]
Root: "HKLM"; Subkey: "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "Example"; Flags: deletekey

ในส่วน [Code] ฉันลองทำสิ่งนี้เพื่อให้เป็นขั้นตอนสุดท้าย แต่คอมไพเลอร์บอกฉันว่าไม่ทราบคำสั่งของฉัน:

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    Log('Installation finished. Deleting connection string.');
    RegDeleteKey(HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run', 'Example');
  end;
end;

"RegDeleteKey" ไม่ใช่คำสั่งที่มีอยู่ เมื่อค้นหาคำสั่งฉันพบเฉพาะ "RegQueryStringValue", "RegWriteStringValue", "RegDeleteStringValue" (จะไม่ทำงาน) - ทั้งหมดนี้ไม่ใช่สิ่งที่ฉันกำลังมองหา ฉันต้องการลบคีย์ไม่ว่าค่าจะเป็นเท่าใดก็ตาม หวังว่าวิธีแก้ปัญหาจะง่าย... ขอบคุณล่วงหน้า


person Yauhun    schedule 03.02.2017    source แหล่งที่มา
comment
@Scott - ไม่มันไม่ใช่ เพราะจริงๆ แล้วฉันได้ตรวจสอบหัวข้อที่คุณเชื่อมโยงแล้ว อย่างไรก็ตาม ฉันต้องการลบคีย์เมื่อสิ้นสุดขั้นตอนการติดตั้ง หากคุณทำงานกับ Inno Setup คุณจะรู้ว่าส่วน [Registry] จะทำงานก่อนเสมอ ซึ่งเป็นปัญหา และไม่มีตัวอย่าง [Code] ให้ไว้ ในหัวข้อที่คุณเชื่อมโยงด้วย ซึ่งฉันต้องการจริงๆ คุณรู้ว่านี่ไม่ใช่สิ่งที่ซ้ำกันโดยการตรวจสอบส่วนโค้ดแรกของฉันด้านบน ฉันก้าวไปอีกขั้นด้วยคำถามของฉัน ซึ่งหมายความว่าคุณไม่ได้ใช้เวลาทำความเข้าใจปัญหาของฉันจริงๆ เมื่อมองหาสิ่งที่ซ้ำกันอยู่แล้ว   -  person Yauhun    schedule 03.02.2017
comment
ฉันใช้ innosetup และมีโปรเจ็กต์ที่ใช้งานอยู่อยู่สองสามโปรเจ็กต์ที่ใช้งานอยู่ ฉันไม่เห็นว่าสิ่งนี้ไม่ซ้ำกันอย่างไร คุณไม่จำเป็นต้องดำเนินการใดๆ หลังการติดตั้งคำสั่ง เนื่องจากหากรีจิสตรีคีย์ซ้ำซ้อนและไม่ได้ใช้งานอีกต่อไป เมื่อ innosetup เรียกใช้คำสั่ง ก็ไม่ต่างอะไร เพราะสามารถทำได้ทันทีตั้งแต่เริ่มต้นกระบวนการติดตั้งสำหรับทุกสิ่งที่คุณใส่ใจ ตราบใดที่การประกาศรีจิสทรีอยู่ที่ด้านบน มันจะลบคีย์รีจิสทรีที่ละเมิดเมื่อเริ่มต้นการติดตั้ง (โดยไม่ต้องใช้ส่วน [รหัส] ใด ๆ ) ซึ่งไม่ได้สร้างความแตกต่างกับช่วงเวลาของการลบคีย์ที่ซ้ำซ้อน   -  person Scott    schedule 03.02.2017
comment
@Scott คีย์ถูกสร้างขึ้นระหว่างการติดตั้ง หากฉันพยายามลบคีย์เมื่อเริ่มต้นรูทีน คีย์นั้นจะยังไม่มีอยู่ด้วยซ้ำ ด้วยเหตุนี้ฉันจึงต้องใช้คีย์นั้นเป็นขั้นตอนสุดท้าย ฉันเขียนอย่างนั้นในประโยคแรกของฉันข้างต้นแล้ว ฉันได้ทดสอบการลบด้วยคำสั่ง [Registry]-part-command แล้ว แต่เมื่อทำเช่นนี้ คีย์จะยังคงอยู่ที่นั่นหลังจากการติดตั้งส่วนที่เหลือ ซึ่งเหมาะสมหากการติดตั้งสร้างคีย์ หากคุณตรวจสอบโค้ดตัวอย่างของฉัน คุณจะเห็นว่าฉันได้เข้าไปที่ส่วนโค้ดที่นี่เท่านั้น เพราะฉันต้องการประกาศว่านี่เป็นขั้นตอนสุดท้าย   -  person Yauhun    schedule 06.02.2017
comment
ตกลง ประเด็นยุติธรรม - ฉันอ่านคำถามเดิมของคุณเมื่อคุณสร้างขึ้นระหว่างแพ็คเกจการติดตั้งก่อนหน้า - เช่น สคริปต์ innosetup ที่เก่ากว่า และคุณต้องการให้สคริปต์ใหม่ลบออก   -  person Scott    schedule 09.02.2017


คำตอบ (2)


ลอง RegDeleteValue(HKEY_LOCAL_MACHINE,'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run','Example');

person RN92    schedule 29.06.2017

มันคือ RegDeleteKeyIncludingSubkeys:
https://jrsoftware.org/ishelp/index.php?topic=isxfunc_regdeletekeywithoutsubkeys

person Martin Prikryl    schedule 03.02.2017
comment
ฉันเห็น. ยังคงได้รับข้อผิดพลาดในบรรทัดเดียวกัน ฉันเดาว่าฉันต้องเพิ่มด้วยว่านี่คือ String หรือไม่ - person Yauhun; 03.02.2017
comment
ในกรณีนี้จะช่วยได้: ข้อผิดพลาดของคอมไพเลอร์แจ้งว่าจำนวนพารามิเตอร์ไม่ถูกต้อง ฉันยังขาดอะไรบางอย่างไปหรือเปล่า? - person Yauhun; 03.02.2017
comment
จริงๆ แล้วคีย์ Microsoft\Windows\CurrentVersion\Run ไม่มีคีย์ย่อยใดๆ มีเพียงค่าเท่านั้น เหตุใดคุณจึงพยายามลบคีย์ Example ไม่ใช่ค่าจริงหรือ ใช้ RegDeleteValue - person Martin Prikryl; 03.02.2017
comment
เอาล่ะ คำสั่งทั้งสองไม่ทำงานสำหรับฉัน เมื่อสิ้นสุดการติดตั้ง Example ยังคงอยู่ตรงนั้น อย่างไรก็ตาม คอมไพเลอร์ไม่ได้บ่นในตอนนี้ ยังไม่มีวิธีแก้ปัญหา Reg-path ถูกต้อง... EXE ดำเนินการในฐานะผู้ดูแลระบบ ฉันหมดความคิดอีกแล้ว - person Yauhun; 07.02.2017
comment
แสดงการส่งออกรีจิสทรีของ Run เพื่อให้เราเรียนรู้ในที่สุดว่าคุณกำลังพยายามลบอะไร (คีย์หรือค่า) + แสดงรหัสของคุณโดยใช้ RegDeleteValue (ฉันยังคงถือว่า Example เป็นค่า เว้นแต่คุณจะ แสดงเป็นอย่างอื่น) - person Martin Prikryl; 07.02.2017
comment
ใช่แล้ว ขอโทษที ลืมบอกไป มันเป็นคุณค่า ตัวอย่างข้างต้นยังคงเหมือนเดิม (ใน [Code]) ฉันเพิ่งแทนที่ตามที่คุณแนะนำ RegDeleteValue ด้วยวิธีแก้ปัญหา ฉันสามารถแก้ไขได้ด้วยการรันสคริปต์เล็กๆ ที่ส่วนท้ายของรูทีนการติดตั้ง ซึ่งจะลบค่า โดยลบ [Code]-Section ออกทั้งหมด แต่ไม่ใช่วิธีแก้ปัญหาที่ฉันต้องการ... - person Yauhun; 07.02.2017
comment
ฉันได้ทดสอบรหัสที่แน่นอนของคุณแล้ว และมันก็ได้ผล แสดงการส่งออกคีย์รีจิสทรี Run ให้เราเห็น - person Martin Prikryl; 07.02.2017
comment
คุณได้ทดสอบโค้ดส่วนนี้แล้ว และใช่ มันทำงานแบบสแตนด์อโลน ดูเหมือนว่าจะทำงานผิดเวลา ดังนั้นจึงไม่มีผลกระทบหากไม่มีค่าในขณะนั้น Setup.exe เริ่มการติดตั้งหลายครั้งและรันทีละรายการ อันดับที่ 1: การสร้างโฟลเดอร์ แทรกไฟล์ทั้งหมด 2nd: เริ่ม Installer1 (สร้าง Registry-String!) 3rd: เริ่ม Installer2 4th: ควรลบคีย์ ณ จุดนี้ของรูทีนการติดตั้งทั้งหมด 5th: สิ้นสุด ไม่มีการดำเนินการอีกต่อไป . เป็นไปได้ไหมที่สิ่งนี้ยังทำงานผิดจุด แม้แต่ CurStep = ssPostInstall ก็ตาม (หวังว่าฉันจะส่งมอบสิ่งที่ฉันหมายถึงจะพูด...) - person Yauhun; 07.02.2017
comment
หากคุณรู้ว่าโค้ดใช้งานได้และถูกเรียกผิดเวลา คุณควรแจ้งให้เราทราบตั้งแต่เริ่มต้น! แต่อย่างไรก็ตาม เว้นแต่โค้ดของคุณจะได้รับการออกแบบมาอย่างแย่มาก CurStep = ssPostInstall ควรเป็นหนึ่งในเหตุการณ์สุดท้าย แต่เราแทบจะไม่สามารถรู้ได้หากไม่มีคุณแสดงรหัสที่เกี่ยวข้องให้เราทราบ - person Martin Prikryl; 07.02.2017
comment
ฉันเพิ่งมาถึงข้อสรุปนั้นโดยไม่ลังเลข้อมูล เมื่อคุณทดสอบฉันก็ทำ ไม่มีรหัสอีกต่อไปที่จะแสดงภายใต้ส่วน [Code] การติดตั้งสองรายการก่อนหน้านี้จะพบได้ใน [Run] และไม่มีอะไรเพิ่มเติม ฉันเคยใช้รหัสเดียวกันนี้มาก่อนเพื่อสร้างคีย์เมื่อสิ้นสุดการตั้งค่า ดังนั้นฉันจึงคาดว่าการดำเนินการนี้จะใช้สำหรับการลบในทางกลับกัน และไม่ได้คาดหวังว่าจะเกิดปัญหาตามลำดับ ยินดีที่จะแสดงให้คุณเห็นมากขึ้นหากคุณยังต้องการความช่วยเหลือ ขออภัยในการขาดประสบการณ์และความเข้าใจ เพียงทำสิ่งนี้เพื่องานอดิเรก ระบบบอกให้ย้ายแชทมาแชท-ถ้ายังไม่เบื่อ - person Yauhun; 07.02.2017
comment
ในด้านหนึ่ง คุณเขียนว่ามัน ทำงานแบบสแตนด์อโลน ในทางกลับกัน คุณเขียนว่า ไม่มีโค้ดที่จะแสดงอีกต่อไป นั่นฟังดูขัดแย้งกับฉัน ดังนั้นให้โพสต์ตัวอย่างที่ทำซ้ำได้น้อยที่สุด - person Martin Prikryl; 07.02.2017
comment
โดยที่ฉันหมายถึง ถ้าฉันรันส่วนนี้เป็นแบบสแตนด์อโลนด้วยตนเอง หลังจากการติดตั้งทั้งหมดเป็น EXE ที่สองโดยทำงานนั้นเพียงอย่างเดียว มันจะลบค่าที่ฉันต้องการลบ ถึงกระนั้น ในส่วน [Code] นี่คือทั้งหมดที่ฉันมี ใช่แล้ว ทั้งสองอย่างที่ฉันพูดนั้นถูกต้อง พูดถึงส่วนการเขียนโค้ดเท่านั้น ฉันแสดงให้คุณเห็นทั้งหมดที่ฉันมี แม้ว่าภาษาอังกฤษของฉันจะไม่สมบูรณ์แบบ แต่ฉันเชื่อว่านี่เป็นสิ่งที่เข้าใจได้ หากเราไม่สามารถหาวิธีแก้ปัญหาได้ที่นี่ ก็ไม่ใช่ปัญหา มันเป็นเพียงความพยายาม ฉันยังคงคิดเกี่ยวกับเรื่องนี้ต่อไป และจนกว่าการแก้ไขของฉันจะเป็นที่ยอมรับได้ - person Yauhun; 08.02.2017
comment
ดังนั้นให้เริ่มต้นด้วยโค้ดตัวติดตั้งแบบเต็มและลดขนาดลงเรื่อยๆ จนกว่าคุณจะพบโค้ดขั้นต่ำที่ยังคงทำให้เกิดปัญหาอยู่ แค่เดาคร่าวๆ: รายการ Example ถูกสร้างขึ้นโดยตัวติดตั้งย่อยบางตัวใช่ไหม คุณแน่ใจหรือว่ากำลังรอให้ตัวติดตั้งย่อยทำงานให้เสร็จสิ้นโดยสมบูรณ์? มันยังทำงานในพื้นหลังไม่ใช่หรือในขณะที่ตัวติดตั้งหลัก (การตั้งค่า Inno) กำลังจะเสร็จสิ้น (และเรียก RegDeleteValue - จะเกิดอะไรขึ้นหากคุณชะลอการลบโดยใช้ Sleep(10000) ก่อน RegDeleteValue - person Martin Prikryl; 08.02.2017