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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2013, 20:23   #1
ShinigamiRyuk
Новичок
Джуниор
 
Регистрация: 22.09.2013
Сообщений: 1
Вопрос Использование интерфейса C++ на C#

Суть проблемы в следующем: есть dll "mtmanapi.dll" написанная на C++, с заголовочным файлом "MT4ManagerAPI.h". В заголовочном файле описан класс "CManagerFactory" создающий интерфейс "CManagerInterface". Мне необходимо добиться вызова нативных функций из C# описанных в интерфейсе C++

Собственно вот часть Интерфейса CManagerInterface
Код:
class CManagerInterface
  {
public:
//--- dummy methods for delphi
   virtual int    __stdcall QueryInterface(REFIID riid,LPVOID* obj)=0;
   virtual int    __stdcall AddRef() =0;
//--- release
   virtual int    __stdcall Release()=0;
//--- service methods
   virtual void   __stdcall MemFree(void* ptr)              =0;
   virtual LPCSTR __stdcall ErrorDescription(const int code)=0;
   virtual void   __stdcall WorkingDirectory(LPCSTR path)   =0;
//--- connection
   virtual int  __stdcall Connect(LPCSTR server)                =0;
   virtual int  __stdcall Disconnect()                          =0;
   virtual int  __stdcall IsConnected()                         =0;
   virtual int  __stdcall Login(const int login,LPCSTR password)=0;
   virtual int  __stdcall LoginSecured(LPCSTR key_path)         =0;
   virtual int  __stdcall KeysSend(LPCSTR key_path)             =0;
   virtual int  __stdcall Ping()                                =0;
//--- server configuration
...
Описываю фабрику на C# следующим образом (CManagerFactory)
Код:
public class TManagerFactory
    {
        private IntPtr FLib = IntPtr.Zero;
        private TMTManGetVersion FGetVersion = null;
        private TMTManGetInterface FGetInterface = null;
        protected IManagerInterface FResult = null;

        public TManagerFactory(string dll)
            : base()
        {
            FLib = DLLWrapper.LoadLibrary(dll);

            if (FLib == IntPtr.Zero)
            {
                Console.WriteLine("Невышло");
            }
            else
            {
                FGetVersion = (TMTManGetVersion)DLLWrapper.GetFunctionAddress(FLib, "MtManVersion", typeof(TMTManGetVersion));
                FGetInterface = (TMTManGetInterface)DLLWrapper.GetFunctionAddress(FLib, "MtManCreate", typeof(TMTManGetInterface));
                if (FGetVersion == null || FGetInterface == null)
                {
                    DLLWrapper.FreeLibrary(FLib);
                }
            }
        }
        public IManagerInterface CreateAPI()
        {
            if ((FGetVersion != null) && (FGetInterface != null))
            {
                FGetInterface(FGetVersion(), ref FResult); // Здесь выскакивает исключение Не поддерживается (Исключение из HRESULT: 0x80004001 (E_NOTIMPL))
            }
            else
            {
                FResult = null;
            }
            
            return FResult;
        }

        public int GetTMTManGetVersion()
        {
            return FGetVersion();
        }

    } // end TManagerFactory
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate int TMTManGetVersion();
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate int TMTManGetInterface(int Version, ref IManagerInterface Obj);
И собственно сам интерфейс (CManagerInterface). Для начала только 2 функции
Код:
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IManagerInterface
    {
        int Connect(string Server);
        int Login(int Login, string Password);
    }
Когда я пытаюсь запустить приложение, то выдаётся исключение: Не поддерживается (Исключение из HRESULT: 0x80004001 (E_NOTIMPL))

Как я понимаю интерфейс IManagerInterface не совместим с нативным CManagerInterface. Что нужно дописать?
Буду очень признателен за помощь...
VS12 и Win8
ShinigamiRyuk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реорганизация интерфейса The_Immortal C++ Builder 3 10.05.2012 02:14
Объявеление интерфейса Peteren Visual C++ 0 25.01.2012 18:58
Создание интерфейса kirieshka Помощь студентам 0 09.04.2011 22:41
Создания интерфейса...си dampirik Помощь студентам 1 06.07.2009 14:40