Автор Тема: Импорт функции из DLL написанной на С++  (Прочитано 5517 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Мишаня [?]

  • Новичок
  • *
  • Сообщений: 4
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Есть 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

Русское сообщество AutoIt

Импорт функции из DLL написанной на С++
« Отправлен: Август 01, 2015, 11:08:40 »

Оффлайн Мишаня [?]

  • Новичок
  • *
  • Сообщений: 4

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Импорт функции из DLL написанной на С++
« Ответ #1, Отправлен: Август 02, 2015, 06:31:01 »
Решено

Цитировать
[DllImport("M:\\WORK\\Bot\\Hopper\\IncludeFiles\\OpenScrapeDLL.dll",  CallingConvention = CallingConvention.Cdecl)]
        public static extern int ReadRegion(IntPtr hwnd, string name, [In,Out] ref StringBuilder res, int offset);

Русское сообщество AutoIt

Re: Импорт функции из DLL написанной на С++
« Ответ #1 Отправлен: Август 02, 2015, 06:31:01 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
1 Ответов
10666 Просмотров
Последний ответ Октябрь 23, 2012, 13:47:39
от Isn
0 Ответов
4370 Просмотров
Последний ответ Август 01, 2011, 06:19:43
от svigelf
8 Ответов
3364 Просмотров
Последний ответ Февраль 24, 2012, 20:20:05
от uppdrag
4 Ответов
2653 Просмотров
Последний ответ Июль 25, 2012, 02:13:18
от Yashied
31 Ответов
12508 Просмотров
Последний ответ Ноябрь 28, 2012, 11:18:36
от XpycT
3 Ответов
2495 Просмотров
Последний ответ Ноябрь 01, 2012, 13:00:37
от madmasles
4 Ответов
1611 Просмотров
Последний ответ Апрель 25, 2014, 08:09:20
от Dellroc
0 Ответов
620 Просмотров
Последний ответ Октябрь 13, 2014, 17:56:46
от maklein
3 Ответов
966 Просмотров
Последний ответ Июль 13, 2015, 23:28:21
от Vovsla
3 Ответов
364 Просмотров
Последний ответ Март 24, 2017, 15:19:33
от inververs