Что нового

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

Мишаня

Новичок
Сообщения
4
Репутация
0
Есть 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# таким образом:

Код 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);
Проблема появилась с третьим методом

Код С#
[DllImport("M:\\WORK\\Bot\\Hopper\\IncludeFiles\\OpenScrapeDLL.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int ReadRegion(IntPtr hwnd, string name,[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. все равно результат один.

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

Добавлено через 21 минуту
Тип "STR" в Autoit = тип "LPCSTR/LPSTR" в WindowsAPI
 
Верх