กลับไปหน้าบทความ

อ่าน 2 นาที

ประเภทตัวแปร (COM)

Variant เป็น ชนิดข้อมูล ในภาษาโปรแกรมบางภาษา โดยเฉพาะ Visual Basic , OCaml , [ 1 ] Delphi และ C++ เมื่อใช้ Component Object Model เป็นการนำ แนวคิดที่มีชื่อเดียวกันมา ใช้ ใน...

ประเภทตัวแปร (COM)

Variantเป็นชนิดข้อมูลในภาษาโปรแกรมบางภาษา โดยเฉพาะVisual Basic , OCaml , [ 1 ] DelphiและC++เมื่อใช้Component Object Modelเป็นการนำแนวคิดที่มีชื่อเดียวกันมา ใช้ ในวิทยาศาสตร์คอมพิวเตอร์

ใน Visual Basic (และVisual Basic for Applications ) ชนิดข้อมูล Variant เป็นยูเนียนแบบแท็กที่สามารถใช้แทนชนิดข้อมูลอื่นๆ ได้ (เช่นจำนวนเต็ม , ทศนิยม , ความแม่นยำ เดี่ยวและคู่ , อ็อบเจ็กต์ฯลฯ) ยกเว้นชนิดข้อมูลสตริงที่มีความยาวคงที่ ใน Visual Basic ตัวแปรใดๆ ที่ไม่ได้ประกาศอย่างชัดเจน หรือชนิดข้อมูลที่ไม่ได้ประกาศอย่างชัดเจน จะถือว่าเป็น Variant

แม้ว่าการใช้ตัวแปรแบบ variant ที่ไม่ได้ประกาศไว้อย่างชัดเจนจะไม่เป็นที่แนะนำ แต่ก็อาจมีประโยชน์ในกรณีที่ทราบชนิดข้อมูลที่ต้องการได้เฉพาะในขณะรันไทม์ เมื่อคาดว่าชนิดข้อมูลจะเปลี่ยนแปลง หรือเมื่อต้องการพารามิเตอร์เสริมและอาร์เรย์พารามิเตอร์ ที่จริงแล้ว ภาษาโปรแกรมที่มีระบบชนิดข้อมูลแบบไดนามิกมักจะมี variant เป็น ชนิดข้อมูล เดียวที่ใช้ได้สำหรับตัวแปร

หนึ่งในความเปลี่ยนแปลงที่สำคัญในVisual Basic .NETซึ่งเป็นภาษา .NET คือ การแทนที่ประเภท Variant ด้วย ประเภท Object ของ .NET แม้จะมีแนวคิดที่คล้ายคลึงกัน แต่ก็มีความแตกต่างที่สำคัญ และไม่มีการแปลงโดยตรงระหว่างสองประเภทนี้ สำหรับการแปลง ซึ่งอาจจำเป็นในกรณีที่โค้ด Visual Basic .NET ทำงานร่วมกับอ็อบเจ็กต์ COM ของ Visual Basic 6 วิธีการปกติคือการใช้. NET marshalling

ตัวอย่าง

ใน Visual Basic ตัวแปรชื่อ A สามารถประกาศได้ทั้งแบบชัดเจนหรือแบบไม่ชัดเจน:

ดิมเอดิมเอในรูปแบบต่างๆ

ในภาษา Delphiตัวแปรประเภท A จะถูกประกาศด้วยวิธีดังต่อไปนี้:

var A : variant ;

รูปแบบ

ตัวแปรชนิด Variant ซึ่งเรียกโดยย่อว่า "Variant" ตามที่กำหนดไว้ใน Visual Basic ต้องการพื้นที่จัดเก็บ 16 ไบต์ และมีโครงสร้างดังนี้:

ออฟเซ็ตขนาดคำอธิบาย
02ค่าที่ส่งคืนโดย VarType; ระบุประเภทของข้อมูลที่ตัวแปรนั้นบรรจุอยู่
26ไบต์ที่สงวนไว้ ใช้สำหรับชนิดข้อมูล VT_DECIMAL เท่านั้น
8สูงสุด 8ข้อมูลที่ตัวแปรนั้นบรรจุอยู่

