Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: COM+MIDL ERROR  (Прочитано 29182 раз)
0 Пользователей и 1 Гость смотрят эту тему.
WDMclient
Гость
« : 20-10-2009 19:39 » 

Первый блин: MIDL-COM

fatal error C1189: #error :  You need a Windows NT 4.0 or later to run this stub because it uses these features

Вот такое сообщение получаю при компиляции.

Тупая скотина , Visual Studio 6 , вроде как не знает для какой платформы нужен этот стуб , по типу платформ дох..я.

строка для MIDL:   /nologo /D "NDEBUG" /Oicf /robust /win32

в файле MIDL_Com.idl определил версию:   #define _WIN32_WINNT  0x400

все равно получаю:
incorrect <rpcproxy.h> version. Use the header that matches with the MIDL compiler

какая такая версия <rpcproxy.h>, он же шел совместно с компилятором

ПИШЕТ что File created by MIDL compiler version 5.01.0164
а файл rpcproxy.h  для 3.3.106
бля старье , где я выкопал его.
P.S.
VS 7 рухнула.
установил откудато VS 6.
« Последнее редактирование: 21-10-2009 10:16 от Джон » Записан
sss
Специалист

ru
Offline Offline

« Ответ #1 : 21-10-2009 07:41 » 

А что место показать c #error?
« Последнее редактирование: 21-10-2009 07:43 от sss » Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #2 : 21-10-2009 07:46 » 

Так вроде надо поменять на   #define _WIN32_WINNT  0x500 или убрать ключ /robust
Записан

while (8==8)
WDMclient
Гость
« Ответ #3 : 21-10-2009 20:50 » 

если начать баловаться с  #define _WIN32_WINNT  0x500
так начинает про  import  негодный ( полный аборт)
Снес винду , и на чистой , новой  установил  visual.studio.net (c++ 6)
Так даже вообще ничего  не компилит . Типа прав не хватает на создание файла

Я гуглить пошел.А там уже знакомая хрень.
и майкрософт чевой-то советует и еще кто-то и ничего не вышло.

У меня такие проблемы тока Visual Studio

Все остальное Билдер , делфи всегда легки и работают и устанавливаются без сбоев.
Короче наменял я прав(NTFS) и она почти сдохла.
Давай я удалять ее законно через "Удаление программ" , а она не удалилась
Под конец я на нервах каталог Microsoft Visual Studio.net разбомбил и сковырнул.
Теперь не знаю как ее установить опять или удалить до конца.
(Всегда не навидел этого монстра)


« Последнее редактирование: 22-10-2009 03:03 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 22-10-2009 03:03 » 

WDMclient, нервами тут делу не поможешь - пей валериану. Если мне ещё раз придётся чистить твой пост от нетехнических слов, буду просто сильно начинать удалять этот пост!

кстати,
Цитата
visual.studio.net (c++ 6)
разве .NET при VS6 уже был ? Не знаю, лично я на VS6 на с++ много понаписал, проблемы всегда решались мирно. Про НЕТ не знаю - он всегда коряв



да и вот тут ответь уже
А что место показать c #error?
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 22-10-2009 05:09 » 

Алексей1153++, .NET - это 7ка. Сам .NET там был ещё совсем старый и, по-моему, сыроватый.

Хотя к COM это отношения не должно иметь никакого. Я делал какие-то простенькие COM-ы в 7ке несколько лет назад - и всё было ок.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 22-10-2009 05:11 » 

Вад, дык он то 6 упоминает, а не 7
Записан

WDMclient
Гость
« Ответ #7 : 22-10-2009 06:11 » 

WDMclient, нервами тут делу не поможешь - пей валериану. Если мне ещё раз придётся чистить твой пост от нетехнических слов, буду просто сильно начинать удалять этот пост!


В принципе я и сам хотел попросить , чтоб удалить этот пост.
Так же как я винду за день 3 раза новую поставил , и только единожды
.NET  установился , да и то компилить не захотел.

Я тоже думал что NET это 7 , но попалась NET  а там 6 версия.
Старье.
За все время устанавливал раз 20.  из них только раза 3 удачно.

