อินเทอร์เฟซสำหรับIOleCommandTargetทำให้วัตถุและคอนเทนเนอร์ของตนเพื่อส่งคำสั่งกัน ตัวอย่างเช่น แถบเครื่องมือของวัตถุอาจประกอบด้วยปุ่มสำหรับคำสั่งเช่นพิมพ์ตัวอย่างก่อนพิมพ์บันทึก Newและการย่อ/ขยาย ถ้าวัตถุเช่นถูกฝังอยู่ในคอนเทนเนอร์ที่สนับสนุนIOleCommandTargetวัตถุไม่สามารถเปิดการใช้งานของปุ่ม และส่งต่อคำสั่งคอนเทนเนอร์สำหรับการประมวลผลเมื่อผู้ใช้คลิกเหล่านั้น ถ้าที่บรรจุต้องวัตถุฝังตัวเพื่อพิมพ์ตัวเอง มันอาจทำให้คำขอนี้ โดยการส่งคำสั่งผ่านทางอินเทอร์เฟซสำหรับIOleCommandTargetของวัตถุฝังตัว?
IOleCommandTargetเป็นอินเทอร์เฟซ Automation เหมือนที่มันถูกใช้ โดยไคลเอนต์เรียกเมธอดบนเซิร์ฟเวอร์ อย่างไรก็ตาม ใช้IOleCommandTargetจะบันทึกค่าใช้จ่ายในการทำการโทรศัพท์ผ่านอินเทอร์เฟซที่ทำงานอัตโนมัติเนื่องจากโปรแกรมเมอร์ไม่จำเป็นต้องใช้วิธีการInvokeแพงโดยทั่วไปของIDispatch?
ใน MFC อินเทอร์เฟซสำหรับIOleCommandTargetถูกใช้ โดยเอกสารที่ใช้งานเซิร์ฟเวอร์ให้คอนเทนเนอร์ของเอกสารที่ใช้งานในการส่งคำสั่งไปยังเซิร์ฟเวอร์ เอกสารที่ใช้งานเซิร์ฟเวอร์คลาสCDocObjectServerItemใช้แผนที่ติดต่อ MFC (ดูTN038: MFC/OLE IUnknown Implementation) การใช้อินเทอร์เฟซสำหรับIOleCommandTarget?
IOleCommandTargetยังมีการใช้งานในชั้นเรียนCOleFrameHook COleFrameHookคือคลาส MFC อย่างชาญฉลาดที่ใช้การทำงานของหน้าต่างเฟรมของคอนเทนเนอร์ที่แก้ไขในสถาน COleFrameHookยังใช้ MFC อินเทอร์เฟซสำหรับแผนที่การใช้อินเทอร์เฟซสำหรับIOleCommandTarget การใช้งานCOleFrameHookของIOleCommandTargetส่งต่อคำสั่งของ OLE เพื่อCOleDocObjectItem-มาคอนเทนเนอร์ของเอกสารที่ใช้งาน นี้ช่วยให้คอนเทนเนอร์เอกสารใด ๆ MFC ที่ใช้งานอยู่เพื่อที่ได้รับข้อความจากเอกสารที่ใช้งานอยู่ด้านเซิร์ฟเวอร์?
MFC OLE สั่ง Maps
MFC นักพัฒนาสามารถใช้ประโยชน์จากIOleCommandTargetโดยใช้ MFC OLE สั่งแผนที่ OLE แผนที่คำสั่งได้เช่นข้อความแมปได้เนื่องจากคุณสามารถใช้เพื่อแมป OLE สั่งให้ฟังก์ชันของสมาชิกของชั้นที่ประกอบด้วยการแมปคำสั่ง เพื่อทำให้งานนี้ ทำแมโครในแผนที่คำสั่งเพื่อระบุ OLE คำสั่งกลุ่มของคำสั่งที่คุณต้องการจัดการ คำสั่ง OLE และ ID ของคำสั่ง WM_COMMANDข้อความที่จะส่งเมื่อได้รับคำสั่ง OLE MFC ยังมีตัวเลขของแมโครที่กำหนดไว้ล่วงหน้าสำหรับคำสั่งมาตรฐานของ OLE สำหรับรายการของ OLE มาตรฐาน คำสั่งที่ถูกออกแบบสำหรับใช้กับโปรแกรมประยุกต์ Microsoft Office ดูการแจง OLECMDID นับ ซึ่งกำหนดไว้ใน docobj.h?
เมื่อได้รับคำสั่ง OLE โดยโปรแกรมประยุกต์ MFC ที่ประกอบด้วยแผนผังการสั่งการ OLE, MFC พยายามค้นหา ID คำสั่งและคำสั่งกลุ่มสำหรับคำสั่งที่ร้องขอในแผนที่ OLE คำสั่งของโปรแกรมประยุกต์ ถ้าพบตรงกันWM_COMMANDข้อความถูกส่งไปยังโปรแกรมประยุกต์ที่ประกอบด้วยการแมปสั่ง ด้วย ID ของคำสั่งที่ร้องขอ (ดูคำอธิบายของON_OLECMDด้านล่าง) ด้วยวิธีนี้ OLE คำสั่งที่ส่งไปยังโปรแกรมประยุกต์จะเปิดลงในข้อความของWM_COMMANDโดย MFC ข้อความWM_COMMANDแล้วกำหนดเส้นทางผ่านการแมปข้อความของโปรแกรมประยุกต์ที่ใช้มาตรฐาน MFC คำสั่งการกำหนดเส้นทางสถาปัตยกรรม?
แตกต่างจากข้อความแผนที่ MFC OLE สั่งแผนที่ไม่สนับสนุน โดย ClassWizard MFC นักพัฒนาต้องเพิ่มการสนับสนุน OLE สั่งแผนผังและ OLE สั่งแผนผังรายการด้วยตนเอง OLE คำสั่งที่คุณสามารถเพิ่มแผนที่ MFC ที่ใช้งานอยู่เอกสารเซิร์ฟเวอร์ในชั้นใด ๆ ที่อยู่ในห่วงโซ่การกำหนดเส้นทางข้อความWM_COMMANDในขณะเอกสารที่ใช้งาน อยู่ในสถานที่ทำงานอยู่ในที่บรรจุ เหล่านี้ชั้นรวมชั้นของโปรแกรมประยุกต์ที่ได้รับมาจากCWinApp, CView, CDocumentและCOleIPFrameWnd ในเอกสารที่ใช้งานคอนเทนเนอร์ OLE สั่งแผนที่เท่านั้นสามารถเพิ่มCOleDocObjectItem-มาคลา ยัง ในคอนเทนเนอร์ของเอกสารที่ใช้งาน ข้อความWM_COMMANDจะเท่านั้นจะอบรมการแมปข้อความในCOleDocObjectItem-มาคลาส?
OLE คำสั่งแมโครการแมป
ใช้แมโครในดังต่อไปนี้เพื่อเพิ่มฟังก์ชันการทำงานของคำสั่งแผนผังของคลาส:
VFR (DECLARE_OLECMD_MAP)
แมโครนี้ไปประกาศคลาส (โดยทั่วไปในไฟล์ส่วนหัว) ของชั้นที่ประกอบด้วยการแมปคำสั่ง?
BEGIN_OLECMD_MAP (theClass, baseClass)
theClass
ชื่อของระดับชั้นที่ประกอบด้วยการแมปคำสั่ง?
baseClass
ชื่อของระดับชั้นของชั้นที่ประกอบด้วยแผนที่คำสั่งพื้นฐาน?
แมโครนี้ทำเครื่องหมายจุดเริ่มต้นของแผนที่คำสั่ง ใช้แมโครนี้ในแฟ้มใช้งานสำหรับชั้นเรียนที่ประกอบด้วยแผนที่คำสั่ง?
END_OLECMD_MAP()
แมโครนี้ทำเครื่องหมายส่วนท้ายของแผนที่คำสั่ง ใช้แมโครนี้ในแฟ้มใช้งานสำหรับชั้นเรียนที่ประกอบด้วยการแมปสั่ง แมโครนี้จะต้องปฏิบัติตาม BEGIN_OLECMD_MAP แมโคร?
ON_OLECMD (pguid, olecmdid รหัส)
pguid
ชี้การ GUID ของกลุ่มคำสั่งคำสั่ง OLE พารามิเตอร์นี้เป็นNULLสำหรับคำสั่งกลุ่มมาตรฐานของ OLE?
olecmdid
OLE ID ของคำสั่งเพื่อสามารถเรียกคำสั่งได้?
รหัส
ID ของข้อความที่จะส่งไปยังโปรแกรมประยุกต์ที่ประกอบด้วยการแมปคำสั่งเมื่อเรียกคำสั่งนี้ OLE WM_COMMAND?
ใช้ ON_OLECMD คำสั่งแมโครในแผนที่คำสั่งเพิ่มรายการสำหรับ OLE คุณต้องการจัดการ เมื่อได้รับคำสั่ง OLE พวกเขาจะถูกแปลงเป็นข้อความที่ระบุของWM_COMMANDและส่งผ่านมาทางการแมปข้อความของโปรแกรมประยุกต์โดยใช้มาตรฐาน MFC กำหนดคำสั่งเส้นทางสถาปัตยกรรม?
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงวิธีการเพิ่มขีดความสามารถในการจัดการคำสั่ง OLE เซิร์ฟเวอร์ MFC ที่ใช้งานอยู่เอกสารการจัดการ คำสั่งOLECMDID_PRINT OLE ตัวอย่างนี้สมมติว่า คุณใช้ AppWizard ในการสร้างโปรแกรมประยุกต์ MFC ที่เป็นเอกสารที่ใช้งานเซิร์ฟเวอร์?
DECLARE_OLECMD_MAP แมโครเพื่อการประกาศคลาส?หมายเหตุnbsp ใช้CView-คลาสได้มาเนื่องจากเป็นหนึ่งในคลาสที่ในเอกสารที่ใช้งานเซิร์ฟเวอร์ที่อยู่ในห่วงโซ่การกำหนดเส้นทางข้อความWM_COMMAND(&N)?
คลา CMyServerView: CView สาธารณะ
{
ได้รับการป้องกัน: / / สร้างจากอนุกรมเท่านั้น
CMyServerView()
DECLARE_DYNCREATE(CMyServerView)
DECLARE_OLECMD_MAP()
. . .
}
BEGIN_OLECMD_MAP และ END_OLECMD_MAP แมโคร:BEGIN_OLECMD_MAP (CMyServerView, CView)
END_OLECMD_MAP()
BEGIN_OLECMD_MAP (CMyServerView, CView)
ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
END_OLECMD_MAP()
หมายเหตุว่า หนึ่งในมาตรฐาน OLE คำสั่งแม กำหนดไว้ใน afxdocob.h สามารถใช้ในตำแหน่งของแมโคON_OLECMDเนื่องจากOLECMDID_PRINTเป็นคำสั่งรหัสมาตรฐานของ OLE แมโคON_OLECMD_PRINTจะทำงานเป็นแมโคON_OLECMDข้างเดียวกัน?
เมื่อโปรแกรมประยุกต์เป็นคอนเทนเนอร์ส่งเซิร์ฟเวอร์นี้คำสั่งOLECMDID_PRINTผ่านอินเทอร์เฟซการIOleCommandTargetของเซิร์ฟเวอร์ MFC พิมพ์คำสั่งจัดการจะสามารถเรียกใน server สาเหตุของเซิร์ฟเวอร์แอพลิเคชันการพิมพ์ รหัสของคอนเทนเนอร์ที่ใช้งานอยู่เอกสารที่เรียกใช้คำสั่งพิมพ์ที่เพิ่มเข้ามาในตอนนั้นจะมีลักษณะดังนี้:
โมฆะ CContainerCntrItem::DoOleCmd()
{
IOleCommandTarget * pCmd = NULL
Hresult ใน hr = E_FAIL
OLECMD ocm = {OLECMDID_PRINT, 0 };
hr = m_lpObject-gtQueryInterface (IID_IOleCommandTarget, reinterpret_cast < โมฆะ ** >(&pCmd));
if(FAILED(hr))
กลับ
hr = pCmd - > QueryStatus (NULL, 1, & ocm, NULL);
if(SUCCEEDED(hr) & & (ocm.cmdf และ OLECMDF_ENABLED))
{
//Command มีพร้อมใช้งาน และเปิดใช้งานดังนั้น เรียกว่า
COleVariant vIn
COleVariant vOut
hr = pCmd - > Exec (NULL, OLECMDID_PRINT
OLECMDEXECOPT_DODEFAULT, & vIn, & vOut);
ASSERT(SUCCEEDED(hr))
}
pCmd - > Release()
}
หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)