เกริ่นนำ
ตามที่อธิบายไว้ในหน้าภาพรวม โค้ดโฮสต์จะทำการเรียก RPC ไปยังไลบรารีแซนด์บ็อกซ์ แซนด์บ็อกซ์จะทำให้มีการแยกหน่วยความจำระหว่างกระบวนการต่างๆ ดังนั้นโค้ดโฮสต์จึงไม่สามารถเข้าถึงหน่วยความจำในไลบรารีแซนด์บ็อกซ์ได้โดยตรง
เพื่อให้มั่นใจว่าโค้ดโฮสต์สามารถเข้าถึงตัวแปรและบล็อกหน่วยความจำในกระบวนการระยะไกล และทำให้การติดตั้งใช้งานโค้ดตรรกะหลักง่ายขึ้น SAPI มีชุดคลาส C++ ที่ครอบคลุม อย่างไรก็ตาม ในหลายๆ กรณีคุณจะสามารถใช้ประเภท C แบบเนทีฟได้ด้วย
ความต้องการประเภทพิเศษ (ประเภท SAPI) เกิดขึ้นเมื่อส่งผ่านตัวชี้ไปยังประเภทอย่างง่ายและบล็อกหน่วยความจำ (โครงสร้าง อาร์เรย์)
เช่น เมื่อเรียกฟังก์ชันโดยใช้ตัวชี้ จะต้องมีการแปลงตัวชี้เป็นตัวชี้ที่สอดคล้องกันภายในหน่วยความจำของไลบรารีแซนด์บ็อกซ์ ข้อมูลโค้ดด้านล่างจะแสดงสถานการณ์นี้ ระบบจะสร้างออบเจ็กต์ ::sapi::v::Array<int>
แทนอาร์เรย์ของจำนวนเต็ม 3 ตัว จากนั้นจะส่งผ่านการเรียก API ของไลบรารีแซนด์บ็อกซ์ได้ดังนี้
int arr[3] = {1, 2, 3};
sapi::v::Array<int> sarr(arr, ABSL_ARRAYSIZE(arr));
โปรดดูภาพรวมที่ครอบคลุมของประเภท SAPI ที่มีทั้งหมดโดยตรวจสอบไฟล์ส่วนหัว var_*.h
ในซอร์สโค้ดโปรเจ็กต์ SAPI ไฟล์ส่วนหัวเหล่านี้มีคลาสและเทมเพลตที่แสดงข้อมูลประเภทต่างๆ เช่น
::sapi::v::UChar
แสดงถึงอักขระที่ไม่มีสัญลักษณ์ซึ่งเป็นที่รู้จัก::sapi::v::Array<int>
แสดงอาร์เรย์ของจำนวนเต็ม
ประเภท SAPI
ส่วนนี้จะแนะนำ SAPI สามประเภทที่มักพบในโค้ดโฮสต์
ตัวชี้ SAPI
หากฟังก์ชันที่จะแซนด์บ็อกซ์จำเป็นต้องส่งตัวชี้ ควรได้รับตัวชี้นี้จากเมธอด PtrXXX()
ด้านล่างรายการใดรายการหนึ่ง คลาสตัวแปร SAPI จะใช้วิธีการเหล่านี้
ประเภทตัวชี้ | |
---|---|
::PtrNone() |
ไม่ซิงค์หน่วยความจำที่สำคัญระหว่างกระบวนการโค้ดโฮสต์และกระบวนการของไลบรารีแซนด์บ็อกซ์เมื่อส่งผ่านไปยังฟังก์ชัน API ที่ทำแซนด์บ็อกซ์ |
::PtrBefore() |
ซิงค์ข้อมูลหน่วยความจำของออบเจ็กต์ที่ออบเจ็กต์ชี้ไปก่อนที่จะเรียกใช้ฟังก์ชัน API แบบแซนด์บ็อกซ์ ซึ่งหมายความว่าระบบจะโอนหน่วยความจำภายในของตัวแปรชี้ไปยังกระบวนการของไลบรารีแซนด์บ็อกซ์ก่อนที่จะเริ่มต้นการเรียกใช้ |
::PtrAfter() |
ซิงค์หน่วยความจำของออบเจ็กต์ที่ออบเจ็กต์ชี้ไปหลังจากที่มีการเรียกฟังก์ชัน API แซนด์บ็อกซ์ ซึ่งหมายความว่าระบบจะโอนหน่วยความจำระยะไกลของตัวแปรที่ชี้ไปยังหน่วยความจำการประมวลผลของโค้ดโฮสต์หลังจากการเรียกใช้เสร็จสิ้น |
::PtrBoth() |
รวมฟังก์ชันของ ::PtrBefore() และ ::PtrAfter() |
ดูเอกสารสำหรับตัวชี้ SAPI ได้ที่นี่
โครงสร้าง SAPI
เทมเพลต ::sapi::v::Struct
มีการบันทึกไว้ใน var_struct.h โดยมีตัวสร้างที่ใช้เพื่อรวมโครงสร้างที่มีอยู่ได้ โครงสร้าง SAPI แสดงวิธีทั้งหมดที่ระบุไว้ในตัวชี้ SAPI ในการรับออบเจ็กต์ ::sapi::v::Ptr
ที่สามารถใช้สำหรับการเรียกไลบรารีแบบแซนด์บ็อกซ์
ข้อมูลโค้ดด้านล่างแสดงโครงสร้างที่กำลังเริ่มต้นและส่งไปยังการเรียกใช้ฟังก์ชันแซนด์บ็อกซ์ในตัวอย่าง zlib
sapi::v::Struct<sapi::zlib::z_stream> strm;
…
if (ret = api.deflateInit_(strm.PtrBoth(), Z_DEFAULT_COMPRESSION,
version.PtrBefore(), sizeof(sapi::zlib::z_stream));
…
หากโครงสร้างที่มีอยู่มีตัวชี้ ตัวชี้เหล่านั้นจะชี้ไปยังที่อยู่ในแซนด์บ็อกซ์ ดังนั้น คุณจะต้องโอนข้อมูลแซนด์บ็อกซ์ก่อนจึงจะเข้าถึงโค้ดโฮสต์ได้
อาร์เรย์ SAPI
เทมเพลต ::sapi::v::Array
มีการบันทึกไว้ใน var_array.h โดยมีตัวสร้าง 2 รายการ รายการหนึ่งสามารถใช้ตัดอาร์เรย์ขององค์ประกอบที่มีอยู่ และอีกรายการเพื่อสร้างอาร์เรย์แบบไดนามิก
ข้อมูลโค้ดนี้ (นำมาจากตัวอย่างผลรวม) แสดงการใช้ตัวสร้างที่ล้อมรอบอาร์เรย์ที่ไม่ได้เป็นของออบเจ็กต์นี้
int arr[10];
sapi::v::Array<int> iarr(arr, ABSL_ARRAYSIZE(arr));
ข้อมูลโค้ดนี้แสดงตัวอย่างตัวสร้างที่ใช้ในการสร้างอาร์เรย์แบบไดนามิก:
sapi::v::Array<uint8_t> buffer(PNG_IMAGE_SIZE(*image.mutable_data()));
อาร์เรย์ SAPI จะระบุเมธอดทั้งหมดที่ระบุไว้ในตัวชี้ SAPI เพื่อรับออบเจ็กต์ ::sapi::v::Ptr
ที่สามารถใช้สำหรับการเรียกไลบรารีแบบแซนด์บ็อกซ์