С Борландом 100% удачно.

А ошибку эту обсуждать думаю бессмысленно(я по гуглу понял) , это должно работать по умолчанию если не работает то надо с компилятором удачу поймать.
P.S.
Excuse me


Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 22-10-2009 06:21 » 

WDMclient, а студию № 9 или 10 поставить если ?
Записан

WDMclient
Гость
« Ответ #9 : 22-10-2009 11:08 » 

(Алексей1153++)
Думаю это не поможет , у майкрософт официально ясно сказано что
включаю СтУДИО  2008г , скомпилить не получится.
И тут же везде предлагают перейти на  MFC.

=========================================
Так четвертый раз за сутки переустановил Винду и
отредактировал файл установики Студии. Помогло.

Самое интересное что вчера показывало цифру 6 везде.
Сегодня как положено 7 версия.  
Уже лучше!!
и еще ЕмаЕ грабли были офицально  известны
 флаг  " R e s t r i c t R u n " в реестре не давал компиляции.
(Но я его удалял и тоже не работало , а щя заработало)

Так вроде надо поменять на   #define _WIN32_WINNT  0x500 или убрать ключ /robust

SSS. не подскажешь где именно нужно поменять "#define _WIN32_WINNT  0x500"
d:\VISUAL++\MIDL_Com\MIDL_Com_p.c(298): fatal error C1189: #error :  You need a Windows NT 4.0 or later to run this stub because it uses these features:

а то ошибка продолжается

#if !(TARGET_IS_NT40_OR_LATER)
#error You need a Windows NT 4.0 or later to run this stub because it uses these features:
#error   [wire_marshal] or [user_marshal] attribute.
#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems.
#error This app will die there with the RPC_X_WRONG_STUB_VERSION error.
#endif
« Последнее редактирование: 23-10-2009 16:56 от WDMclient » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 22-10-2009 11:16 » 

напиши в коде где угодно _WIN32_WINNT , щёлкни по нему правой кнопкой мыши и перейди к определению
Записан

WDMclient
Гость
« Ответ #11 : 22-10-2009 11:38 » 

Вот нашел два куска кода
из
AFXV_W32.h:

#ifndef _WIN32_WINNT
#ifdef WINVER
#define _WIN32_WINNT WINVER
#else
#define _WIN32_WINNT 0x0501
#endif
#else
#if _WIN32_WINNT < 0x0400
#error MFC requires _WIN32_WINNT to be #defined to 0x0400 or greater
#endif
#endif

И   WINRESRC.h:

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500
#endif
======================
А что с этим делать?

Да кстати командная строка для МИДЛ
/D "NDEBUG" /nologo /env win32  /tlb ".\Release/MIDL_Com.tlb" /h "MIDL_Com_h.h"


MSDN:
For example, if the interface uses features supported only on Windows NT 4.0, Windows 2000, or later, MIDL generates a guard with the TARGET_IS_NT40_OR_LATER macro

Непонятно это ошибка или  что то другое?
=========================================
Где то посоветовали компилить с
 -DWINVER=0x400
 -D_WIN32_WINNT=0x500
========
в итоге ошибка:
unresolved external symbol _CStdStubBuffer_Release@4
=========================================
Оказалось что MIDL генерит

<idl name>.h
<idl name>_i.c
<idl name>_p.c
и
dlldata.c  (про него я не знал)
последним подключил к проекту
как раз только что и имею
========и 2 error(a)

MIDL_Com error LNK2005: _DllCanUnloadNow@0 already defined in My_Com.obj
MIDL_Com error LNK2005: _DllGetClassObject@12 already defined in My_Com.obj

Так дважды определены . А ведь у меня там #pragma once  
И вот тут Microsoft говорит что это "BUG" Студии 2008г. А у меня 2002г.
и проблему предлагают решить подключая MFC

Ну что ж .... приехали , но не беда
 и так всегда знал что СТУДИЯ это отстой....
=========================================


« Последнее редактирование: 22-10-2009 15:51 от WDMclient » Записан
WDMclient
Гость
« Ответ #12 : 22-10-2009 17:37 » 

