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

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

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

Есть dll файл написанный на С++ (Visual Studio) Работал с этой библиотекой в Autoit (скриптовый язык). Сейчас хочу сделать вызов из Visual Studio (C#) Сигнатуры функций в AutoIt:
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# таким образом:
 [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);
Проблема появилась с третьим методом
[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
Сигнатура проблемы:
  Имя события проблемы: 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. все равно результат один. Помогите пожалуйста.
Тип "STR" в Autoit = тип "LPCSTR/LPSTR" в WindowsAPI

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

textual
Листинг программы
[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);

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


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

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

14   голосов , оценка 4.286 из 5
Похожие ответы