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

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

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

Есть dll файл написанный на С++ (Visual Studio) Работал с этой библиотекой в Autoit (скриптовый язык). Сейчас хочу сделать вызов из Visual Studio (C#) Сигнатуры функций в AutoIt:
Листинг программы
  1. DllCall($scrapeDll, "int:cdecl", "OpenTablemap", "str", $name)
  2. DllCall($scrapeDll, "none:cdecl", "GetRegionPos", "str", $name, "int*", $posl, "int*", $post, "int*", $posr, "int*", $posb)
  3. DllCall($scrapeDll, "int:cdecl", "ReadRegion", "hwnd", $hWnd, "str", $name, "str*", "", "int", $offset)
После двух вечеров чтения получилось вызвать первые две функции на C# таким образом:
Листинг программы
  1. [DllImport("M:\\WORK\\Bot\\Hopper\\IncludeFiles\\OpenScrapeDLL.dll",CallingConvention=CallingConvention.Cdecl)]
  2. public static extern int OpenTablemap(string name);
  3. [DllImport("M:\\WORK\\Bot\\Hopper\\IncludeFiles\\OpenScrapeDLL.dll", CallingConvention = CallingConvention.Cdecl)]
  4. public static extern void GetRegionPos(string name, [Out]out int posl, [Out]out int post, [Out]out int posr, [Out] out int posb);
Проблема появилась с третьим методом
Листинг программы
  1. [DllImport("M:\\WORK\\Bot\\Hopper\\IncludeFiles\\OpenScrapeDLL.dll", CallingConvention = CallingConvention.Cdecl)]
  2. 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
Листинг программы
  1. Сигнатура проблемы:
  2. Имя события проблемы: BEX
  3. Имя приложения: TestIt.exe
  4. Версия приложения: 1.0.0.0
  5. Отметка времени приложения: 55bc2923
  6. Имя модуля с ошибкой: MSVCR80.dll
  7. Версия модуля с ошибкой: 8.0.50727.6229
  8. Отметка времени модуля с ошибкой: 4ec352ab
  9. Смещение исключения: 00014584
  10. Код исключения: c000000d
  11. Данные исключения: 00000000
  12. Версия ОС: 6.1.7601.2.1.0.768.2
  13. Код языка: 1049
  14. Дополнительные сведения 1: e926
  15. Дополнительные сведения 2: e9263950142051511ceadcb55c0aa80c
  16. Дополнительные сведения 3: 50c5
  17. Дополнительные сведения 4: 50c5f26c14812fb53e761ddbe4594ddb
Пробовал различные сигнатуры для третьего параметра: просто String (без Marshak as LPstr), пробовал универсальный указатель - IntPtr. все равно результат один. Помогите пожалуйста.
Тип "STR" в Autoit = тип "LPCSTR/LPSTR" в WindowsAPI

Решение задачи: «Импорт функции из DLL написанной на С++»

textual
Листинг программы
  1. [DllImport("M:\\WORK\\Bot\\Hopper\\IncludeFiles\\OpenScrapeDLL.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
  2. public static extern int ReadRegion(IntPtr hwnd, string name, [Out][MarshalAs(UnmanagedType.LPStr)]StringBuilder res, int offset);

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


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

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

14   голосов , оценка 4.286 из 5

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

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

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