C# импорт метода из Dll написанной на C++
Вот как выглядит его прототип:
Код:
USTEXPORT USTFUNC UstCreateRootObject (REFGUID id, uint64 version, ILogger *logger, IPnm **dst, uint *error)
Долго разбираясь я перевел его в приемлимый вид для C# и сделал импорт:
Код:
[DllImport("HwKeyChk.dll")]
public unsafe static extern bool UstCreateRootObject(ref Guid id, Int64 version, void* logger, ref void** Pnm, ref uint error);
public unsafe static extern bool UstCreateRootObject(ref Guid id, Int64 version, void* logger, ref void** Pnm, ref uint error);
вызываю его вот так:
Код:
void** n = null;
uint error = 0;
bool rel = UstCreateRootObject(ref PNM_API_ID, PNM_API_VERSION, null, ref n, ref error);
uint error = 0;
bool rel = UstCreateRootObject(ref PNM_API_ID, PNM_API_VERSION, null, ref n, ref error);
Первые два аргумента работают верно, то есть идентификатор и версия там внутри метода сравниваются и выдают положительный результат. Третий аргумерт не требуется в использовании и я его не трогаю. Пятый тоже работает исправно. В результате выполнения данного метода в четвертый аргумент возвращается указатель на указатель на интерфейс. То есть там внутри создается объект и к нам возвращается указатель на указатель на этот объект.
Вот из этого объекта мне нужно получить этот интерфейс чтобы вызвать из него другой метод, но при попытке сделать следующее:
Код:
IntPtr ptr = new IntPtr(*n);
object Key = Marshal.GetObjectForIUnknown(ptr);
object Key = Marshal.GetObjectForIUnknown(ptr);
вываливается исключение:
Цитата:
Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))
Сам вопрос: Как мне получить из этого указателя объект? Пробовал описывать сам интерфейс но получается такое же исключение. Что делать?
А в моем случае используется нечто подобное:
Код:
interface IBase
{
USTMETHODV_(uint) AddRef (void);
USTMETHODV_(void) Release (void);
USTMETHODV_(uint) GetLastError (void);
}
interface IHwKeyCheck : IBase
{
USTMETHODV_(BOOL) RegStatusHandler(IHwKeyStatusHandler *val);
USTMETHODV_(BOOL) CheckKey( void);
}
{
USTMETHODV_(uint) AddRef (void);
USTMETHODV_(void) Release (void);
USTMETHODV_(uint) GetLastError (void);
}
interface IHwKeyCheck : IBase
{
USTMETHODV_(BOOL) RegStatusHandler(IHwKeyStatusHandler *val);
USTMETHODV_(BOOL) CheckKey( void);
}
MSDN, функция Marshal.GetObjectForIUnknown как раз и принимает указатель на объект наследованный от IUnknown.
Проблем то нет унаследовать IBase от IUnknown и реализовать методы AddRef, Release, QueryInterface.
Ну как говорит нам
Проблем то нет унаследовать IBase от IUnknown и реализовать методы AddRef, Release, QueryInterface.
С этим как раз и есть проблемы. Так как библиотеки не мои. Это SDK.
Ну, как вариант можно написать свою обёртку для этих библиотек используя, например тот же способ, что описан в статье. Правда я посмотрел на этот SDK, задолбаться можно :). Возможно есть и более простое решение.
Цитата: head-dron
Но тут, в примерах по ссылке, в C++ коде интерфейсы наследуются от IUnknown.
Что мешает использовать этот SDK из MC++?
Проект пишется в C#.
Ну скорее всего придется вставлять костыль в проект и делать свою промежуточную dll на с++.
Цитата: head-dron
>hardcase
Проект пишется в C#.
Ну скорее всего придется вставлять костыль в проект и делать свою промежуточную dll на с++.
Проект пишется в C#.
Ну скорее всего придется вставлять костыль в проект и делать свою промежуточную dll на с++.
MC++ нужен какраз в таких неясных случаях.