Не силен я в МFC , (работаю на чистом АПИ)
Может кто знает как подключить макрос AFX_MANAGE_STATE
(видно с помощью его тока можно избватьться от конфликтов)
а то ругается что имя не глобальное
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 23-10-2009 02:44 » 

у меня макрос определён как
Код:
#define AFX_MANAGE_STATE(p) _AfxInitManaged(); AFX_MANAGE_STATE_NO_INIT_MANAGED(p)
в файле afxstat_.h

но только отдельно от MFC он тебе вряд ли поможет. Улыбаюсь
Записан

WDMclient
Гость
« Ответ #14 : 23-10-2009 16:43 » 

в общем кофликт функций решил простым патчем готовой DLL-ки
Перед компиляцией все нужные к EXPORT-функции переименовываю.
А после компиляции востановить их имена  в бинарнике-dll.
Иначе выхода нет. Зато все заработало и теперь продолжаю делать свой АТЛ.
Кстати я тут намутил много с компиляцией , на самом деле все просто
описано на Уроке 17. Пример стандартного маршалинга
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1364
Записан
sss
Специалист

ru
Offline Offline

« Ответ #15 : 26-10-2009 01:14 » 

WDMclient, видать поздно... Но все равно. В свойствах проекта есть узел MIDL->General. Там есть Preprocessor Definitions. Вот там можно прописать _WIN32_WINNT=0x0501, или просто TARGET_IS_NT40_OR_LATER
Записан

while (8==8)
WDMclient
Гость
« Ответ #16 : 26-10-2009 15:41 » 

Никогда не поздно!
Но к сожалению , проверил ... увы ,от конфликта функций не помогает.
Майкрософт не обманешь , они это предусмотрели заранее.И официально об это объявили.
Уж очень простой конфликт на ровном месте.


Короче сделал заготовку проекта ATL c помощью wizarda.
По ходу был приятно удивлен , что ATL лучше использовать без MFC.(да это праздник)

Но как обычно был неприятно удивлен что примеры которые достал  для
С++ 6 версии.  В 7 NET (точнее 6.5 версии) менюхи изменены или вообще
отсуствуют.
На странице покойного программиста (не повезло парню)
 Каева Артема. "Первые шаги"
[url]http://www.firststeps.ru/mfc/activex/r.php?118[\url]
(за что ему огромное)

Есть подробное описание изготовления этих ATL.

Видно зря я снес VISUAL C++ 6.


« Последнее редактирование: 27-10-2009 15:45 от WDMclient » Записан
WDMclient
Гость
« Ответ #17 : 28-10-2009 06:51 » 

Ну в общем разобрался со всем.
Оставил и С 6 и дополнительно STUDIO NET

Правда  NET не работает в меню "File" пункт "Recent Project List"(как обычно что то не работает)

От модератора: не надо лишних эмоций.

« Последнее редактирование: 28-10-2009 07:38 от Вад » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 28-10-2009 07:40 » 

WDMclient, если инструмент тебе не нравится - это ещё не значит, что он для всех неудобен в работе. Мне VS нравится - более комфортного и функционального IDE я пока не встречал. Борланд, несмотря на многие находки (которые потом появились и в VS Улыбаюсь ) у меня оставлял куда более тягостное впечатление.

Если неудобно - кто тебя заставляет пользоваться VS? Пользуйся Билдером, и всё будет хорошо Улыбаюсь
« Последнее редактирование: 28-10-2009 07:41 от Вад » Записан
WDMclient
Гость
« Ответ #19 : 28-10-2009 15:14 » 

ВАД: Я бы РАД , но  заказчики идут лишь на  VS-контакт.


Удивляет то , что уставливал разные пакеты и приходилось
то с командной строки дополнительные параметры вводить ,
то редактировать файл установки
и несколько танцев с бубном сплясать.
« Последнее редактирование: 28-10-2009 15:23 от WDMclient » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 29-10-2009 04:03 » 

не знаю, мне ничего не приходилось - поставил, настроил через штатные окна свойств, подправил WINVER (хи) и всё )
Записан

WDMclient
Гость
« Ответ #21 : 02-11-2009 09:06 » 

