![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Итак, имеем следующее : unmanaged функция вызывается с аргументами, являющимися экземплярами managed структур. Передавать такие аргументы с * и & запрещено (как мне показалось, из-за возможных плохих эффектов, связанных со сбором мусора). Хорошо. Тогда, передаём инициализированные аргументы через ref, а неинициализированные - через out. В unmanaged функции они нормально пишутся и читиются. Интересно становится, когда эта unmanaged функция вызывает другую unmanaged, передавая те самые аргументы. В ней уже попытка чтения/записи вываливается в виде :
An unhandled exception of type 'System.AccessViolationException' occurred in wrapperGslTest.exe Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. Что же делать? = Может, нужно передавать аргументы первой unmanaged функции как-то по-другому? -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Судя по всему, это как-то связано с работой P/Invoke со стеком. Большего сказать не могу, потому что не знаю.
-------------------- ![]() |
|||
|
||||
| Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
А вторая функция случаем не нарушает правил работы с переменными: не читает ли out-параметр или не пишет ли в in-параметр. Вообще, если попал в unmanaged и всё прошло нормально, то дальше можно делать с переменными как с родными, unmanaged. Второй вопрос -- соглашения о вызовах (calling conventions). Это набор договорённостей о том, как передаются переменные, значим ли регистр, кто зачищает стек переменных после завершения и др. Можно попробовать просто вызывать из первой неуправляемой функции вторую. Может, они и не дружат вовсе... |
|||
|
||||
| marcusmae |
|
||||||||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Функция действительно пишет в ref параметр! Пока не решил, как с этим быть. Дело в том, что она поэлементно копирует матрицу source в матрицу dest, проверяя совпадение размерностей (т.е. dest не может быть out т.к. должен быть инициализирован), вот код :
Решил её тоже обернуть для проверки :
При вызове получил :
Значит, ref не является аналогом *, потому что защищён от записи.
По-моему, не так уж и велик выбор возможных calling conventions. StdCall и Cdecl очищают стек сами (при этом-то и происходит вышеук. ошибка), ThisCall - для работы с классами, FastCall не поддерживается (нужен для мультиплатформенной совместимости, видимо), WinApi = StdCall или Cdecl в зависимости от системы (XP/CE). Так что выбор между StdCall и Cdecl... Сами функции дружат, т.к. примеры использования на C работают. -------------------- ἀπὸ μηχανῆς θεός |
||||||||||
|
|||||||||||
| marcusmae |
|
||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Всё, разобрался, ура. Изменил типы аргументов в прототипе обёртки unmanaged функции на IntPtr, как предлагал Дрон в предыдущей теме, только без всяких ref/out :
Используя пример из MSDN скопировал структуры в unmanaged memory :
Работает без ошибок в стеке. Спасибо всем! -------------------- ἀπὸ μηχανῆς θεός |
||||
|
|||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |