Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Кому нибудь удалось написать COM на делфи, а клиента на .NET ? / 8 сообщений из 8, страница 1 из 1
07.02.2004, 03:58
    #32401481
maratic_net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
Привет ! Я уже несколько дней мучаюсь...
Проблема - пишу COM на Делфи7. Упростим задачу до минимума - есть COM в нем 2 события. Вроде бы все делаю по правилам.

Далее использует сборку .NET клиент (C#, VB.NET -даже это перепробовал)
Делегат на любое из событий можно повесить без проблем. И все работает...
НО вот вешаю еще один делегат на второе событие и эксепшен:

An unhandled exception of type
'System.Runtime.InteropServices.COMException' occurred in interop.mailbox.dll
Additional information: Exception from HRESULT: 0x80040202.

что дает после расшифровки:

E_NOINTERFACE 0x80004002 The QueryInterface method did not recognize the requested interface. The interface is not supported

Ведь главное, если этот COM юзать в самой Делфи, то все работает ! Т.е. работают оба события... В чем грабли ? Никто с этим не сталкивался? Мне что то кажется, что я напутал при создании COM.
...
Рейтинг: 0 / 0
07.02.2004, 04:01
    #32401484
maratic_net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
Ошибся с описанием ошибки. Сейчас снова начинать копать

VFW_E_NEED_OWNER This object can only be created as an aggregated object. 0x80040202 514
...
Рейтинг: 0 / 0
07.02.2004, 11:37
    #32401539
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
а ты покажи как ты на NET с ним пытаешся работать .
____
...
Рейтинг: 0 / 0
07.02.2004, 15:19
    #32401626
SergLet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
Вот плюнул бы ты на Делфи и занялся бы NET.Remoting маршалинг через
границы приложения! А COM - это уже прошлое, хотя его еще много!
Удачи!
...
Рейтинг: 0 / 0
07.02.2004, 18:18
    #32401693
maratic_net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
Привет всем
Во первых отвечу на вопрос как я работаю с событиями.. Да как обычно. Действительно .NET видит 2 события COM объекта. То есть все чисто.

SimpleEvent.ForumClass fc = new SimpleEvent.ForumClass();

Код: plaintext
1.
fc.OnAnswer+=new SimpleEvent.IForumEvents_OnAnswerEventHandler(fc_OnAnswer);
//fc.OnAnswer+=new SimpleEvent.IForumEvents_OnAnswerEventHandler(fc_OnAnswerSec); 
// Если убрать комментарии то ошибка.

НО самое интересное - отдельно OnAnswer также работает ! (т.е. метод делегата вызывается)
Код: plaintext
fc.OnAnswer+=new SimpleEvent.IForumEvents_OnAnswerEventHandler(fc_OnAnswerSec); 


Проблема - нельзя посадить сразу 2 обработчика ! В Delphi 7 работают оба события. Delphi 8 вообще нифига не видит(!) обертку от type library !!!

>>SergLet
Да я года 1.5 назад плюнул на это. В принципе использовал все .net remoting / wse / msmq. Но тут принципиально захотелось разобраться с COM interop.
...
Рейтинг: 0 / 0
07.02.2004, 18:22
    #32401695
maratic_net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
Вообще весь вопрос возник при желании попользоваться COM в NET без добавления reference. Если кто-то поможет - буду рад...
А пока приведу условия задачи, и некоторые сведения

Мой пост на gotdotnet.ru
http://www.gotdotnet.ru/Forums/CommonForum/31160.aspx

авторДобрый день !

Исключительно в науных целях захотелось использовать COM объект в .NET программе без добавления reference на COM. Возникла проблема с установкой handler'ов к событиям COM обекта...


interface IEMailBox : IDispatch {
[id(0x000000c9)]
HRESULT CheckMailBox();
[id(0x000000ca)]
HRESULT Send([in] BSTR to);
[id(0x000000cb), propget, helpstring("Количество непрочитанных сообщений")]
HRESULT Count([out, retval] long* Value);
[id(0x000000cb), propput, helpstring("Количество непрочитанных сообщений")]
HRESULT Count([in] long Value);
[id(0x000000cc), propget, helpstring("ящик")]
HRESULT Host([out, retval] BSTR* Value);
[id(0x000000cc), propput, helpstring("zщик")]
HRESULT Host([in] BSTR Value);
};
//переписываю так
[ComImport, Guid("72B808BF-F2C4-4273-A180-498979052481")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch )]
public interface IEMailBox
{
void CheckMailBox();
void Send(string to);
int Count {get;set;}
string Host{get;set;}
}

[ComImport, Guid("9CD0FFFD-DB0C-4B3A-948A-FE33FDC31F33")]
public class EMB
{

}

//Далее активирую объект
EMB emb = new EMB();
(emb as IEMailBox).Host = "12";
(emb as IEMailBox).Send("dfdfs");



