Я пишу ActiveX на VC. В клиенте (на VC) доступ к его свойствам и методам осуществляю через специальные указатели (smart pointer), т.е. подключение к нему делаю через #import, при этом он не отображается в окне приложения-клиента.
Как мне отобразить его в окне клиента?
Здравствуйте natalka, Вы писали:
N>Я пишу ActiveX на VC. В клиенте (на VC) доступ к его свойствам и методам осуществляю через специальные указатели (smart pointer), т.е. подключение к нему делаю через #import, при этом он не отображается в окне приложения-клиента.
N>Как мне отобразить его в окне клиента?
"подключение к нему" — это импорт библиотеки типов.
А как ты создаешь сам объект?
Здравствуйте retalik, Вы писали:
R>Здравствуйте natalka, Вы писали:
N>>Я пишу ActiveX на VC. В клиенте (на VC) доступ к его свойствам и методам осуществляю через специальные указатели (smart pointer), т.е. подключение к нему делаю через #import, при этом он не отображается в окне приложения-клиента.
N>>Как мне отобразить его в окне клиента?
R>"подключение к нему" — это импорт библиотеки типов.
R>А как ты создаешь сам объект?
Я подключаю *.tlb
#import "VGridApp.tlb" no_namespace
....
//Я объявляю smart pointer так:
IVGridPtr pGrid("VGridApp.VGrid.1");
//А дальше обращаюсь так:
pGrid->GetCount();
Здравствуйте natalka, Вы писали:
N>Я подключаю *.tlb
N>N>#import "VGridApp.tlb" no_namespace
N>....
N>//Я объявляю smart pointer так:
N>IVGridPtr pGrid("VGridApp.VGrid.1");
N>
Понятно. Здесь ты не просто объявляешь smart pointer, а
создаешь экземпляр объекта. Причем, без хоста (т.е., без родительского окна). Далеко не всякие ActiveX-ы умеют отображаться таким образом (как, например, "MSComDlg.CommonDialog").
Чтобы создать видимый AX, проще всего поместить его на диалоговый ресурс в MFC-окне с включенной подержкой ActiveX или ATL-окне, порожденном от CAxWindow. А потом уже получай свой смарт-пойнтер (в ATL — с помощью CWindow::GetDlgControl; в MFC — не помню уже, как)
Здравствуйте natalka, Вы писали:
N>Я пишу ActiveX на VC. В клиенте (на VC) доступ к его свойствам и методам осуществляю через специальные указатели (smart pointer), т.е. подключение к нему делаю через #import, при этом он не отображается в окне приложения-клиента.
N>Как мне отобразить его в окне клиента?
Можно импортировать ActiveX с помощью визарда, потом из сгенерированных им
файлов выкинуть все методы, сроме обоих Create и GetClsid.
потом нужно импортировать библиотеку твоего ActiveX описать в классе смарт
поинтер и в PreSubclassWindow этот поинтер проинициализировать.
должно получится примерно так. (На примере MSDataGrid)
class CDataGrid : public CWnd
{
protected:
DECLARE_DYNCREATE(CDataGrid)
public:
CLSID const& GetClsid()
{
static CLSID const clsid
= { 0xcde57a43, 0x8b86, 0x11d0, { 0xb3, 0xc6, 0x0, 0xa0, 0xc9, 0xa, 0xea, 0x82 } };
return clsid;
}
virtual BOOL Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd, UINT nID,
CCreateContext* pContext = NULL)
{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); }
BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID,
CFile* pPersist = NULL, BOOL bStorage = FALSE,
BSTR bstrLicKey = NULL)
{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
pPersist, bStorage, bstrLicKey); }
// Attributes
public:
IDataGridPtr m_pDataGrid;
virtual void PreSubclassWindow ()
};
//implimentation
void CDataGrid::PreSubclassWindow ()
{
CWnd::PreSubclassWindow();
try
{
m_pDataGrid = m_pCtrlSite->m_pObject;
}
catch(_com_error& e)
{
TRACE0("Error!!");
}
}