Импорт функции из DLL написанной на С++ - C#
Формулировка задачи:
Есть dll файл написанный на С++ (Visual Studio)
Работал с этой библиотекой в Autoit (скриптовый язык). Сейчас хочу сделать вызов из Visual Studio (C#)
Сигнатуры функций в AutoIt:
После двух вечеров чтения получилось вызвать первые две функции на C# таким образом:
Проблема появилась с третьим методом
В этой функции в третий параметр (out string) в dllке пишется результат. Возникает ошибка BEX
Пробовал различные сигнатуры для третьего параметра: просто String (без Marshak as LPstr), пробовал универсальный указатель - IntPtr. все равно результат один.
Помогите пожалуйста.
Листинг программы
- 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)
Листинг программы
- [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);
Листинг программы
- Сигнатура проблемы:
- Имя события проблемы: 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
Тип "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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д