怎么将非可视化的组件封装为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;
};


...全文
2117 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2016-08-11
  • 打赏
  • 举报
回复
放弃ActiveX吧,这个技术现在不值得学习了。
呆瓜西西 2016-08-10
  • 打赏
  • 举报
回复
顶啊 希望有人帮帮忙!
我不懂电脑 2016-08-05
  • 打赏
  • 举报
回复
控件做好后,要添加到BCB的ide的组件面板上,这样就可以直接在设计器里拖进来。
呆瓜西西 2016-08-05
  • 打赏
  • 举报
回复
引用 1 楼 wewaa 的回复:
控件new出来就成了。
应该在哪里new出来,我在接口方法哪里,用TTable* tab=new TTable(NULL)一个,在使用的时候报错。
laowang2 2016-08-04
  • 打赏
  • 举报
回复
控件new出来就成了。

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