Есть такой чувак  А. Деннинг. Который написал книгу
"ActiveX. Для профессионалов"
В ней он сказал что знал программистов которые обсолютно не разбираются
в устройстве COM (тем более ATL). Но это не мешает им делать прекрасные ActiveX.

Судя по книжке сам А. Деннинг относится к таким же программистам.

Но многим как-то не хочется быть таким программистами.

Суть COM очень проста если глядеть на нее глазами ассемблера.
Чуть хлопотнее маршалинг. Но это можно и самому руками сотворить ,
 правда время надо ,а его как обычно не хватает.

Первые непонятки это когда начнешь на С++ делать COM. Но это еще преодолимо.
Признаки деградации  наступают когда начинаешь изучать COM используя MFC.
И когда на Бэйсике делать тоже самое - то это уже диагноз.

Вот так и рождаются отличные программисты о которых писал Деннинг.
Кстати именно они потом и пишут множество мануалов( Жаль что не на ассемблере)

« Последнее редактирование: 02-11-2009 11:08 от WDMclient » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 02-11-2009 09:16 » 

WDMclient, я из-за множества опечаток в твоём посте, может что то не так понял, но мне показалось, что это был наезд на MFC ? )))

MFC, кстати, это тот же с++ , если в общем посмотреть.
Записан

WDMclient
Гость
« Ответ #23 : 02-11-2009 11:13 » 

Мой header перегрелся видимо , от того и опечятки , но уже исправил.

Относительно C++ ,  COM  тоже  С++ , но COM это COM
                    MFC  тоже  С++ , но МFC это MFC

Врядли после Борланда VCL   чел будет садиться за Studio MFC- это просто страшно.
А уровень вроде как один и тот же. То бишь одинаково удаляют девелопера от конкретных знаний.
Хотя у борланда как-то все понакатанее.

 
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 02-11-2009 11:27 » 

Offtopic:

WDMclient, хех... по моему, дело больше в казуальстве. Вот лично я за борланд после MFC не сяду ни в жисть - борланд сразу веет скукой и неопрятностью Улыбаюсь
Поставлю в угол.


в общем, сравнения тут неуместны, надо править непосредственно руки. Ну и успокоиться, как я уже говорил в начале Улыбаюсь)
« Последнее редактирование: 02-11-2009 11:29 от Алексей1153++ » Записан

WDMclient
Гость
« Ответ #25 : 02-11-2009 12:15 » 

Скорее всего, надо править не руки, а голову, потому как руки печатают хорошо, а голова думает глюками

Вообще-то, я не пользуюсь никакими IDE , а только теми, что сделаны мною, make файлы, .bat-файлы , виртуальные столы.
А подсветка синтаксиса убогая, как у Борланда, так и у студии, а ведь это одна из главных возможностей хорошо поработать.
Поэтому я люблю сторонние редакторы. И ради этого отказываюсь от автоматических подсказок.

Практика показала, что идеального инструмента нет, а мог бы быть

А вообще у меня ж тут тема про ATL, и я опять загруз.

В общем не знаю, как загрузить свой ATL (ActiveX) в приложение, только без MFC. И чтоб он отобразился в обычном окне также, как и в "AсtiveX  control test  container".

Он считывает откуда-то параметры инициализации из встроенных данных, но откуда? И как? Через какие-то дополнительные интерфейсы.
« Последнее редактирование: 02-11-2009 13:53 от Sel » Записан
WDMclient
Гость
« Ответ #26 : 14-12-2009 10:13 » 

Так отложил ATL в сторону. (потому как это все визарды)
Взял и проработал книгу "Inside COM" Роджерсона.
Вроде бы толково пишет. И хорошо что на чистом С++ , без визардов.Все ручками.
Но в конце своей чудесной книги он как-то упускается интересный момент для всех КОМОВ.
А конкретно события сервера и подключение клиента к их прослушке.


в общем способ для подключения клиента у меня стандартный , для простоты
я оставил тока основные моменты.