Проблемы возникают при добавлении обработчиков событий. Если я правильно понимаю, необходимо как-то перевести на C# следующий интерфейс


//описания событий COM объекта
dispinterface IEMailBoxEvents {
properties:
methods:
[id(0x000000c9), helpstring("При отправке почты")]
HRESULT OnSend([in] BSTR to_);
[id(0x000000ca), helpstring("При приходе почты")]
HRESULT OnReceive([in] BSTR from);
[id(0x000000cb)]
HRESULT Third(
[in] IUnknown* sender,
[in] long e);



//Я его описал следующим образом:


[ComImport, Guid("A7DD8F9E-7B15-4DDA-AF55-96EA8C7AA8B1")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IEMailBoxEvents
{
event Del_OnSend OnSend;
event Del_OnReceive OnReceive;
event Del_Third Third;
}



Но теперь при вызове
object isimp =(emb as IEMailBoxEvents);



получаем всегда isimp = null, и добавить обработчик невозможно.Подскажите пожалуйста где сидит ошибка...

Спасибо...
http://]
...
Рейтинг: 0 / 0
07.02.2004, 18:24
    #32401697
maratic_net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
И вот тут (простите за my bad english )

http://gotdotnet.com/Community/MessageBoard/Thread.aspx?id=190096

How to use COM in .NET without reference to COM Posted on: 02/06/2004 11:49:41




Hi !

I want to use COM object in .NET without adding reference to COM type library.
So I try to get type from Class ID (or prog ID).

1) The first approach is to create COM object via Activator.Createinstance:

Type EMB = Type.GetTypeFromCLSID(new Guid("9CD0FFFD-DB0C-4B3A-948A-FE33FDC31F33"));
object o = Activator.CreateInstance(EMB);

Further I use Reflection to get COM Methods & types of delegates. Type of delegates is very important because they are required to create Delegates dynamically:

System.Reflection.EventInfo OnSend = EMB.GetEvent("OnSend");
//get event OnSend of COM object

MethodInfo add_OnSend = EMB.GetMethod("add_OnSend");
//get method which add handler to event OnSend

object runt_h_send = Delegate.CreateDelegate(OnSend.EventHandlerType, this, "mb_OnSend");
// create delegate. mb_OnSend is method in current class (this.mb_OnSend)
// This method starts when event occured...

add_OnSend.Invoke(o, new object[]{runt_h_send});
//add handler

It does work... but it still requires reference to COM object :-(
When I delete reference, type EMB = System.__ComObject :-( ... and I can't
use reflection to call methods of COM object...

2) I also used second approach. I imported COM classes and interfeces using
ComImportAttribute:

[ComImport, Guid("9CD0FFFD-DB0C-4B3A-948A-FE33FDC31F33")]
public class EMB
{
//empty
}
and
[ComImport, Guid("72B808BF-F2C4-4273-A180-498979052481")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch )]
public interface IEMailBox
{
//all methods and properties declared in IDL
}

Now I can work with COM methods & properties:

EMB emb = new EMB();
(emb as IEMailBox).SomePropery = "12";
(emb as IEMailBox).SomeMethod();

But real problem is COM events...
The declaration of COM events in IDL (2 events):

[
uuid(A7DD8F9E-7B15-4DDA-AF55-96EA8C7AA8B1),
version(1.0),
helpstring("Events interface for EMailBox Object")
]
dispinterface IEMailBoxEvents
{
properties:
methods:
[id(0x000000c9), helpstring("??? ???????? ?????")]
HRESULT OnSend([in] BSTR to_);
[id(0x000000ca), helpstring("??? ??????? ?????")]
HRESULT OnReceive([in] BSTR from);
[id(0x000000cb)]

The problem is how to create managed wrapper for this dispinterface ?
I tested
[ComImport, Guid("A7DD8F9E-7B15-4DDA-AF55-96EA8C7AA8B1")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IEMailBoxEvents
{
// I don't know what I should write here
}
but (emb as IEMailBoxEvents ) is NULL ... :-(
Can you help me ?

ps. Excuse me for my bad English...
...
Рейтинг: 0 / 0
07.02.2004, 18:32
    #32401701
maratic_net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
И еще :-)
Пока копаю в сторону изучения недокументированого типа System.__ComObject

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

Мой COM класс // реализация всех интерфейсов
{ Private declarations }
FConnectionPoints: TConnectionPoints;
FConnectionPoint: TConnectionPoint;
FEvents: IEMailBoxEvents;
{ note: FEvents maintains a *single* event sink. For access to more
than one event sink, use FConnectionPoint.SinkList, and iterate
through the list of sinks. }


Что бы это значило ?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Кому нибудь удалось написать COM на делфи, а клиента на .NET ? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]