Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/40: Рейтинг темы: голосов - 40, средняя оценка - 4.63
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420

Сигнатура PInvoke и разбалансированный стек

12.07.2017, 10:56. Показов 8723. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Я подключаю стороннюю библиотеку и описываю её метод:
C#
1
2
[DllImport(@"CPRGL2.dll")]
public static extern long OpenAccess(int AccessHandle);
Но при попытке вызвать метод возникает исключение:
Вызов функции PInvoke "LaserDevice!LaserDevice.LaserDevice::Op enAccess" разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры PInvoke совпадают с неуправляемой целевой сигнатурой.
Проверил, что тип возвращаемых данных и тип параметра правильные. Погуглил, дописал подключение dll вот так:
C#
1
[DllImport(@"CPRGL2.dll", CallingConvention=CallingConvention.Cdecl)]
Всё равно тоже самое. Что ещё следует проверять?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.07.2017, 10:56
Ответы с готовыми решениями:

Как избавиться от исключения “вызов функции PInvoke разбалансировал стек”
Пытаюсь написать код для управления машинкой Formula Allcode. Управление осуществляется путем вызова функций из dll файла. Функции...

Вызов функции PInvoke разбалансировал стек. Дедик NFS Most Wanted
Пишу дедик игры NFS Most Wanted. Идой посмотрел функции. StartServer(char *, int, int, int) Делаю так. using System; using...

Вызов функции PInvoke разбалансировал стек
Пишу FTP клиент для своих нужд. И столкнулся с проблемой, что когда я пытаюсь делать так, как написано в этой статье...

14
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14159 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
12.07.2017, 11:07
FaceHoof, типы аргументов и тип возвращаемого значения проверь, держа в уме что Си-шные числовые типы не соответствуют один в один числовым типам в C#.
1
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
12.07.2017, 11:08
FaceHoof, а вы уверены в правильности соглашения?
0
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
12.07.2017, 11:35  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
держа в уме что Си-шные числовые типы не соответствуют один в один числовым типам в C#
(ಠ_ಠ) Вот это поворот... Ушёл курить типы данных в С++...
SeIZVeIZ, да я не уверен, что оно вообще должно быть. Просто нашёл похожий пример из интернета.

Добавлено через 8 минут
Отсюда: https://msdn.microsoft.com/ru-... s.90).aspx
Тип данных long. В C# тип данных long является 64-разрядным, а в C++ он 32-разрядный.
В этом может быть проблема?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14159 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
12.07.2017, 11:39
Цитата Сообщение от FaceHoof Посмотреть сообщение
В этом может быть проблема?
Может.
0
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
12.07.2017, 11:42  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Может.
Единственное, что мне вот так сразу приходит на ум, это поменять тип данных на 32-разрядный. Т.е. на int. Но эффекта это не оказало.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18245 / 14159 / 5366
Регистрация: 17.03.2014
Сообщений: 28,847
Записей в блоге: 1
12.07.2017, 11:43
FaceHoof, другое проверяй - тип аргумента возможно должен быть short или соглашение о вызове должно быть другим.
0
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
12.07.2017, 11:53
Цитата Сообщение от FaceHoof Посмотреть сообщение
и описываю её метод:
На Си описание показали бы OpenAccess.
0
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
12.07.2017, 11:56  [ТС]
Цитата Сообщение от RunningMan Посмотреть сообщение
На Си описание показали бы OpenAccess.
Отрыл пример на плюсах, который работает с этой же библиотекой:
C++
1
2
[DllImport("CPRGL2.dll")]
static long OpenAccess(int nProductId);
0
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
12.07.2017, 12:07
Значит пример на С+/ CLI? В C++ нет атрибутов.
Ну да ладно...
В C# значит возвращаемый тип Int32
C#
1
2
[DllImport("CPRGL2.dll")]
public static extern int OpenAccess(int nProductId);
1
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
12.07.2017, 13:49  [ТС]
Фух, вроде получилось что-то. Но логику не понял. Мне действительно пришлось поменять тип принимаемого параметра на short, как подсказал OwenGlendower. Так же мне пришлось использовать соглашение CallingConvention=CallingConvention.StdC all. Но при этом тип возвращаемого значения так и остался long. И вот теперь метод нормально вызывается.
Далее у меня есть ещё один метод, который принимает и возвращает long. И тут пришлось поменять тип принимаемого параметра на int, как подсказывал RunningMan, но оказалось нельзя менять тип возвращаемого значения.
Не вижу логики в этой магии... Но теперь всё работает. Благодарю за подсказки =)