Код:
int main(int argc, char* argv[])
{


HRESULT hr;
ULONG dwAdvise;

  CoInitialize(0);
  //=====================================
IClassFactory *pClassFactory=NULL;
//----------------
 hr=CoGetClassObject( CLSID_Car ,   CLSCTX_LOCAL_SERVER,
             NULL, IID_IClassFactory,  (void **) &pClassFactory);


 ISpeed * pSpeed=NULL; //запрашиваемый интерфейс
 
  hr=pClassFactory->CreateInstance(
  NULL ,
  IID_ISpeed,
  (void**)&pSpeed );

//---------------- стандартное подключение к событиям сервера
LPCONNECTIONPOINTCONTAINER pConnPtCont;
LPCONNECTIONPOINT pConnPt = NULL;
//---------------- получить контейнер точек 
pSpeed->QueryInterface(IID_IConnectionPointContainer , (void**)&pConnPtCont);
//---------------- найти нужную точку для подключния                                 
hr=pConnPtCont->FindConnectionPoint(DIID__IRegistrationEvents, &pConnPt);

//================ объект MySink для эскпорта серверу

IRegistrationEvent1 *  pSinkUnk=new MySink();
   
//================ регистрируем My
 
 pConnPt->Advise((IUnknown*) pSinkUnk , &dwAdvise);

//================ проверяем событие  которое произойдет
//================ на сервере если вызвать функцию SetSpeed

pSpeed->SetSpeed(10);

pClassFactory->Release();


CoUninitialize();
return 0;
}
//============================================================
//==== Класс MySink с интерфейсом IRegistrationEvent

Код:
interface IRegistrationEvent :IUnknown
{
  virtual HRESULT OnSetSpeed()=0;
};
//==========

class  MySink :  public IRegistrationEvent
{

private:
    DWORD       m_dwRefCount;
public:
    MySink::MySink() {m_dwRefCount = 0;}
    MySink::~MySink()    {}


// методы IUnknown
 STDMETHOD(QueryInterface)(REFIID riid, LPVOID* ppv);
  STDMETHOD_(ULONG, AddRef)();
  STDMETHOD_(ULONG, Release)();

// IRegistrationEvent
virtual HRESULT OnSetSpeed()
  {MessageBox(0 , "Client::OnSetSpeed!!" , "Client!!" , 0);return 0;}
}
//===========================================


в общем по идее сервер должен вызвать функцию реализованую в клиенте ,
ведь для COM разницы нет  кто вызывает функцию клиент у сервера , или
сервер у клиента.

Опять же для простоты я остановился на клиентском вызове Advise.
"pConnPt->Advise((IUnknown*) pSinkUnk , &dwAdvise);"
И проверил обратный вызов клиентской функции OnSetSpeed
из серверной реализации этой функции вот ее код:

Код:
HRESULT __stdcall 
CConnectionPoint::Advise(IUnknown* pIUnknownSink, DWORD* pdwCookie )
{

if (pIUnknownSink == NULL || pdwCookie == NULL)
{
*pdwCookie = 0;
return E_POINTER;
}
 
IUnknown  * pIUnk = NULL ;
  IRegistrationEvent  * pI=NULL;    
 
 HRESULT hr = pIUnknownSink->QueryInterface(*m_piid  , (void**)&pIUnk) ;

if (SUCCEEDED(hr))
{
MessageBox(0 , "SERVER  ADVISE" , "SERVER" , 0);

CONNECTDATA  cd ;
cd.dwCookie = ++m_dwNextCookie ;
cd.pUnk = pIUnk ;

        pIUnk->QueryInterface(*m_piid  , (void**)&pI) ;

       // pI->AddRef(); //работает (проверил)
// pI->AddRef(); //тоже работает (проверил)

pI->OnSetSpeed();//опять работает
// pI->OnSetSpeed(); // УЖЕ НЕ РАБОТАЕТ(проверил)


// сохранить в листе
    m_SinkList.push_back(cd) ;

// возвратить куки
*pdwCookie = cd.dwCookie ;
return S_OK ;
}
else
{
return hr;//CONNECT_E_CANNOTCONNECT ;
}

}
//===========================================================

