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

Узнай цену своей работы

Формулировка задачи:

Всем привет! Вот какая проблема. Нужно вызвать метод из Dll написанный на c++. Вот как выглядит его прототип:
Листинг программы
  1. USTEXPORT USTFUNC UstCreateRootObject (REFGUID id, uint64 version, ILogger *logger, IPnm **dst, uint *error)
Долго разбираясь я перевел его в приемлимый вид для C# и сделал импорт:
Листинг программы
  1. [DllImport("HwKeyChk.dll")]
  2. public unsafe static extern bool UstCreateRootObject(ref Guid id, Int64 version, void* logger, ref void** Pnm, ref uint error);
вызываю его вот так:
Листинг программы
  1. void** n = null;
  2. uint error = 0;
  3. bool rel = UstCreateRootObject(ref PNM_API_ID, PNM_API_VERSION, null, ref n, ref error);
Первые два аргумента работают верно, то есть идентификатор и версия там внутри метода сравниваются и выдают положительный результат. Третий аргумерт не требуется в использовании и я его не трогаю. Пятый тоже работает исправно. В результате выполнения данного метода в четвертый аргумент возвращается указатель на указатель на интерфейс. То есть там внутри создается объект и к нам возвращается указатель на указатель на этот объект. Вот из этого объекта мне нужно получить этот интерфейс чтобы вызвать из него другой метод, но при попытке сделать следующее:
Листинг программы
  1. IntPtr ptr = new IntPtr(*n);
  2. object Key = Marshal.GetObjectForIUnknown(ptr);
вываливается исключение:
Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))
Сам вопрос: Как мне получить из этого указателя объект? Пробовал описывать сам интерфейс но получается такое же исключение. Что делать?

Решение задачи: «C# импорт метода из Dll написанной на C++»

textual
Листинг программы
  1. interface IShow
  2. {
  3.     void ShowMsg();
  4. }
  5.  
  6. class Show : IShow
  7. {
  8.     string r;
  9.  
  10.     public Show(string res)
  11.     {
  12.         r = res;
  13.     }
  14.  
  15.     public void ShowMsg()
  16.     {
  17.         MessageBox.Show(r);
  18.     }
  19. }
  20. ...
  21. Show d = new Show("Здесь текст.");
  22. IntPtr hD = Marshal.GetIUnknownForObject(d); // но по условию у нас уже есть указатель.
  23. IShow show = (IShow)Marshal.GetObjectForIUnknown(hD);
  24. show.ShowMsg(); // Здесь текст.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы