一般来说,推荐在程序入缓册口函数中调用AfxOleInit,调用之后,你庆姿封装的类无需再调用AfxOleInit。
可以尝试用AfxOleGetMessageFilter() != NULL判断OLE是否初始化誉哪绝
随着Internet和Intranet应用的飞速发展,COM(Component Object Model,组件对象模型)以其巨大的潜力渗透到软件学科的各个领域。在Windows *** 作平台下,众多以COM形式提供的组件模块,如DirectX多媒体软件包、OLE DB/ADO数据库组件系统等,极大地丰富了 *** 作系统的功能。由于COM机制允许任意两组件之间相互通信而不必关心是在何种计算机上的何种 *** 作系统下运行,也不用关心组件是使用何种语言编制的,这使COM技术拥有了强大的生命力。尤其是Windows 2000同COM的下一代产品COM+的结合更加紧密,将使COM/COM+技术得到更广泛的应用。本文介绍在VC++ 6.0下编写COM客户程序的三种方法,虽然每一种方法都可以达到使用代码组件的目的,但详细了解并掌握所有方法会为根据具体情况选择适当方法提供更大的余地。为叙述清楚,本文所用的程序框架均为对话框模式的MFC EXE工程。在编程前,首先要确定待 *** 作的代码组件是否已经在系统中注册。如果代码组件没有注册,可以通过Windows\System目录下的regsvr32. exe程序对其进行注册。
COM库函数
利用COM库函数使用代码组件的方法是本文介绍的三种方法中实现起来最麻烦和困难的方法。它要求开发人员必须具有对COM原理的深入理解。该方法实现步骤如下:
1. 首先添加COM初始和终止代码。在应用程序类的初始化实例函数InitInstance()中添加如下代码:
CoInitialize(NULL)
……
CoUnInitialize()
上述语句运行在MFC框架/非MFC框架中,但由于本文程序使用MFC框架,所以也可以利用AfxOleInit()函数对其进行初始化。
2. 然后用#include 语句包含对组件头文件的引用并创建组件对象。在头文件中包含了接口的C++定义以及说明接口ID IID和类ID CLSID的符号化常量。创建工作在初始化对话框函数中进行:
IAccount pAccount=NULL
……
CoCreateInstance(CLSID_Account,
NULL,
CLSCTX_INPROC_SERVER,
IID_Iaccount,
reinterpret_cast (&pAccount))
3. 最后释放组件对象。该工作应在程序退出之前完成,比如在消息WM_CLOSE的响应函数中进行:
if(pAccount!=NULL)
pAccount->Realease()
对该代码组件中的其他功能函数的调用,可以通过组件对象的接口指针pAccount来进行:
……
BSTR bstrResult
PAccount->Post(100,bstrResult)
SysFreeString(bstrResult)
……
由于COM支持类在comdef. h中定义,所以还要包含对该头文件的引用,才可以使程序正常运行。
类向导
通过类向导可以直接阅读组件的类型库,并产生包装类型库中每个接口的类,通过这些类的成员函数可以访问组件接口的方法和属性,与使用ActiveX控件的方法有些类似。
首先添加对COM组件进行初始化的代码。我们可以通过类向导的From a Type Library加入组件的.tlb类型库文件,并从中引入其接口类。在本例中引入的类型库文件中只包含一个桐旅从ColeDispatchDriver派生的组件包装类IAccount。通过包装类的成员,可以了解到组件接口能提供哪些服务,而且可以通过它们访问组件接口的方法和属性。
在初始化对话框函数里用COleDispatchDriver类的CreateDispatch()成员函数创建Account组件对象:
IAccount m_account
……
m_account.CreateDispatch(“ATLSample.Account.1”))
其中ProgID值“ATLSample. Account. 1”可以通过Microsoft Visual Studio Tools 6.0里的OLE View工具查派轮键找到,其前提是该组件已被成功注册过。
释放Account组件对象也可以用COleDispatch-Driver类的ReleaseDispatch()函数来完成。
对于在COM库函数方法中用过尘巧的Post方法可用下述方法调用:
CString str=m_account. Post(100)
可以看出此种方法实现了同样的功能但实现起来要比上一种方法简单些,而且对理解COM的要求也不高。
#import 指令
#import 指令方法非常简便。对于类型库文件采用该指令是非常合适的,因为不管是调试版本还是发行版本,对于类型库文件而言,其路径是固定的。#import指令在执行时将会从待引入的类型库中提取出两个文件:一个.tlh文件和一个.tli文件,后者仅仅是包装类的函数实现,而前者则包含了许多有关的重要信息。智能接口指针也在其中定义:
_COM_SMARTPTR_TYPEDEF(IAccount,__uuidof(IAccount))
在实际编译时,编译器会将其展开成下述代码,并通过_com_ptr_t模板类为接口IAccount定义一个智能指针IAccountPtr。之所以说其是智能指针,是由于它替代IAccount时,会自动处理CoCreate-Instance和所有的 IUnknow方法,使用起来非常方便:
typedef _com_ptr_t<_com_IIID<Iaccount,__uuidof(IAccount)>>IAccountPtr
由于有了智能指针,我们就可以调用_com_ptr_t模板类的CreateInstance()函数来完成对接口指针的创建工作:
IAccountPtr m_account=NULL
m_account.CreateInstance(__uuidof(Account))
由于在生成的.tlh文件中包含结构声明和declspec(uuid(“”))声明,所以在这里可以很方便地用__uuidof(Account)获取接口的GUID。declspec(uuid(“”))声明将GUID和类及每个接口联系起来,允许开发人员以uuidof *** 作符来获取类和接口的GUID。
需要特别指出的是: 为防止原有代码和新引入的代码之间发生名字冲突,编译器会定义一个由类型库名称标识的命名空间,并在其中声明的任何名称内附加一个标识符。而为了避免指定命名空间标识,可以在#import 语句后加上using namespace,而且还可以用rename_namespace来改变命名空间。比如在本例中可以进行如下处理:
#import “Account.tlb” rename_namespace(“AccountDriver”)
using namespace AccountDriver
这样,在使用智能接口指针IAccountPtr时只需定义即可:
IAccountPtr m_account
至于对代码组件中的函数和属性的调用则同前两种方法一样,也是通过m_account来完成访问的。由于_com_ptr_t模板类和智能指针的引入,#import 指令方法是这三种方法中使用COM组件最简单的一种。
网上找的,来源http://thisisxingmeng.blog.163.com/blog/static/4211528620087231197613/BCG中有很多控件,其中属性配置对话框功能很强大,为了单独使用BCG 的属芦陵性配置对话框,需要对代码有一些修改,下面是陪启戚具体步骤如下:
1、 在Stdafx.h中增加BCG的头文件,添加以后在项目使用BCG的任何部分就不在需要增加头文件,代码如下:
#include <BCGCBProInc.h>
2、 修改项目从CWinApp的继承关系,增加从CBCGPWorkspace的继承,如果不增加,在使用BCG的过程中会有一些问题,代码如下:
class CTestControlConfigApp : public CWinApp,
public CBCGPWorkspace
3、 在CWinApp的子类的InitInstance函数中增加如下语句:
AfxOleInit() // 进行BCG使用控件的初始化
4、 最后为了防止BCG资源泄露,需要在CWinApp的子类中的ExitInstance函数中增加如下语句:
BCGCBProCleanUp ()
5、最后,就可以使用属性配置类了
第一步,声明一旁敏个变量CBCGPPropList m_wndPropList
第二步,在OnCreate或者OnInitDialog函数中初始化,例子代码如下:
CRect rect(159,29,468,376)
if (!m_wndPropList.Create (WS_VISIBLE | WS_CHILD, rect, this, 2))
{
TRACE0("Failed to create Properies Grid \n")
return -1 // fail to create
}
m_wndPropList.EnableHeaderCtrl (FALSE)
m_wndPropList.EnableDesciptionArea ()
m_wndPropList.SetVSDotNetLook ()
m_wndPropList.MarkModifiedProperties ()
CBCGPProp* pGroup1 = new CBCGPProp (_T("Appearance"))
pGroup1->AddSubItem (new CBCGPProp (_T("3D Look"), (_variant_t) false,
_T("Specifies the dialog's font will be nonbold and controls will have a 3D border")))
CBCGPProp* pProp = new CBCGPProp (_T("Border"), _T("Dialog Frame"),
_T("One of: None, Thin, Resizable, or Dialog Frame"))
pProp->AddOption (_T("None"))
pProp->AddOption (_T("Thin"))
pProp->AddOption (_T("Resizable"))
pProp->AddOption (_T("Dialog Frame"))
pProp->AllowEdit (FALSE)
pGroup1->AddSubItem (pProp)
pGroup1->AddSubItem (new CBCGPProp (_T("Caption"), (_variant_t) _T("About BCGProTest"),
_T("Specifies the text that will be displayed in the dialog's title bar")))
m_wndPropList.AddProperty (pGroup1)
CBCGPProp* pSize = new CBCGPProp (_T("Window Size"), 0, TRUE)
pProp = new CBCGPProp (_T("Height"), (_variant_t) 250l,
_T("Specifies the dialog's height"))
pProp->EnableSpinControl (TRUE, 0, 1000)
pSize->AddSubItem (pProp)
pProp = new CBCGPProp ( _T("Width"), (_variant_t) 150l,
_T("Specifies the dialog's width"))
pProp->EnableSpinControl ()
pSize->AddSubItem (pProp)
m_wndPropList.AddProperty (pSize)
CBCGPProp* pGroup2 = new CBCGPProp (_T("Font"))
LOGFONT lf
CFont* font = CFont::FromHandle ((HFONT) GetStockObject (DEFAULT_GUI_FONT))
font->GetLogFont (&lf)
lstrcpy (lf.lfFaceName, _T("Arial"))
pGroup2->AddSubItem (new CBCGPFontProp (_T("Font"), lf, CF_EFFECTS | CF_SCREENFONTS, _T("Specifies the default font for the dialog")))
pGroup2->AddSubItem (new CBCGPProp (_T("Use System Font"), (_variant_t) true, _T("Specifies that the dialog uses MS Shell Dlg font")))
m_wndPropList.AddProperty (pGroup2)
CBCGPProp* pGroup3 = new CBCGPProp (_T("Misc"))
pProp = new CBCGPProp (_T("(Name)"), _T("IDD_ABOUT_BOX (dialog)"))
pProp->Enable (FALSE)
pGroup3->AddSubItem (pProp)
CBCGPColorProp* pColorProp = new CBCGPColorProp (_T("Window Color"), RGB (210, 192, 254), NULL, _T("Specifies the default dialog color"))
pColorProp->EnableOtherButton (_T("Other..."))
pColorProp->EnableAutomaticButton (_T("Default"), ::GetSysColor (COLOR_3DFACE))
pGroup3->AddSubItem (pColorProp)
static TCHAR BASED_CODE szFilter[] = _T("Icon Files (*.ico)|*.ico|All Files (*.*)|*.*||")
pGroup3->AddSubItem (new CBCGPFileProp (_T("Icon"), TRUE, _T(""), _T("ico"), 0, szFilter, _T("Specifies the dialog icon")))
pGroup3->AddSubItem (new CBCGPFileProp (_T("Folder"), _T("c:\\")))
COleDateTime date = COleDateTime::GetCurrentTime ()
pGroup3->AddSubItem (new CBCGPDateTimeProp (_T("Date"), date,
_T("Set a date"), 0, CBCGPDateTimeCtrl::DTM_DATE))
pGroup3->AddSubItem (new CBCGPDateTimeProp (_T("Time"), date,
_T("Set a time"), 0, CBCGPDateTimeCtrl::DTM_TIME))
m_wndPropList.AddProperty (pGroup3)
CBCGPProp* pGroup4 = new CBCGPProp (_T("Hierarchy"))
CBCGPProp* pGroup41 = new CBCGPProp (_T("First sub-level"))
pGroup4->AddSubItem (pGroup41)
CBCGPProp* pGroup411 = new CBCGPProp (_T("Second sub-level"))
pGroup41->AddSubItem (pGroup411)
pGroup411->AddSubItem (new CBCGPProp (_T("Item 1"), (_variant_t) _T("Value 1"),
_T("This is a description")))
pGroup411->AddSubItem (new CBCGPProp (_T("Item 2"), (_variant_t) _T("Value 2"),
_T("This is a description")))
pGroup411->AddSubItem (new CBCGPProp (_T("Item 3"), (_variant_t) _T("Value 3"),
_T("This is a description")))
pGroup4->Expand (FALSE)
m_wndPropList.AddProperty (pGroup4)
m_wndPropList.ShowWindow(SW_SHOW)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)