в общем методы IUnknown объекта MySink вызываются хорошо.
а вот метод интерфейса IRegistrationEvent почему то только один раз
и только при обязательных условиях
         1.если объявлена стрктура CONNECTDATA  cd
         2.CONNECTDATA  должна быть именно в стеке
         3.Элемент cd.pUnk должен быть инициализирован не любым значением и не нулем ,            а действительным  полученым через ->QueryInterface числом pIUnk ;;//
          хотя нигде в функции ADVISE структура  CONNECTDATA не применяется.(МИСТИКА)
//===========================================================
Пытался сохранять параметры например  IUnknown* pIUnknownSink в глобальный серверные переменные (pServerSink), что бы напряму без классов контейнера точек обойтись.
Но не работает ни с контейнероми , ни напрямую(через глобальные переменные)

Вот метод SetSpeed
Код:
//----------------------------------------------------------
//                 meth SetSpeed     proc
//----------------------------------------------------------
STDMETHODIMP Car::SetSpeed(long  nSpeed)
{
     //упрощенно вызвать методы клиента
IRegistrationEvent * pMyEvent;
     pServerSink->QueryInterface(DIID__IRegistrationEvents , (void**)&pMyEvent);
     pMyEvent->OnSetSpeed(); // увы не работает.

      //или так
        Fire_Event(); //в этой функции стандартная обработка событий через классы
                      //перечислителей ( но там тоже не срабатывает)

m_nSpeed = nSpeed;

return S_OK;

}
//==============================================================

В  итоге если в функции ADVISE , для объекта MySink - методы интерфейса IUnknown работают , а  методы моего интерфейса  IRegistrationEvent , срабатываеют только один раз.
То в вызове CAR::SetSpeed  вообще ничего не работает.
//==============================
МАРШАЛИНГ
file.idl  для прокси\стаб  библиотеки выглядит так:


Код:
import "oaidl.idl";
import "ocidl.idl";
import "unknwn.idl" ;
//////////////////////////////////////////////////
[
object,uuid(D518B0BF-3EE1-4976-9B6A-9F3443A2A186),
helpstring("interface IStatus")
]

interface  ISpeed : IUnknown
{
HRESULT GetSpeed([in,out] long  * pnSpeed);
HRESULT SetSpeed([in] long  nSpeed);
}
/////////////////////////////////////////////////
[
uuid(0331CCE1-669D-4082-8116-01E989993C17),
helpstring("IRegistrationEvent Interface"),
pointer_default(unique)
]

interface IRegistrationEvent : IUnknown
{
HRESULT OnSetSpeed();
};


//====== TypeLib
[
uuid(3F481E63-C189-4d99-A705-9F3F2DFB7145),
version(1.0)

]
library ExeServer {
importlib("stdole32.tlb");
importlib("stdole2.tlb");



[uuid(1F481E63-C189-4d99-A705-9F3F2DFB7145)]
//====== Экспорnирумый класс Sink

coclass mySink
{
      [default] interface IRegistrationEvent;
};


//====== ГЛАВНЫЙ КЛАСС СЕРВЕРА
[uuid(2F481E63-C189-4d99-A705-9F3F2DFB7145)]


coclass Car
{
        [default]  interface ISpeed;     
          interface IConnectionPointContainer ;
  [default,source] interface IRegistrationEvent;

};
};


Может кто сталкивался с таким вопросом?
А то  я тут  как бы стопорнулся.
Надо копать дальше все равно.
Записан
WDMclient
Гость
« Ответ #27 : 14-12-2009 14:27 » new

Хвала Аллаху и Дизассемблеру Ида.

Оказалось что стек кушает неправильно объявленная функция

interface IRegistrationEvent :public IUnknown
{
virtual HRESULT OnSetOwner()=0;
};


А надо  так:

interface IRegistrationEvent :public IUnknown
{
STDMETHOD(OnSetSpeed)()=0;
};

P.S.
А то я совсем расстроился , к тому же оказалось что редактор Visual C++6 , часто намертво повисает в ассемблерных вставках.
Жалко но по удобству  лучше чем новые версии.
---------------
Короче сейчас можно и смело АТЭЭЛЫ атээлить. Азы пройдены!
« Последнее редактирование: 14-12-2009 14:35 от WDMclient » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines