Re: Создать без CoCreateInstance
От: Lexey Россия  
Дата: 31.10.02 09:54
Оценка: 5 (1)
Здравствуйте goloveshin, Вы писали:

G>Есть исходник COM-объекта.

G>Я создаю его "в упор" — A* a = new A().
G>Ошибок при выполнении конструктора нет, но внутри — мусор.
G>Какие ф-ции объекта и в какой последовательности я должен
G>вызвать, чтобы эмулировать работу CoCreateInstance?

Сильно зависит от того, как написан COM-объект.
Если ATL'ный, то еще стоит вызвать FinalConstruct.
Ну, и QueryInterface еще неплохо было бы вызывать, если у него реализация нестандартная.

А вообще, для ATLного объекта лучше его создавать через CComObject<YourClass>::CreateInstance
Re: Создать без CoCreateInstance
От: Ерусов Дмитрий  
Дата: 31.10.02 16:44
Оценка: 2 (1)
Здравствуйте goloveshin, Вы писали:

G>Есть исходник COM-объекта.

G>Я создаю его "в упор" — A* a = new A().
G>Ошибок при выполнении конструктора нет, но внутри — мусор.
G>Какие ф-ции объекта и в какой последовательности я должен
G>вызвать, чтобы эмулировать работу CoCreateInstance?

Попробуй через DllGetClassObject которая в твоей длл определена

СХХХ* рХХХ = NULL;

IClassFactory* pFactory = NULL;
DllGetClassObject(CLSID_1, IID_IClassFactory, (LPVOID*)&pFactory);

pFactory->CreateInstance(NULL, IID_I1, (LPVOID*)&pХХХ);
pFactory->Release();

тогда АТЛ как сама генерила так сама и создаст
Создать без CoCreateInstance
От: goloveshin Россия  
Дата: 31.10.02 09:44
Оценка:
Есть исходник COM-объекта.
Я создаю его "в упор" — A* a = new A().
Ошибок при выполнении конструктора нет, но внутри — мусор.
Какие ф-ции объекта и в какой последовательности я должен
вызвать, чтобы эмулировать работу CoCreateInstance?
Re: Создать без CoCreateInstance
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 31.10.02 09:52
Оценка:
Здравствуйте goloveshin, Вы писали:

G>Какие ф-ции объекта и в какой последовательности я должен

G>вызвать, чтобы эмулировать работу CoCreateInstance?

Смотря на чем, у тебя был написан com-объект
Re: Создать без CoCreateInstance
От: goloveshin Россия  
Дата: 31.10.02 10:02
Оценка:
То, что мне нужно получается через Flex3DBase:

class CDDKSampleEffect : public CMxvfxFlex3DBase

который: class CMxvfxFlex3DBase: public CUnknown,
public IMxvfxRenderer,
public IMxvfxConvert,
public IMxvfxFlex3DEffectEditor

ATL вроде бы нет...
Re[2]: Создать без CoCreateInstance
От: Lexey Россия  
Дата: 31.10.02 10:07
Оценка:
Здравствуйте goloveshin, Вы писали:

G>То, что мне нужно получается через Flex3DBase:


G>class CDDKSampleEffect : public CMxvfxFlex3DBase


G>который: class CMxvfxFlex3DBase: public CUnknown,

G> public IMxvfxRenderer,
G> public IMxvfxConvert,
G> public IMxvfxFlex3DEffectEditor

G>ATL вроде бы нет...


Наличие/отсутсвие ATL лучше определять по всяким специфичным макросам.
А чем тебя нормальный CoCreateInstance не устраивает?
Re[3]: Создать без CoCreateInstance
От: goloveshin Россия  
Дата: 31.10.02 10:15
Оценка:
Здравствуйте Lexey, Вы писали:

G>>То, что мне нужно получается через Flex3DBase:


G>>class CDDKSampleEffect : public CMxvfxFlex3DBase


G>>который: class CMxvfxFlex3DBase: public CUnknown,

G>> public IMxvfxRenderer,
G>> public IMxvfxConvert,
G>> public IMxvfxFlex3DEffectEditor

L>Наличие/отсутсвие ATL лучше определять по всяким специфичным макросам.

Из макросов в CMxvfxFlex3DBase только DECLARE_IUNKNOWN.
L>А чем тебя нормальный CoCreateInstance не устраивает?
А мне нужно без размещения в dll.
Re[2]: Создать без CoCreateInstance
От: Vi2 Удмуртия http://www.adem.ru
Дата: 31.10.02 10:21
Оценка:
Здравствуйте goloveshin, Вы писали:

G>То, что мне нужно получается через Flex3DBase:

