Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
5 / 5 / 2
Регистрация: 07.12.2011
Сообщений: 46
1

Импорт функции из DLL написанной на С++

01.08.2015, 06:44. Показов 1672. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть dll файл написанный на С++ (Visual Studio)

Работал с этой библиотекой в Autoit (скриптовый язык). Сейчас хочу сделать вызов из Visual Studio (C#)

Сигнатуры функций в AutoIt:

PHP
1
2
3
DllCall($scrapeDll, "int:cdecl", "OpenTablemap", "str", $name)
DllCall($scrapeDll, "none:cdecl", "GetRegionPos", "str", $name, "int*", $posl, "int*", $post, "int*", $posr, "int*", $posb)
DllCall($scrapeDll, "int:cdecl", "ReadRegion", "hwnd", $hWnd, "str", $name, "str*", "", "int", $offset)
После двух вечеров чтения получилось вызвать первые две функции на C# таким образом:

C#
1
2
3
4
 [DllImport("M:\\WORK\\Bot\\Hopper\\IncludeFiles\\OpenScrapeDLL.dll",CallingConvention=CallingConvention.Cdecl)]
        public static extern int OpenTablemap(string name);
        [DllImport("M:\\WORK\\Bot\\Hopper\\IncludeFiles\\OpenScrapeDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void GetRegionPos(string name, [Out]out int posl, [Out]out int post, [Out]out int posr, [Out] out int posb);
Проблема появилась с третьим методом

C#
1
2
[DllImport("M:\\WORK\\Bot\\Hopper\\IncludeFiles\\OpenScrapeDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int ReadRegion(IntPtr hwnd, string name, /*[Out] out string*/[Out][MarshalAs(UnmanagedType.LPStr)]out string res, int offset);
В этой функции в третий параметр (out string) в dllке пишется результат. Возникает ошибка BEX

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Сигнатура проблемы:
  Имя события проблемы:   BEX
  Имя приложения:  TestIt.exe
  Версия приложения:    1.0.0.0
  Отметка времени приложения:   55bc2923
  Имя модуля с ошибкой:    MSVCR80.dll
  Версия модуля с ошибкой:  8.0.50727.6229
  Отметка времени модуля с ошибкой: 4ec352ab
  Смещение исключения:    00014584
  Код исключения:  c000000d
  Данные исключения:    00000000
  Версия ОС:    6.1.7601.2.1.0.768.2
  Код языка:    1049
  Дополнительные сведения 1:  e926
  Дополнительные сведения 2:  e9263950142051511ceadcb55c0aa80c
  Дополнительные сведения 3:  50c5
  Дополнительные сведения 4:  50c5f26c14812fb53e761ddbe4594ddb
Пробовал различные сигнатуры для третьего параметра: просто String (без Marshak as LPstr), пробовал универсальный указатель - IntPtr. все равно результат один.

Помогите пожалуйста.

Добавлено через 21 минуту
Тип "STR" в Autoit = тип "LPCSTR/LPSTR" в WindowsAPI
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.08.2015, 06:44
Ответы с готовыми решениями:

Импорт метода из Dll написанной на C++
Всем привет! Вот какая проблема. Нужно вызвать метод из Dll написанный на c++. Вот как выглядит...

Импорт из dll, написанной на C++. Разбалансирован стек
Добрый день! У меня есть библиотека example.dll. Известно что она разработана на с++. известно в...

Вызов программой, написанной на С++, функции из dll, написанной на Assembler (явное подключение dll)
Доброго времени суток!Задали лабораторную работу: программа, написанная на с++ должна подключать...

C++ импорт функций dll написанной на c#
Здравствуйте, профессионалы! В общем суть вопроса в импорте функций из DLL написанной на C#....

2
193 / 100 / 131
Регистрация: 23.06.2015
Сообщений: 249
01.08.2015, 20:39 2
Попробуйте так
C#
1
2
[DllImport("M:\\WORK\\Bot\\Hopper\\IncludeFiles\\OpenScrapeDLL.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern int ReadRegion(IntPtr hwnd, string name, [Out][MarshalAs(UnmanagedType.LPStr)]StringBuilder res, int offset);
1
5 / 5 / 2
Регистрация: 07.12.2011
Сообщений: 46
01.08.2015, 23:50  [ТС] 3
Cuellius, Спасибо огромное! Как? Откуда Вы это знаете? Хотя нет, вникать в тонкости представления данных на платформе мне не хочется. просто спасибо.
Правда функция пока возвращает неверный результат, но думаю это где то мой косяк. Главное функция прорабатывает и не вылетает.

Добавлено через 37 минут
Cuellius,
Разобрался чего не хватало. Необходимо добавить "ref" перед параметром String Builder. LPSTR и Chatset можно упустить. Вот так работает:
C#
1
2
        [DllImport("M:\\WORK\\Bot\\Hopper\\IncludeFiles\\OpenScrapeDLL.dll",  CallingConvention = CallingConvention.Cdecl/*, CharSet = CharSet.Ansi*/)]
        public static extern int ReadRegion(IntPtr hwnd, string name, [In,Out] ref StringBuilder res, int offset);
Может кому понадобиться, если у вас трудности с переводом импорта, пользуйтесть PInvoker.com. Бесплатная прога, суть такова: загружаешь .DLL и заголовочный файл .h для этих функций. Результат будет - код на C#. Если нет заголовочного файла, можно ручками прописать его в блокноте. Главное лишь иметь сигнатуру методов.
1
01.08.2015, 23:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2015, 23:50
Помогаю со студенческими работами здесь

Импорт в Delphi функций из dll, написанной на C++
Здравствуйте! Наверное, многие сталкивались со следующей проблеммой: При попытке в Delphi...

Импортировать функции из DLL, написанной на C
Добрый день, имеется библиотека, написанная на C. Как её грамотно импортировать в C#. Пока не...

Вызов функции из dll написанной на C
Привет всем! Возникла такая задача, решить не могу ни как. Есть dll. В ней есть функция (вроде...

Подгрузка функции из dll, написанной на C++
Добрый день. Написал dll-ку на С++. Она состоит из файлов .h и .cpp. В файле .h прописано ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru