как отобразить ActiveX через дерективу #import?
От: natalka  
Дата: 14.05.02 04:42
Оценка:
Я пишу ActiveX на VC. В клиенте (на VC) доступ к его свойствам и методам осуществляю через специальные указатели (smart pointer), т.е. подключение к нему делаю через #import, при этом он не отображается в окне приложения-клиента.
Как мне отобразить его в окне клиента?
Re: как отобразить ActiveX через дерективу #import?
От: retalik www.airbandits.com/
Дата: 14.05.02 10:49
Оценка:
Здравствуйте natalka, Вы писали:

N>Я пишу ActiveX на VC. В клиенте (на VC) доступ к его свойствам и методам осуществляю через специальные указатели (smart pointer), т.е. подключение к нему делаю через #import, при этом он не отображается в окне приложения-клиента.

N>Как мне отобразить его в окне клиента?

"подключение к нему" — это импорт библиотеки типов.
А как ты создаешь сам объект?
Успехов,
Виталий.
Re[2]: как отобразить ActiveX через дерективу #import?
От: natalka  
Дата: 15.05.02 01:56
Оценка:
Здравствуйте 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();
Re[3]: как отобразить ActiveX через дерективу #import?
От: retalik www.airbandits.com/
Дата: 15.05.02 03:06
Оценка:
Здравствуйте 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 — не помню уже, как)
Успехов,
Виталий.
Re: как отобразить ActiveX через дерективу #import?
От: Max_Akimov Россия  
Дата: 15.05.02 06:09
Оценка: 5 (1)
Здравствуйте 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!!");
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.