Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C# импорт метода из Dll написанной на C++

52K
22 сентября 2010 года
head-dron
5 / / 09.11.2009
Всем привет! Вот какая проблема. Нужно вызвать метод из 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);


вызываю его вот так:

 
Код:
void** n = null;
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);


вываливается исключение:

Цитата:
Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))



Сам вопрос: Как мне получить из этого указателя объект? Пробовал описывать сам интерфейс но получается такое же исключение. Что делать?

2.2K
23 сентября 2010 года
REFOT
181 / / 08.04.2005
http://habrahabr.ru/blogs/personal/101589/
52K
23 сентября 2010 года
head-dron
5 / / 09.11.2009
Но тут, в примерах по ссылке, в C++ коде интерфейсы наследуются от IUnknown.
А в моем случае используется нечто подобное:

Код:
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);
}
2.2K
23 сентября 2010 года
REFOT
181 / / 08.04.2005
Ну как говорит нам MSDN, функция Marshal.GetObjectForIUnknown как раз и принимает указатель на объект наследованный от IUnknown.
Проблем то нет унаследовать IBase от IUnknown и реализовать методы AddRef, Release, QueryInterface.
52K
23 сентября 2010 года
head-dron
5 / / 09.11.2009
С этим как раз и есть проблемы. Так как библиотеки не мои. Это SDK.
2.2K
23 сентября 2010 года
REFOT
181 / / 08.04.2005
Ну, как вариант можно написать свою обёртку для этих библиотек используя, например тот же способ, что описан в статье. Правда я посмотрел на этот SDK, задолбаться можно :). Возможно есть и более простое решение.
5
23 сентября 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: head-dron
Но тут, в примерах по ссылке, в C++ коде интерфейсы наследуются от IUnknown.

Что мешает использовать этот SDK из MC++?

52K
24 сентября 2010 года
head-dron
5 / / 09.11.2009
>hardcase
Проект пишется в C#.

Ну скорее всего придется вставлять костыль в проект и делать свою промежуточную dll на с++.
5
24 сентября 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: head-dron
>hardcase
Проект пишется в C#.

Ну скорее всего придется вставлять костыль в проект и делать свою промежуточную dll на с++.


MC++ нужен какраз в таких неясных случаях.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог