Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Проблема с интерфейсами ActiveX

Автор: rkorchagin
Дата сообщения: 19.03.2003 18:28
Суть такая:
обьявлен класс
class ATL_NO_VTABLE CppReport :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CppReport, &CLSID_ppReport>,
public IDispatchImpl<IppReport, &IID_IppReport, &LIBID_RDLGAXLib>
{
public:
...
его методы....
далее обявлен другой класс
class _CppReport ublic CppReport{
public:
STDMETHODIMP QueryInterface( REFIID riid, void** ppv )
Release...
Addref....

Затем идёт класс CppBank (ActiveX) в котором есть внутренняя переменная _CppReport Report и свойство Report:
STDMETHOD(get_Report)(/*[out, retval]*/ IppReport* *pVal){
Report.QueryInterface(IID_IUnknown,(void**)(pVal));}
Если я регистрирую компоненту просто через REGSVR32 - то всё ОК. я могу вызывать
методы Reporta как
Dim a as CreateObject("rdlgax.ppBank.1")
a.Report.<интерфейс класса Report>
Но! если я регистрирую компоненту через Component Services - то все интерфейсы класса CppBank - вызываются без проблем, а обращение к Report - сразу выкидывает
либо "Interface not implemented" либо "Method ~ of object IppBank failed", в зависимости от содержания CppReport::QueryInterface.
В настоящее время эта ф-ция выглядит так:
STDMETHODIMP QueryInterface( REFIID riid, void** ppv )
{

//*ppv = (IppReport*) this;

*ppv = 0;
if ( riid == IID_IUnknown )
*ppv = (IppReport*) this;
else
if ( riid == IID_IppReport ){
*ppv = (IppReport*) this;

}


if ( *ppv )
{
AddRef();
return( S_OK );
}


return (E_NOINTERFACE);
};


Как сделать чтобы всё этоо чудо работало и при регистрации через Component Services.

Автор: Pinocchio
Дата сообщения: 20.03.2003 12:37
Автор: rkorchagin
Дата сообщения: 20.03.2003 14:14


да... ActiveX и COM скоро доведут меня!
Автор: Guderian
Дата сообщения: 20.03.2003 15:25
Попробуй перерегистрировать. Иногда и такое бывает. А то вдруг вначале зарегестрировал, а потом откомпилировал. Сделай из MTS инсталляшку на всякий. Тоже попробуй. Приведи точный код ошибки, а то с такими обознавательными знаками они разные бывают. Проверть секьюрити и роли компонента. Какая ось и с каким сервис-паком. Это тоже достаточно важно. Хотя, все достаточно странно. Это пока первое, что пришло в голову...
Автор: rkorchagin
Дата сообщения: 20.03.2003 15:37
Победа!
Я нашёл хорошую книгу по СОМ на
http://kappasoft.narod.ru/info/com/rogerson/com.html

оказалось все мои вспомогательные классы (_CppReport) - ето никакой не СОМ
а надо использовать CComPtr<имя интерфейса> <переменная>
а для инициализации <переменная>.CoCreateInstance(...
class ATL_NO_VTABLE CppTest :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CppTest, &CLSID_ppTest>,
public IDispatchImpl<IppTest, &IID_IppTest, &LIBID_RDLGAXLib>
{
CComPtr<IppCustomer> customer;
public:
........

CppTest()
{ HRESULT hr=customer.CoCreateInstance( CLSID_ppCustomer, NULL,
CLSCTX_ALL );........

и затем для получения указателя на интерфейс:
STDMETHODIMP CppTest::get_customer(IppCustomer **pVal)
{
// TODO: Add your implementation code here
customer.QueryInterface(pVal);
return S_OK;
}
и сейчас уже железно можно наконец написать даже в Ворде:
Dim a As Object
Set a = CreateObject("rdlgax.ppTest.1")
a.customer.<свойства и методы класса ppCustomer>

Вот.....


Добавлено
причём все QueryInterface, Add, Release и ещё куча ф-ций уже описана автоматически
в шаблоне...
Автор: Guderian
Дата сообщения: 20.03.2003 16:46

Цитата:
CoCreateInstance

А ты что, просто конструктором вызывал? Тогда все понятно...
Автор: rkorchagin
Дата сообщения: 20.03.2003 16:54
Ну естественно конструктором!!!!
я ж не знал!
и ещё сам впаял QueryInterface, Release i AddRef !
так как иначе класс не мог инициализироваться
но самое интересное что ЭТО ВСЁ работало !
пока не начал регистрировать через Component Services....

Автор: Pinocchio
Дата сообщения: 24.03.2003 14:04
Где-то я писал, что ActiveX автоматика, и кто-то со мной спорил... Нет, наверно лучше вручную писать.
Автор: rkorchagin
Дата сообщения: 24.03.2003 14:19
Я если честно чем больше читаю тем сильнее понимаю как мало знаю.
Кстати книга http://kappasoft.narod.ru/info/com/rogerson/com.html
хоть немного прояснила мне КАК всё это работает.... но дочитать до конца ....лень...
вроде получилось-заработало - и так до следующего стопора...

Автор: Pinocchio
Дата сообщения: 25.03.2003 12:28
rkorchagin
Лучше не ленись, а то потом такого наворотят, что вообще не успеешь.
Автор: Guderian
Дата сообщения: 25.03.2003 13:15
Pinocchio
Напротив, можно забить. В .NET все гораздо проще. Так что с c++ потихонечку на managed c++, а там и с#. Кстати, тебе как дельфийцу давно пора туда переходить. Хейлсберг для нас постарался. "Пишу и жмурюсь"
Автор: Pinocchio
Дата сообщения: 25.03.2003 14:22
Guderian
Pentium 166, 32mb, 4mb, 20gb. В Delphi все пакеты выключены за исключением Standart, Shell, WebBrowser и SynEdit/Inno. И куда я денусь в таких условиях?
Автор: Guderian
Дата сообщения: 25.03.2003 14:35
Pinocchio
Привожу пример. В данный момент запущены и vs.net и delphi. Показания таскменеджера. Delphi - 53,324. vs.net - 18,212. Хотя, 32 это, конечно, очень мало.
Автор: Pinocchio
Дата сообщения: 26.03.2003 13:22
Guderian
Страничка Delphi/Component/Install Packages отключал все галочки? Уже есть исходники SynEdit и InnoSetup для vs.net?
Автор: Guderian
Дата сообщения: 26.03.2003 13:34

Цитата:
Страничка Delphi/Component/Install Packages отключал все галочки?

Зачем? Я их не отключал ни там, ни там. Так что они в приблизительно одинаковых условиях. Причем под обоими были загружены достаточно крупные проекты. Delphi в этом плане гораздо прожорливей с ростом размера проекта.


Цитата:
Уже есть исходники SynEdit и InnoSetup для vs.net?

Опять же, зачем? Или SynEdit может сравниться по мощи с vs.net-овским редактором? Вряд ли. Там один IntelliSense чего стоит. А setup & deployment проекты там можно без Inno создавать.

Страницы: 1

Предыдущая тема: создание компилятора


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.