Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не клеится событиями 
:(
    Опции темы
Guest
  Дата 10.11.2003, 12:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Что-то у меня с событиями не клеится.
Код

namespace CTest
{
//Есть интерфейс
public delegate void DelegateLogIpAddr(uint dwIpAddr);

[Guid("A7B88840-A812-11cf-8011-00A0C90A8F78")]
public interface IDCCManTest
{
   event DelegateLogIpAddr EventLogIpAddr;
   void OnLogIpAddr(uint dwIpAddr);
                  ...
}
//Есть компонент, который должен перехватывать событие OnLogIpAddr интерфейса
public class CTestComp : System.ComponentModel.Component, IDCCManTest
{
  ...
  public event DelegateLogIpAddr EventLogIpAddr;
  public virtual void OnLogIpAddr(uint dwIpAddr)
  {
      if (EventLogIpAddr != null)
             EventLogIpAddr(dwIpAddr); // Так confused.gif
}
}


Почему то в приложение это событие не приходит.
Спасибо.
  Вверх
stab
Дата 10.11.2003, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



может просто обработчик не назначен?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
AntonSaburov
Дата 10.11.2003, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 118



Цитата
public virtual void OnLogIpAddr(uint dwIpAddr)


А ту уверен, что надо именно virtual ?
Может правильнее override ?

Хотя я в такую область не залезал, так что попытка чисто интуитивная.
Если найдешь решение - большая просьба опубликовать.

PM MAIL WWW ICQ   Вверх
Guest
Дата 10.11.2003, 12:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











По моему я дошел до корней проблемы, но решения не знаю.
При создании компонента делается следующее:
Код

private uint FContext;
...
public CTestComp()
{
   InitializeComponent();

   Guid CLSID_IDCCMan = new Guid("{499C0C20-A766-11cf-8011-00A0C90A8F78}");
   Type tmpIDCCManTestType = Type.GetTypeFromCLSID(CLSID_IDCCMan);
    if (tmpIDCCManTestType == null) throw new Exception("IUnknown not assigned.");
    object tmpIDCCManTestObj = Activator.CreateInstance(tmpIDCCManTestType);
    if (tmpIDCCManTestObj == null) throw new Exception("IDCCMan not found.");

   fixed (uint *ptr = &FContext)
   {    
       FIDCCMan.Advise(this, ptr); // Вот здесь то Advise не проходит - почему не понятно
       // соот-но и далле компонент не работает
   }  
}

Кто-нибудь знает в чем тут дело. На Delphi код следующий и работает:
Код

protected
   FContext:DWord;
...
constructor TTestComp.Create(AOwner: TComponent);
 var tmpIUnknown:IUnknown;
begin
 tmpIUnknown:=CreateComObject(CLSID_IDCCMan);
 if not assigned(tmpIUnknown) then raise ESyncError.Create('InternalNewInit.IUnknown not assigned.');
 if (tmpIUnknown.QueryInterface(IDCCMan, FIDCCMan)<>S_OK)or(not assigned(FIDCCMan)) then
    raise  ESyncError.Create('InternalNewInit.IDCCMan not found.');
 FIDCCMan.Advise(self, @FContext);
end;


  Вверх
stab
Дата 10.11.2003, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Код
FIDCCMan.Advise(this, ptr);


на сколько я понимаю:

1. метод Advise требует что бы первый параметр поддерживал интерфейс IAdviseSink, точнее это указатель на этот интерфейс.
2. this в данном случае класса CTestComp, следовательно CTestComp должен реализовывать интерфейс IAdviseSink, может как раз он и нереализован?

з.ы может я ваще не в ту степь полез? smile.gif


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Unregistered
Дата 10.11.2003, 13:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Да, ты все верно говоришь
класс CTestComp объявлен как
public class CTestComp : System.ComponentModel.Component, IDCCManSink{}
IDCCManSink - это и есть тот самый интерфейс.
  Вверх
stab
Дата 10.11.2003, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Покажи как описан IDCCManSink.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Unregistered
Дата 10.11.2003, 14:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











using System;
using System.Runtime.InteropServices;

namespace CTestCompLib
{
public delegate void DelegateLogIpAddr(uint dwIpAddr);
[ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), GuidAttribute("09994751-A5A2-4306-899C-A47E6C4525B7")]
//[Guid("A7B88840-A812-11cf-8011-00A0C90A8F78")]
public interface IDCCManSink
{
event DelegateLogIpAddr EventLogIpAddr;
void OnLogIpAddr(uint dwIpAddr);
void OnLogTerminated();
void OnLogActive();
void OnLogInactive();
void OnLogAnswered();
void OnLogListen();
void OnLogDisconnection();
void OnLogError();
}

  Вверх
stab
Дата 10.11.2003, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



хз, вроде все ок.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
stab
Дата 10.11.2003, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Цитата
FIDCCMan.Advise(this, ptr); // Вот здесь то Advise не проходит - почему не понятно


а что происходит?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Unregistered
Дата 10.11.2003, 14:14 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Когда кидаю компонент на форму вылетает ошибка:
An exception occurred while trying to create an instance of CTestCompLib.CTestComp. The exception was "Object reference not set to an instance of an object.".
  Вверх
stab
Дата 10.11.2003, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



т.е. FIDCCMan получается равен null ?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Guest
Дата 10.11.2003, 14:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Навернное. bored.gif
  Вверх
stab
Дата 10.11.2003, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



фигурируют два объекта tmpIDCCManTestObj и FIDCCMan, может это должен быть один и тот же объект и одна переменная?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Guest
Дата 10.11.2003, 14:32 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В коде на Delphi так и есть
Код

protected
  FContext:DWord;
...
constructor TTestComp.Create(AOwner: TComponent);
var tmpIUnknown:IUnknown;
begin
tmpIUnknown:=CreateComObject(CLSID_IDCCMan);
if not assigned(tmpIUnknown) then raise ESyncError.Create('InternalNewInit.IUnknown not assigned.');
if (tmpIUnknown.QueryInterface(IDCCMan, FIDCCMan)<>S_OK)or(not assigned(FIDCCMan)) then
   raise  ESyncError.Create('InternalNewInit.IDCCMan not found.');
FIDCCMan.Advise(self, @FContext);
end;

но на C# у меня не получилось так сделать.
Если ты знаешь как, пожалуйста подскажи.
  Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0652 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.