เหตุใด Win16 API เก่าบางตัวจึงยังรองรับ Windows เวอร์ชันใหม่กว่า

ฉันเพิ่งแก้ไข IAT บางส่วนบน MoleBox ที่บรรจุไฟล์ปฏิบัติการได้ และเห็นว่ามันเชื่อมโยงกับฟังก์ชัน kernel32: '_lopen', '_lwrite' และ '_lread' ไซต์นี้ระบุว่า API เหล่านั้นมีไว้เพื่อให้เข้ากันได้กับ Windows เวอร์ชัน 16 บิต ฉันไม่ต้องการทราบว่าแอปพลิเคชัน 'Win16' ไม่สามารถดำเนินการในโหมดยาวได้ (ใช่ - ฉันใช้ Win8.1 x64) - ดังนั้นจุดประสงค์ที่จะรวมอยู่ใน 'kernel32.dll' คืออะไร

อย่างไรก็ตามฟังก์ชั่นเหล่านั้นไม่รวมอยู่ในไลบรารี 'msdn' ด้วยซ้ำ

แก้ไข: ดูเหมือนว่าฟังก์ชั่นเหล่านั้นไม่ใช่ 16 บิตจริงๆ! พวกเขากำลังใช้พารามิเตอร์ 32 บิตบนสแต็ก


person AnArrayOfFunctions    schedule 08.01.2015    source แหล่งที่มา
comment
แน่นอนว่ามันไม่ใช่ 16 บิต kernel32.dll เป็นโมดูล 32 หรือ 64 บิต นอกจากนี้ความจริงที่ว่าฟังก์ชันรับพารามิเตอร์ 32 บิตไม่ได้ทำให้เป็น 32 บิต   -  person David Heffernan    schedule 08.01.2015
comment
ลองใช้เวลาอ่านเอกสารสำคัญที่ บล็อกของ Raymond Chen ซึ่งเขามักจะพูดถึงความเข้ากันได้แบบเก่าอยู่บ่อยครั้ง รหัสที่ยังคงอยู่   -  person Ken White    schedule 08.01.2015
comment
เหตุผลหลักอย่างแน่นอนก็คือเพราะไม่มีประเด็นที่จะ ไม่ รวมพวกมันไว้ด้วย และบังคับให้โปรแกรมเมอร์เขียนโปรแกรมเก่าของตนใหม่ การใช้งานแบบ 32 บิตนั้นไม่สำคัญ   -  person Hans Passant    schedule 08.01.2015
comment
ตลกพอแล้ว แต่ดูเหมือนว่าฟังก์ชั่น '16 บิต' เหล่านั้นรองรับในโมดูล 64 บิตด้วย! นี่ดูเหมือนเป็นจักรวาลใหม่สำหรับฉัน ฉันควรจะสร้างคำถามใหม่ - เมื่อใดควรใช้ Win32 หรือ Win16 API   -  person AnArrayOfFunctions    schedule 08.01.2015
comment
ฉันคิดว่าฉันอธิบายสิ่งนี้ในคำตอบของฉัน ฉันเดาว่าฉันทำงานได้ไม่ดีพอ คุณไม่เข้าใจอะไร?   -  person David Heffernan    schedule 08.01.2015
comment
ไม่ต้องห่วงครับพี่ ผมเข้าใจทุกอย่างแล้ว   -  person AnArrayOfFunctions    schedule 08.01.2015
comment
เมื่อใดควรใช้ Win32 หรือ Win16 API - อย่างหลังมีไว้สำหรับโค้ดเบสแบบเดิม คุณควรใช้ Win32 API ทุกครั้งที่เป็นไปได้ เพียงเพราะคุณ สามารถ ใช้ API ที่ล้าสมัยไม่ได้หมายความว่าคุณ ควร เว้นแต่คุณจะมีข้อกำหนดพิเศษ (ต้องการ Win3.1 เป้าหมายและเก่ากว่า)   -  person raymai97    schedule 02.08.2019


คำตอบ (2)


ไม่ใช่ว่าฟังก์ชันต่างๆ จะสามารถเรียกใช้ด้วยแอปพลิเคชัน 16 บิตได้ เห็นได้ชัดว่าไม่สามารถทำได้เนื่องจากอยู่ในโมดูล 32 บิตและ 64 บิต ประเด็นคือ (คือ) เพื่อให้นักพัฒนาสามารถคอมไพล์โปรแกรมเก่าได้ง่ายขึ้นโดยไม่ต้องเขียนใหม่

ในปัจจุบัน ในปี 2015 ไม่จำเป็นต้องรองรับนักพัฒนาที่มีโปรแกรม 16 บิตและต้องการคอมไพล์ใหม่อีกต่อไป นั่นอาจจะไม่เกิดขึ้นในระดับที่มีนัยสำคัญอีกต่อไป แต่ถ้าคุณย้อนเวลากลับไป 20 ปีนี่เป็นเรื่องที่น่ากังวลอย่างแท้จริง และด้วยเหตุนี้ MS จึงรวมไม้ค้ำยันเหล่านี้ไว้ด้วย และเมื่อรวมเข้าด้วยกันแล้ว MS ก็อาจตัดสินใจทิ้งพวกเขาไว้ที่นั่นเพื่อไม่ให้ทำลายความเข้ากันได้ของไบนารี MS พยายามอย่างเต็มที่เพื่อหลีกเลี่ยงไม่ให้โปรแกรมเก่าเสียหาย หากฟังก์ชันเหล่านี้ถูกลบออก โปรแกรมใดๆ ที่ต้องอาศัยฟังก์ชันเหล่านี้ก็จะเสียหาย

person David Heffernan    schedule 08.01.2015

Microsoft จะไม่ลบฟังก์ชัน "เพียงเพราะ" ฟังก์ชันเหล่านั้นเก่า พวกเขาจะลบฟังก์ชันเหล่านี้ทันทีที่ต้องมีการปรับใช้ใหม่ แต่ตอนนี้ใช้เวลาน้อยลงในการคงไว้

person MSalters    schedule 08.01.2015