Добавлено через 1 час 14 минут
Ещё вопросик из той же оперы: Есть ли подобные особенности при объявлении структур? Один метод принимает структуру, вот её пример:
C++
1
2
3
4
5
6
7
8
9
[StructLayout(LayoutKind::Sequential, Pack = 1)] 
public ref struct PUNIT_PARAMETER
{
    unsigned long IntegrationTime;
    Byte Gain;
    Byte TriggerEdge;
    Byte TriggerMode;
    Byte LDPower;
};
как я её сделал на C#:
C#
1
2
3
4
5
6
7
8
9
[StructLayout(LayoutKind.Sequential, Pack=1)]
        public struct PUNIT_PARAMETER
        {
            public long IntegrationTime;
            public Byte Gain;
            public Byte TiggerEdge;
            public Byte TiggerMode;
            public Byte LDPower;
        }
С типами данных внутри структуры уже пробовал играться (в частности заменял long на int и Byte на byte), не помогло.
0
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
12.07.2017, 14:17
Цитата Сообщение от FaceHoof Посмотреть сообщение
public ref struct
Структура помечена как управляемая.
Цитата Сообщение от FaceHoof Посмотреть сообщение
Один метод принимает структуру,
Хорошо бы показать сигнатуру на С++.


Цитата Сообщение от RunningMan Посмотреть сообщение
Структура помечена как управляемая.
То есть в вашем случае нужен класс, а не структура.
0
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
12.07.2017, 14:22  [ТС]
Цитата Сообщение от RunningMan Посмотреть сообщение
Структура помечена как управляемая.
Но ведь в C# я не могу написать public ref struct. Студия сразу же ругается "недопустимый токен".
Цитата Сообщение от RunningMan Посмотреть сообщение
Хорошо бы показать сигнатуру на С++.
C++
1
2
[DllImport("CPRGL2.dll")]
    static unsigned short GetParameter(long lDeviceHandle, PUNIT_PARAMETER^ stParam);
Добавлено через 2 минуты
Цитата Сообщение от RunningMan Посмотреть сообщение
То есть в вашем случае нужен класс, а не структура.
(ಠ_ಠ) Вот это поворот, дубль два. И... каким он должен быть? Просто:
C#
1
2
3
4
5
6
7
8
public class PUNIT_PARAMETER
        {
            public long IntegrationTime {get; set;}
            public Byte Gain { get; set; }
            public Byte TiggerEdge { get; set; }
            public Byte TiggerMode { get; set; }
            public Byte LDPower { get; set; }
        }
?
0
 Аватар для RunningMan
278 / 186 / 75
Регистрация: 12.04.2017
Сообщений: 1,088
Записей в блоге: 2
12.07.2017, 14:27
Цитата Сообщение от FaceHoof Посмотреть сообщение
public ref struct.
Заменить структуру на класс.
Или оставить как есть и отправить с параметром ref

C#
1
    ushort GetParameter(long lDeviceHandle, ref PUNIT_PARAMETER stParam);
Добавлено через 37 секунд
Цитата Сообщение от FaceHoof Посмотреть сообщение
И... каким он должен быть? Просто:
Исправил, извините:
C#
1
2
3
4
5
6
7
8
9
[StructLayout(LayoutKind.Sequential, Pack=1)]
        public class PUNIT_PARAMETER
        {
            public long IntegrationTime;
            public Byte Gain;
            public Byte TiggerEdge;
            public Byte TiggerMode;
            public Byte LDPower;
        }
Добавлено через 3 минуты
Без реальной библиотеки конечно трудно сказать.
Это всё предположения.
1
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
12.07.2017, 14:32  [ТС]
Цитата Сообщение от RunningMan Посмотреть сообщение
Или оставить как есть и отправить с параметром ref
Помогло, класс не обязателен. Благодарю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.07.2017, 14:32
Помогаю со студенческими работами здесь

VS2012 на win 8: ошибка "Вызов функции PInvoke разбалансировал стек"
Глупый вопрос, в Studio впервые, установил 2012 для написания управления тайлами под 8-ку, не могу запустить внешнее приложение в VB,...

Вызов функции PInvoke "Cursor_position!WindowsApplication1.Form1::keybd_event" разбалансировал стек
Доброго времени! Объясните, пожалуйста, смысл ошибки (чего оно от меня хочет), и как ее победить. Имею простой скрипт типа...

Вызов функции PInvoke "WindowsFormsApplication9!WindowsFormsApplication9.Form1::mouse_event" разбалансировал стек
Вызов функции PInvoke "WindowsFormsApplication9!WindowsFormsApplication9.Form1::mouse_event" разбалансировал стек. Вероятно, это вызвано...

PInvoke из C++ к C#
Добрый день. Написал на C++ вот такую dll-ку: extern "C" __declspec( dllexport ) int MyFunc(int parm1) { ****return parm1*2; } ...

Вызов функции PInvoke ошибка
Всем доброго времени суток.Я начинающий программист(Работаю на visual basic 2010). И только начал изучать API и сразу же столкнулся с такой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru