Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
|
|||
|---|---|---|---|
|
#18+
Привет ! Я уже несколько дней мучаюсь... Проблема - пишу 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2004, 03:58 |
|
||
|
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
|
|||
|---|---|---|---|
|
#18+
Ошибся с описанием ошибки. Сейчас снова начинать копать VFW_E_NEED_OWNER This object can only be created as an aggregated object. 0x80040202 514 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2004, 04:01 |
|
||
|
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2004, 11:37 |
|
||
|
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
|
|||
|---|---|---|---|
|
#18+
Вот плюнул бы ты на Делфи и занялся бы NET.Remoting маршалинг через границы приложения! А COM - это уже прошлое, хотя его еще много! Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2004, 15:19 |
|
||
|
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
|
|||
|---|---|---|---|
|
#18+
Привет всем Во первых отвечу на вопрос как я работаю с событиями.. Да как обычно. Действительно .NET видит 2 события COM объекта. То есть все чисто. SimpleEvent.ForumClass fc = new SimpleEvent.ForumClass(); Код: plaintext 1. НО самое интересное - отдельно OnAnswer также работает ! (т.е. метод делегата вызывается) Код: plaintext Проблема - нельзя посадить сразу 2 обработчика ! В Delphi 7 работают оба события. Delphi 8 вообще нифига не видит(!) обертку от type library !!! >>SergLet Да я года 1.5 назад плюнул на это. В принципе использовал все .net remoting / wse / msmq. Но тут принципиально захотелось разобраться с COM interop. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2004, 18:18 |
|
||
|
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
|
|||
|---|---|---|---|
|
#18+
Вообще весь вопрос возник при желании попользоваться 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://] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2004, 18:22 |
|
||
|
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
|
|||
|---|---|---|---|
|
#18+
И вот тут (простите за 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... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2004, 18:24 |
|
||
|
Кому нибудь удалось написать COM на делфи, а клиента на .NET ?
|
|||
|---|---|---|---|
|
#18+
И еще :-) Пока копаю в сторону изучения недокументированого типа 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. } Что бы это значило ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2004, 18:32 |
|
||
|
|

start [/forum/topic.php?fid=20&gotonew=1&tid=1439602]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
9ms |
get first new msg: |
5ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 358ms |

| 0 / 0 |
