Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2013, 19:00   #1
Voipp
Пользователь
 
Регистрация: 03.08.2009
Сообщений: 32
Счастье вызов COM-объекта

моя задача : поиспользовать C++ COM-объект в C#.

вот создал я интерфейс IDL:
Код:
import "unknwn.idl";

[
object,
uuid(1221db62-f3d8-11d4-825d-00104b3646c0),
helpstring("interface IAdd is used for implementing a super-fast addition Algorithm")
]

interface IAdd : IUnknown
    {
    HRESULT     SetFirstNumber(long nX1);

    HRESULT     SetSecondNumber(long nX2);
    
    HRESULT     DoTheAddition([out,retval] long *pBuffer);
    };



[
object,
uuid(6bee2d26-f3d8-11d4-825d-00104b3646c0),
helpstring("interface  IFileIO is used for enabling the COM object to log the operations to a file.")
]

//
//The interface IFileIO when implemented by a COM object will allow clients
//to control the logging of activity to a disk file.
//
interface IFileIO : IUnknown
    {

    //
    //to enable logging , pass nEnable=1 
    //to stop logging pass nEnable=0
    //
    HRESULT     EnableLog(long nEnable);

    //
    //if logging has been enabled then, pEnabled passes back 1
    //otherwise 0 
    //
    HRESULT     IsEnabled(long *pEnabled);
    };




[
uuid(3ff1aab8-f3d8-11d4-825d-00104b3646c0),
helpstring("Interfaces for Code-Guru algorithm implementations .")
]
library CodeGuruMathLib
    {
	importlib("stdole32.tlb");
	importlib("stdole2.tlb");

    interface IAdd;
    interface IFileIO;
    }
скомпилил,в реестр зарегистрировал, даже сделал сборку из Type Library Data , посредством tlbimp.exe.
Подключил сборку и написал маршаллинг для COM:

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

[ComImport, Guid("92E7A9C2-F4CB-11D4-825D-00104B3646C0")]
class KillMe
{

};



[Guid("1221DB62-F3d8-11D4-825D-00104B3646C0"), InterfaceType(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIUnknown)]

interface A
{
    void     SetFirstNumber(long nX1);

    void    SetSecondNumber(long nX2);
    
    IntPtr      DoTheAddition();
}

namespace ClientCSharp
{



    class Program
    {

        

        static void Main(string[] args)
        {


            KillMe km = new KillMe();
          
            A a = (A)km;

            a.SetFirstNumber(4);
            a.SetSecondNumber(16);

            IntPtr p = a.DoTheAddition();

            Console.WriteLine( p.ToInt32() );
            
            Console.ReadLine();
        }
    }
}
вылезает ошибка, что E_NOINTERFACE невозможно привести COM-объект к заданному типу.Видимо Queryinterface не может найти интерфейс, но почему?

PS Тут мне подсказали, что можно с помощью oleviewer.exe просмотреть какие интерфейсы зарегистрированы, но я не понимаю как им пользоваться

Последний раз редактировалось Stilet; 11.09.2013 в 19:39.
Voipp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Java] Создание объекта внутри объекта этогоже класса. Svarogich Помощь студентам 2 01.08.2011 16:03
C# Вызов метода без создания объекта. Предотвращение изменения фокуса. Colder M Помощь студентам 3 03.05.2011 23:42
CLR. Ошибка C3918. Как вызвать из объекта обработчик, переданный родителю объекта от деда? Stilet Общие вопросы .NET 0 15.01.2011 17:49
Вызов методов объекта из функции? jojahti Общие вопросы C/C++ 3 03.08.2009 16:57
С помощью методов и свойств объекта осуществляется управление терминалом. Имя (идентификатор) объекта User>lia Общие вопросы Delphi 4 16.01.2009 16:37