第一步先创建ATL项目


第二步创建COM组件,并定义组件名


第三步,在组件中创建方法。这里接口方法是对外的,处理函数只是对内的

添加了无参数方法STDMETHODIMP CAppOpt::StartApp(void)
这是对外的,以下简单的做了提示消息处理
STDMETHODIMP CAppOpt::StartApp(void)
{
MessageBox("谢谢使用我这个组件");
return S_OK;
}
编译成功了,但是这是不安全的,不能直接给ASP使用,还要在头文件中添加以下代码
class ATL_NO_VTABLE CAppOpt :
public IAppOpt,
public IPersistStreamInitImpl<CAppOpt>,
public IOleControlImpl<CAppOpt>,
public IOleObjectImpl<CAppOpt>,
public IOleInPlaceActiveObjectImpl<CAppOpt>,
public IViewObjectExImpl<CAppOpt>,
public IOleInPlaceObjectWindowlessImpl<CAppOpt>,
public IPersistStorageImpl<CAppOpt>,
public ISpecifyPropertyPagesImpl<CAppOpt>,
public IQuickActivateImpl<CAppOpt>,
public IDataObjectImpl<CAppOpt>,
public IProvideClassInfo2Impl<&__uuidof(CAppOpt), NULL>,
public CComControl<CAppOpt>
{
public:
CAppOpt()
{
}
DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE |
OLEMISC_ACTSLIKELABEL |
OLEMISC_CANTLINKINSIDE |
OLEMISC_INSIDEOUT |
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST
)
修改为
class ATL_NO_VTABLE CAppOpt :
public IAppOpt,
public IPersistStreamInitImpl<CAppOpt>,
public IOleControlImpl<CAppOpt>,
public IOleObjectImpl<CAppOpt>,
public IOleInPlaceActiveObjectImpl<CAppOpt>,
public IViewObjectExImpl<CAppOpt>,
public IOleInPlaceObjectWindowlessImpl<CAppOpt>,
public IPersistStorageImpl<CAppOpt>,
public ISpecifyPropertyPagesImpl<CAppOpt>,
public IQuickActivateImpl<CAppOpt>,
public IDataObjectImpl<CAppOpt>,
public IProvideClassInfo2Impl<&__uuidof(CAppOpt), NULL>,
public CComControl<CAppOpt>
{
public:
CAppOpt()
{
}
BEGIN_CATEGORY_MAP(CAppOpt)
IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
END_CATEGORY_MAP()
DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE |
OLEMISC_ACTSLIKELABEL |
OLEMISC_CANTLINKINSIDE |
OLEMISC_INSIDEOUT |
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST
)
在网页中调用方法
< OBJECT ID="AppOpt" WIDTH=0 HEIGHT=0 CLASSID="CLSID:6C29F2AB-D401-4C74-89D5-2B534063DDC5" VIEWASTEXT> < /OBJECT>
< script language="JavaScript">
AppOpt.StartApp();
< /script >
下载源代码