ประเภท

ต่อไปนี้เป็นตัวอย่างของรูปแบบต่างๆ ที่อาจพบได้ใน Visual Basic ในภาษาโปรแกรมอื่นๆ ก็อาจมีรูปแบบอื่นๆ อีกด้วย

วาร์ไทป์ เฮกซ์ ประเภทโพรพวาเรียนต์ สมาชิกโพรพวาเรียนต์ชื่อประเภทข้อมูลไบต์ประเภท C และ C++
0 0x00 VT_EMPTY ไม่มีว่าง1
1 0x01 VT_NULL ไม่มีนัลล์2
2 0x02 VT_I2 ไอวัลจำนวนเต็ม2A00สั้น
3 0x03 VT_I4 ลวาลยาว2A000000ยาว
4 0x04 วีทีอาร์4 ฟลตวัลเดี่ยว00002842ลอย
5 0x05 VT_R8 dblValสองเท่า0000000000004540สองเท่า
6 0x06 VT_CY ไซวัลสกุลเงินA068060000000000โครงสร้าง CY
7 0x07 VT_DATE วันที่วันที่00000000C0D5E140วันที่ (สองเท่า)
8 0x08 VT_BSTR บีสตรวัลสตริงxxxxxxxx(BSTR):(OLECHAR *):(WCHAR *):( wchar_t *)
9 0x09 VT_DISPATCH pdispVal
10 0x0a VT_ERROR รหัสข้อผิดพลาด2A000A80HRESULT (long int)
11 0x0b VT_BOOL บูลวัลบูลีนFFFFVARIANT_BOOL (short)
12 0x0c VT_VARIANT pvarVal ตัวแปร ตัวแปร
13 0x0d VT_UNKNOWN punkVal ไม่มีอะไร400000000 ไม่ทราบ *
14 0x0e VT_DECIMAL เดควาล ทศนิยม
16 0x10 VT_I1 ซีวาล ไบต์ ชาร์
17 0x11 VT_UI1 บีวาลไบต์2Aไบต์ (อักขระไม่มีเครื่องหมาย)
18 0x12 VT_UI2 uiVal WORD (ชื่อย่อไม่ระบุ)
19 0x13 VT_UI4 ulVal ดีเวิร์ด (จำนวนเต็มไม่ระบุเครื่องหมาย)
20 0x14 VT_I8 ค่า h
21 0x15 VT_UI8 เอ่อวัล
22 0x16 VT_INT ค่าอินท์
23 0x17 VT_UINT uintVal
24 0x18 VT_VOID
25 0x19 VT_HRESULT ขาด380020004 HRESULT (long int)
26 0x1a VT_PTR
27 0x1b VT_SAFEARRAY พาร์เรย์
28 0x1c วีที_แคร์เรย์
29 0x1d VT_USERDEFINED
30 0x1e VT_LPSTR pszVal
31 0x1f VT_LPWSTR pwszVal
36 0x24 VT_RECORD
37 0x25 VT_INT_PTR พินท์วัล
38 0x26 VT_UINT_PTR puintVal
8192 0x2000 VT_ARRAY พาร์เรย์
9 การอ้างอิงวัตถุ5xxxxxxxxไม่ทราบ *
  • 1.ประเภทของตัวแปรที่ยังไม่ได้เริ่มต้นใช้งาน
  • 2.ประเภทของค่า NULL ในฐานข้อมูล คือ ค่าที่ไม่ได้เริ่มต้นใช้งาน และไม่เทียบเท่ากับตัวชี้ว่าง (null pointer ) ในภาษา C++
  • 3.ข้อผิดพลาด "ขาดพารามิเตอร์" เรียกว่า "ไม่พบพารามิเตอร์" (Missing arguments)
  • 4.ประเภทของวัตถุถูกตั้งค่าเป็นค่าว่าง (null reference)
  • 5. TypeName จะส่งคืนชื่อคลาสของวัตถุที่บรรจุอยู่ ข้อมูลจะเป็น ตัวชี้ อินเทอร์เฟซ กล่าวคือ ตัวชี้ไปยังตัวชี้ไปยังตารางเมธอดเสมือน (ซึ่งเป็นอาร์เรย์ของตัวชี้ฟังก์ชัน)

