怎么将非可视化的组件封装为Activex控件?急求
呆瓜西西 2016-08-03 05:21:33 需要将一非可视化的控件(和TTable功能类似)封装为Activex控件。
(这里我是模仿这个教程做的http://blog.csdn.net/jaminwm/article/details/463953)
对C++builder不熟悉,自己摸索着弄。按照搜索的例子,模仿着实验将TTable封装为Activex控件,步骤如下:
⑴打开bcb6,打开File/New/ActiveX项目页,选择ActiveX Library;
⑵继续添加,打开File/New/ActiveX属性页,选择Automation Object,命名为TMyTable
我不知道怎么讲TTable类封装这里边。
希望能帮助看看,实现具体的封装方法!
在TMyTableImpl.h下,我原本想,让这个类直接继承TTable类,但是不行
TMyTableImpl.h文件:
// MYTABLEIMPL.H : Declaration of the TMyTableImpl
#ifndef MyTableImplH
#define MyTableImplH
#define ATL_APARTMENT_THREADED
#include <atl\atlvcl.h>
#include "Project1_TLB.H"
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <DB.hpp>
#include <DBTables.hpp>
/////////////////////////////////////////////////////////////////////////////
// TMyTableImpl Implements IMyTable, default interface of MyTable
// ThreadingModel : Apartment
// Dual Interface : TRUE
// Event Support : FALSE
// Default ProgID : Project1.MyTable
// Description :
/////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE TMyTableImpl :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<TMyTableImpl, &CLSID_MyTable>,
public IDispatchImpl<IMyTable, &IID_IMyTable, &LIBID_Project1>
{
public:
TMyTableImpl()
{
}
// Data used when registering Object
//
DECLARE_THREADING_MODEL(otApartment);
DECLARE_PROGID("Project1.MyTable");
DECLARE_DESCRIPTION("");
// Function invoked to (un)register object
//
static HRESULT WINAPI UpdateRegistry(BOOL bRegister)
{
TTypedComServerRegistrarT<TMyTableImpl>
regObj(GetObjectCLSID(), GetProgID(), GetDescription());
return regObj.UpdateRegistry(bRegister);
}
BEGIN_COM_MAP(TMyTableImpl)
COM_INTERFACE_ENTRY(IMyTable)
COM_INTERFACE_ENTRY2(IDispatch, IMyTable)
END_COM_MAP()
// IMyTable
public:
STDMETHOD(set_Active(VARIANT_BOOL Param1));
STDMETHOD(set_DatabaseName(BSTR Param1));
STDMETHOD(Open());
STDMETHOD(Close());
STDMETHOD(set_TableName(BSTR Param1));
STDMETHOD(get_Active(VARIANT_BOOL* Value));
private:
TTable* m_Table;
};
#endif //MyTableImplH
TMyTableImpl.cpp文件
// MYTABLEIMPL : Implementation of TMyTableImpl (CoClass: MyTable, Interface: IMyTable)
#include <vcl.h>
#pragma hdrstop
#include <atl\atlvcl.h>
#include "MYTABLEIMPL.H"
/////////////////////////////////////////////////////////////////////////////
// TMyTableImpl
#pragma package(smart_init)
STDMETHODIMP TMyTableImpl::set_Active(VARIANT_BOOL Param1)
{
try
{
//m_Table->Active = Param1;
m_Table->Active = Param1;
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyTable);
}
return S_OK;
};
STDMETHODIMP TMyTableImpl::set_DatabaseName(BSTR Param1)
{
try
{
//m_Table->DatabaseName = Param1;
m_Table->DatabaseName = "db.mdb";
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyTable);
}
return S_OK;
};
STDMETHODIMP TMyTableImpl::Open()
{
m_Table->Open();
}
STDMETHODIMP TMyTableImpl::Close()
{
m_Table->Close();
}
STDMETHODIMP TMyTableImpl::set_TableName(BSTR Param1)
{
try
{
//m_Table->TableName=Value;
m_Table->TableName="tb_user";
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyTable);
}
return S_OK;
};
STDMETHODIMP TMyTableImpl::get_Active(VARIANT_BOOL* Value)
{
try
{
*Value=m_Table->Active;
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyTable);
}
return S_OK;
};