G>class CDDKSampleEffect : public CMxvfxFlex3DBase
G>который: class CMxvfxFlex3DBase: public CUnknown, public IMxvfxRenderer, ...
G>ATL вроде бы нет...

Посмотри в классе CMxvfxFlex3DBase. Там, наверное, есть фабрика класса со статическим методом CreateXXXX. Вот ее и нужно вызвать.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Создать без CoCreateInstance
От: goloveshin Россия  
Дата: 31.10.02 13:43
Оценка:
Здравствуйте Vi2, Вы писали:

G>>То, что мне нужно получается через Flex3DBase:

G>>class CDDKSampleEffect : public CMxvfxFlex3DBase
G>>который: class CMxvfxFlex3DBase: public CUnknown, public IMxvfxRenderer, ...
G>>ATL вроде бы нет...

Vi2>Посмотри в классе CMxvfxFlex3DBase. Там, наверное, есть фабрика класса со статическим методом CreateXXXX. Вот ее и нужно вызвать.


Да, в CDDKSampleEffect есть static CreateInstance, реализованная как:
CUnknown *punk = new CDDKSampleEffect(pUnkOuter, phr);

Ну, я так и делаю, pUnkOuter ставлю 0...
Но чего-то не хватает...
Хотя конструктор через phr сообщает, что все OK.
Re: Создать без CoCreateInstance
От: WolfHound  
Дата: 31.10.02 13:43
Оценка:
Здравствуйте goloveshin, Вы писали:

G>Есть исходник COM-объекта.

хъ
namespace{
class CSomeBase
    :public CComObjectRootEx<CComSingleThreadModel>
    ,public ISome1
    ,public ISome2
    ,public ISome3
{
    BEGIN_COM_MAP(CSomeBase)
        COM_INTERFACE_ENTRY(ISome1)
        COM_INTERFACE_ENTRY(ISome2)
        COM_INTERFACE_ENTRY(ISome3)
    END_COM_MAP()
    DECLARE_REGISTRY_RESOURCEID(IDR_CSome_RGS)
    DECLARE_PROTECT_FINAL_CONSTRUCT()
};
}
class CSome
    :public CComObject<CSomeBase>
    ,public CComCoClass<CSome, &CLSID_CSome>
{
    CSome(const CSome&){}
    CSome& operator =(const CSome&){return *this;}
public:
    CSome();
    ~CSome();
    //описание интерфейсов.....
};

А так писать не пробовал?
... << RSDN@Home 1.0 alpha 12 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Создать без CoCreateInstance
От: Vi2 Удмуртия http://www.adem.ru
Дата: 31.10.02 14:03
Оценка:
Здравствуйте goloveshin, Вы писали:

G>Но чего-то не хватает...


Спасение утопающих — дело рук самих утопающих.
Твои классы не стандартные, что там написано — одному богу известно.
Не требуй от нас невозможного. Мы — спецы, но не до такой же степени, чтобы, не видя кода, сказать в чем проблема.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Создать без CoCreateInstance
От: goloveshin Россия  
Дата: 31.10.02 14:06
Оценка:
Здравствуйте WolfHound, Вы писали:

WH>Здравствуйте goloveshin, Вы писали:


G>>Есть исходник COM-объекта.

WH>хъ
WH>
WH>namespace{
WH>class CSomeBase
WH>    :public CComObjectRootEx<CComSingleThreadModel>
WH>    ,public ISome1
WH>    ,public ISome2
WH>    ,public ISome3
WH>{
WH>    BEGIN_COM_MAP(CSomeBase)
WH>        COM_INTERFACE_ENTRY(ISome1)
WH>        COM_INTERFACE_ENTRY(ISome2)
WH>        COM_INTERFACE_ENTRY(ISome3)
WH>    END_COM_MAP()
WH>    DECLARE_REGISTRY_RESOURCEID(IDR_CSome_RGS)
WH>    DECLARE_PROTECT_FINAL_CONSTRUCT()
WH>};
WH>}
WH>class CSome
WH>    :public CComObject<CSomeBase>
WH>    ,public CComCoClass<CSome, &CLSID_CSome>
WH>{
WH>    CSome(const CSome&){}
WH>    CSome& operator =(const CSome&){return *this;}
WH>public:
WH>    CSome();
WH>    ~CSome();
WH>    //описание интерфейсов.....
WH>};
WH>

WH>А так писать не пробовал?
Дык, ведь этот CMxvfxFlex3DBase абстрактный и идет библиотекой, а исходники есть только для производных от него классов, оформляемых как COM в DLL. Назначение CMxvfxFlex3DBase в предоставлении нестандартного доступа до DirectX для карт Матрокса. Для получения доступа "до тела" я могу только наследовать...
Формально, создание через new проходит, но в нутри мусор — счетчик ссылок в CUnknown, указатели и т.п.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.