① 如何從一個 OCX 獲取 IDispatch Excel 或 Word 文檔的
執行步驟的示例
創建名為 OffCntrDisp 的新 MFC ActiveX 控制項向導應用程序。
COleControl 派生類中添加下面的成員變數:
char m_szDocName[512];
IDispatch *m_pDocDisp;
註: m_szDocName 保存包含我們的控制的文檔的名稱並且 m_pDocDisp 是該文檔的 IDispatch 介面。
COleControl 派生類定義中的末尾添加以下項:
// Interface Maps.
protected:
// IoleObject.
BEGIN_INTERFACE_PART(MyOleObject, IOleObject)
INIT_INTERFACE_PART(COffCtlDispCtrl, MyOleObject)
STDMETHOD(SetClientSite)(LPOLECLIENTSITE);
STDMETHOD(GetClientSite)(LPOLECLIENTSITE*);
STDMETHOD(SetHostNames)(LPCOLESTR, LPCOLESTR);
STDMETHOD(Close)(DWORD);
STDMETHOD(SetMoniker)(DWORD, LPMONIKER);
STDMETHOD(GetMoniker)(DWORD, DWORD, LPMONIKER*);
STDMETHOD(InitFromData)(LPDATAOBJECT, BOOL, DWORD);
STDMETHOD(GetClipboardData)(DWORD, LPDATAOBJECT*);
STDMETHOD(DoVerb)(LONG, LPMSG, LPOLECLIENTSITE, LONG, HWND,
LPCRECT);
STDMETHOD(EnumVerbs)(IEnumOLEVERB**);
STDMETHOD(Update)();
STDMETHOD(IsUpToDate)();
STDMETHOD(GetUserClassID)(CLSID*);
STDMETHOD(GetUserType)(DWORD, LPOLESTR*);
STDMETHOD(SetExtent)(DWORD, LPSIZEL);
STDMETHOD(GetExtent)(DWORD, LPSIZEL);
STDMETHOD(Advise)(LPADVISESINK, LPDWORD);
STDMETHOD(Unadvise)(DWORD);
STDMETHOD(EnumAdvise)(LPENUMSTATDATA*);
STDMETHOD(GetMiscStatus)(DWORD, LPDWORD);
STDMETHOD(SetColorScheme)(LPLOGPALETTE);
END_INTERFACE_PART(MyOleObject)
DECLARE_INTERFACE_MAP();
這將重寫您的自定義 MyOleObject 與 IOleObject COleControl 的默認實現。
COleControl 派生類的構造函數中添加以下代碼:
m_pDocDisp = NULL;
緊隨其後 OffCntrDispCtl.cpp 中的以下行:
IMPLEMENT_OLECTLTYPE(COffCntrDispCtrl, IDS_OFFCNTRDISP,
_dwOffCntrDispOleMisc)
添加以下代碼:
BEGIN_INTERFACE_MAP(COffCntrDispCtrl, COleControl)
INTERFACE_PART(COffCntrDispCtrl, IID_IOleObject, MyOleObject)
END_INTERFACE_MAP()
此操作,請在步驟 3 中所做的修改以及覆蓋 COleControl 的 IOleObject。
第 5 步中添加的代碼,下面添加以下代碼:
static char buf[8192];
static void DoMsg(char *msg) {
::MessageBox(NULL, msg, "Message", MB_SETFOREGROUND);
}
static void DoErr(char *msg, long err) {
static char errBuf[8192];
sprintf(errBuf, "%s, Error: %ld (%08lx)", msg, err,err);
::MessageBox(NULL, errBuf, "Error", MB_SETFOREGROUND);
}
這些都是以後用於顯示郵件的有用常式。
將粘貼的所有以下代碼在您的 OffCntrDispCtl.cpp 文件的末尾:
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::SetHostNames(LPCOLESTR
pwApp, LPCOLESTR pwObj)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
// Convert OLESTR into ASCII string.
WideCharToMultiByte(CP_ACP, 0, pwObj, -1, pThis->m_szDocName,
512, NULL, NULL);
// Get IDispatch.
pThis->GetDocDispatch();
// Test it out by getting the document name.
pThis->TestDispatch();
return S_OK;
}
STDMETHODIMP
COffCntrDispCtrl::XMyOleObject::SetClientSite(LPOLECLIENTSITE
pClientSite)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.SetClientSite(pClientSite);
}
STDMETHODIMP
COffCntrDispCtrl::XMyOleObject::SetColorScheme(LPLOGPALETTE plp)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.SetColorScheme(plp);
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::GetMiscStatus(DWORD
dwAspect, DWORD* pdwStatus)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.GetMiscStatus(dwAspect, pdwStatus);
}
STDMETHODIMP
COffCntrDispCtrl::XMyOleObject::EnumAdvise(LPENUMSTATDATA*
ppenumAdvise)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.EnumAdvise(ppenumAdvise);
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::Unadvise(DWORD
dwConnection)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.Unadvise(dwConnection);
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::Advise(LPADVISESINK
pAdvSink, DWORD* pdwConnection)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.Advise(pAdvSink, pdwConnection);
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::GetExtent(DWORD
dwDrawAspect, LPSIZEL lpsizel)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.GetExtent(dwDrawAspect, lpsizel);
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::SetExtent(DWORD
dwDrawAspect, LPSIZEL lpsizel)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.SetExtent(dwDrawAspect, lpsizel);
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::GetUserType(DWORD
dwFormOfType, LPOLESTR* ppszUserType)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.GetUserType(dwFormOfType,
ppszUserType);
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::GetUserClassID(CLSID*
pClsid)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.GetUserClassID(pClsid);
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::IsUpToDate()
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.IsUpToDate();
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::Update()
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.Update();
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::EnumVerbs(LPENUMOLEVERB*
ppenumOleVerb)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.EnumVerbs(ppenumOleVerb);
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::DoVerb(LONG iVerb, LPMSG
lpmsg, LPOLECLIENTSITE pActiveSite, LONG lindex, HWND hwndParent,
LPCRECT lprcPosRect)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.DoVerb(iVerb, lpmsg, pActiveSite,
lindex, hwndParent, lprcPosRect);
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::GetClipboardData(DWORD
dwReserved, LPDATAOBJECT *ppDataObject)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.GetClipboardData(dwReserved,
ppDataObject);
}
STDMETHODIMP
COffCntrDispCtrl::XMyOleObject::InitFromData(LPDATAOBJECT
pDataObject, BOOL fCreation, DWORD dwReserved)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.InitFromData(pDataObject, fCreation,
dwReserved);
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::GetMoniker(DWORD
dwAssign, DWORD dwWhichMoniker, LPMONIKER *ppmk)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.GetMoniker(dwAssign, dwWhichMoniker,
ppmk);
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::SetMoniker(DWORD
dwWhichMoniker, LPMONIKER pmk)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.SetMoniker(dwWhichMoniker, pmk);
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::Close(DWORD
dwSaveOption)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.Close(dwSaveOption);
}
STDMETHODIMP
COffCntrDispCtrl::XMyOleObject::GetClientSite(LPOLECLIENTSITE*
ppClientSite)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.GetClientSite(ppClientSite);
}
STDMETHODIMP_(ULONG) COffCntrDispCtrl::XMyOleObject::Release()
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.Release();
}
STDMETHODIMP_(ULONG) COffCntrDispCtrl::XMyOleObject::AddRef()
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.AddRef();
}
STDMETHODIMP COffCntrDispCtrl::XMyOleObject::QueryInterface(REFIID
iid, LPVOID* ppvObj)
{
METHOD_MANAGE_STATE(COffCntrDispCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.QueryInterface(iid, ppvObj);
}
這是您的 IOleObject,通常將委託其調用默認 COleControl 的 IOleObject 實現,除 SetHostNames() 之外的所有實現。補漏白,SetHostNames(),並存儲該文檔的名稱插入控制項的位置。
遺憾的是,Microsoft PowerPoint 不能調用此方法,因此,此示例將不會使用該產品。但是,Microsoft Powerpoint 是單個伺服器,因此您可以使用 GetActiveObject() 來唯一獲得 IDispatch 指針。
② vb注冊comdlg32.ocx控制項
注冊控制項其實很簡單。
語句:regsvr32.exe
文件名
就拿COMDLG32.OCX來說吧,,注冊控制項的方法:
1、打開記事本,輸入「regsvr32.exe
COMDLG32.OCX」
2、單擊保存,在文件名那一欄里輸入一個你想要的名字,但注意後綴名一定要是bat,保存路徑選擇在COMDLG32.OCX的路徑裡面,要跟COMDLG32.OCX同路徑。比如說,COMDLG32.OCX的路徑是C:\WINDOWS\System32,你製作的這個文件的路徑也要是C:\WINDOWS\System32。
3、保存完成後,運行你剛剛製作的bat文件,彈出提示說「COMDLG32.OCX
中的
DLLRegisterServer
成功」就代表已經注冊完成了,你就可以使用了。
註:以後你要是還想注冊這個空間的話,你就可以運行這個文件。需要注意的是:此文件必須要與想要注冊的控制項目錄相同時才可以。
你要是還有不明白的地方,可以HI問我。
③ VB製作OCX控制項
利用vb自製ocx控制項
如今OCX控制項在編程中已佔領了很重要的地位,我們可以利用OCX控制項完成一些相當復雜的編程操作。同時OCX控制項還有利於主程序的簡單化、功能的重用、隱藏程序實現細節、便於升級、傳播方便等優點。現在我們可以利用VB 6.0方便地製作出自己的OCX控制項供我們在編程中使用,同時還可以把它送給你周圍喜歡編程的朋友!下面列出製作OCX控制項的步驟:
一:新建OCX
打開VB 6.0選擇新建工程在對話框中選擇ActiveX控制項,打開後會見一空的文檔,這就是OCX控制項的初始界面。想看一看空OCX控制項的效果嗎?選擇「添加工程」選中標准EXE,這時你就可以像調用其它控制項一樣在左邊的工具欄里選擇剛才新建的OCX控制項圖標,放在標準的EXE文檔中看一看有什麼效果!(什麼也沒有!)自然因為剛才的OCX文檔是空的嘛。
二:創建界面
一般我們用VB創建OCX控制項都是在我們的控制項里添加其它的控制項來組合成一個完整的控制項(也可以讓它只完成某種演算法),比如:你可以在上面添加一按鈕、編輯框,這時你再用第一部的方法看一看效果,是不是控制項上多了一個按鈕和一個編輯框。
三:OCX屬性
一個OCX控制項有許多的屬性,比如控制項背景是否透明(BackStyle),控制項是否可以獲得焦點(CanGetFocus)等。這些屬性都可以在控制項的「屬性框」中找到。
四:添加事件
一個控制項有很多事件,如:Click、MouseDown、MouseUp、MouseMove等。要觸發這些事件都需要你加入代碼。在控制項的聲明處加入Public Event Click()就表明該控制項有一「Click」事件。自己編寫的控制項有什麼事件就在聲明處加幾條事件。關於觸發事件是使用「RaiseEvent」語句來完成的,如:RaiseEvent事件名(參數)。
五:用戶屬性
一個控制項應有許多屬性供用戶設置,如:控制項的背景色、控制項要顯示的圖形等。它們通常用Property Get和Property Let兩條語句來完成。前者表示給用戶顯示一個屬性的值,後者表示用戶設置一個屬性的值。
六:保存屬性和讀取屬性
當屬性被用戶更改後需要將該屬性值保存,以便控制項運行時讀取更改後的屬性值。它們分別用ReadProperty和WriteProperty兩種方法來完成。前者表示讀取一個屬性值,後者表示寫入一個屬性值。
好了,一個簡單的OCX控制項製作方法大概就需要以上幾步就可完成。有興趣的朋友不妨一試。
代碼:
Private Sub Command1_Click()
a = Val(Text1.Text)
b = Val(Text2.Text)
Call add(a, b)
End Sub
Private Sub add(ByVal a As Integer, ByVal b As Integer)
Label1.Caption = a + b
End Sub
④ CAD應用程序的組件中發生了未經處理的異常
原因:沖突軟體導致的。解決方法:CMD輸入代碼來解決此問題。
如下參考:
1.打開電腦「開始菜單」,找到「運行」選項,點擊「打開」。