การใช้งานทั่วไป

คอลเลกชัน

คลาสCollectionในOLE Automationสามารถจัดเก็บรายการที่มีชนิดข้อมูลต่างกันได้ เนื่องจากไม่สามารถทราบชนิดข้อมูลของรายการเหล่านี้ได้ในระหว่างการคอมไพล์ ดังนั้นวิธีการเพิ่มรายการและดึงรายการจากคอลเลกชันจึงใช้ตัวแปรแบบ Variant หากFor Eachใช้โครงสร้างนี้ใน Visual Basic ตัวแปร Iterator ต้องเป็นชนิดข้อมูล Object หรือ Variant

การเรียกใช้เมธอดส่งคำสั่ง

ใน OLE Automation IDispatchอินเทอร์เฟซจะถูกใช้เมื่อไม่สามารถทราบคลาสของวัตถุได้ล่วงหน้า ดังนั้นเมื่อเรียกเมธอดบนวัตถุดังกล่าว ประเภทของอาร์กิวเมนต์และค่าที่ส่งคืนจะไม่ทราบในระหว่างการคอมไพล์ อาร์กิวเมนต์จะถูกส่งผ่านเป็นอาร์เรย์ของตัวแปร และเมื่อการเรียกเสร็จสมบูรณ์ ตัวแปรนั้นจะถูกส่งคืน

พารามิเตอร์เสริม

ใน Visual Basic เราสามารถประกาศให้พารามิเตอร์ของโปรแกรมเป็นตัวเลือกได้โดยการใส่คำหลัก `optional` ไว้ข้างหน้า เมื่อละเว้นพารามิเตอร์ Visual Basic จะส่งค่าพิเศษที่เรียกว่า `Missing`Optional ในตารางด้านบน ไปยังโปรแกรมเพื่อระบุว่าพารามิเตอร์นั้นหายไป เนื่องจากค่าดังกล่าวอาจเป็นค่าที่กำหนดไว้หรือค่าพิเศษ จึงต้องใช้ตัวแปร (variant)

ฟังก์ชันGetText ( ค่าByVal เสริมIndex ) เป็นสตริงถ้าIsMissing ( Index ) แล้วGetText = Item ( CurrentItem ) มิฉะนั้นGetText = Item ( Index ) สิ้นสุดเงื่อนไขสิ้นสุดฟังก์ชัน

ในทำนองเดียวกัน คีย์เวิร์ดนี้ParamArrayสามารถใช้เพื่อส่งผ่านอาร์กิวเมนต์ทั้งหมดที่ตามมาในอาร์เรย์แบบแปรผันได้

ดูเพิ่มเติม

  • C++ Boost.Variant
  • https://msdn.microsoft.com/en-ca/library/cc237865.aspx
  • https://msdn.microsoft.com/en-us/library/windows/desktop/aa380072(v=vs.85).aspx
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Variant_type_(COM)&oldid=1300930243 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ประเภทตัวแปร (COM)

Variant เป็น ชนิดข้อมูล ในภาษาโปรแกรมบางภาษา โดยเฉพาะ Visual Basic , OCaml , [ 1 ] Delphi และ C++ เมื่อใช้ Component Object Model เป็นการนำ แนวคิดที่มีชื่อเดียวกันมา ใช้ ใน...

ตัวอย่าง

ใน Visual Basic ตัวแปรชื่อ A สามารถประกาศได้ทั้งแบบชัดเจนหรือแบบไม่ชัดเจน:

รูปแบบ

ตัวแปรชนิด Variant ซึ่งเรียกโดยย่อว่า "Variant" ตามที่กำหนดไว้ใน Visual Basic ต้องการพื้นที่จัดเก็บ 16 ไบต์ และมีโครงสร้างดังนี้:

ประเภท

ต่อไปนี้เป็นตัวอย่างของรูปแบบต่างๆ ที่อาจพบได้ใน Visual Basic ในภาษาโปรแกรมอื่นๆ ก็อาจมีรูปแบบอื่นๆ อีกด้วย