Суть проблемы в следующем: есть 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