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

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

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

Студворк — интернет-сервис помощи студентам
Есть 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.08.2015, 06:44
Ответы с готовыми решениями:

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

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

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

2
193 / 100 / 131
Регистрация: 23.06.2015
Сообщений: 249
01.08.2015, 20:39
Попробуйте так
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  [ТС]
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.08.2015, 23:50
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru