Есть исходник COM-объекта.
Я создаю его "в упор" — A* a = new A().
Ошибок при выполнении конструктора нет, но внутри — мусор.
Какие ф-ции объекта и в какой последовательности я должен
вызвать, чтобы эмулировать работу CoCreateInstance?
Здравствуйте goloveshin, Вы писали:
G>Есть исходник COM-объекта. G>Я создаю его "в упор" — A* a = new A(). G>Ошибок при выполнении конструктора нет, но внутри — мусор. G>Какие ф-ции объекта и в какой последовательности я должен G>вызвать, чтобы эмулировать работу CoCreateInstance?
Сильно зависит от того, как написан COM-объект.
Если ATL'ный, то еще стоит вызвать FinalConstruct.
Ну, и QueryInterface еще неплохо было бы вызывать, если у него реализация нестандартная.
А вообще, для ATLного объекта лучше его создавать через CComObject<YourClass>::CreateInstance
Здравствуйте 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 не устраивает?
Здравствуйте 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.
Здравствуйте goloveshin, Вы писали:
G>То, что мне нужно получается через Flex3DBase: G>class CDDKSampleEffect : public CMxvfxFlex3DBase G>который: class CMxvfxFlex3DBase: public CUnknown, public IMxvfxRenderer, ... G>ATL вроде бы нет...
Посмотри в классе CMxvfxFlex3DBase. Там, наверное, есть фабрика класса со статическим методом CreateXXXX. Вот ее и нужно вызвать.
Здравствуйте 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.
Здравствуйте goloveshin, Вы писали:
G>Но чего-то не хватает...
Спасение утопающих — дело рук самих утопающих.
Твои классы не стандартные, что там написано — одному богу известно.
Не требуй от нас невозможного. Мы — спецы, но не до такой же степени, чтобы, не видя кода, сказать в чем проблема.
WH>А так писать не пробовал?
Дык, ведь этот CMxvfxFlex3DBase абстрактный и идет библиотекой, а исходники есть только для производных от него классов, оформляемых как COM в DLL. Назначение CMxvfxFlex3DBase в предоставлении нестандартного доступа до DirectX для карт Матрокса. Для получения доступа "до тела" я могу только наследовать...
Формально, создание через new проходит, но в нутри мусор — счетчик ссылок в CUnknown, указатели и т.п.
Здравствуйте goloveshin, Вы писали:
G>Есть исходник COM-объекта. G>Я создаю его "в упор" — A* a = new A(). G>Ошибок при выполнении конструктора нет, но внутри — мусор. G>Какие ф-ции объекта и в какой последовательности я должен G>вызвать, чтобы эмулировать работу CoCreateInstance?
Попробуй через DllGetClassObject которая в твоей длл определена