① 如何从一个 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.打开电脑“开始菜单”,找到“运行”选项,点击“打开”。