| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > способы передачи аргументов в функцию из unmanaged |
| Автор: marcusmae 22.8.2006, 14:59 |
| Итак, имеем следующее : 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 22.8.2006, 18:25 |
| Судя по всему, это как-то связано с работой P/Invoke со стеком. Большего сказать не могу, потому что не знаю. |
| Автор: marcusmae 23.8.2006, 16:03 | ||||||||||
Функция действительно пишет в ref параметр! Пока не решил, как с этим быть. Дело в том, что она поэлементно копирует матрицу source в матрицу dest, проверяя совпадение размерностей (т.е. dest не может быть out т.к. должен быть инициализирован), вот код :
Решил её тоже обернуть для проверки :
При вызове получил :
Значит, ref не является аналогом *, потому что защищён от записи.
По-моему, не так уж и велик выбор возможных calling conventions. StdCall и Cdecl очищают стек сами (при этом-то и происходит вышеук. ошибка), ThisCall - для работы с классами, FastCall не поддерживается (нужен для мультиплатформенной совместимости, видимо), WinApi = StdCall или Cdecl в зависимости от системы (XP/CE). Так что выбор между StdCall и Cdecl... Сами функции дружат, т.к. примеры использования на C работают. |
| Автор: marcusmae 23.8.2006, 23:14 | ||||
Всё, разобрался, ура. Изменил типы аргументов в прототипе обёртки unmanaged функции на IntPtr, как предлагал Дрон в http://forum.vingrad.ru/index.php?showtopic=108695, только без всяких ref/out :
Используя http://msdn2.microsoft.com/en-us/library/4ca6d5z7.aspx скопировал структуры в unmanaged memory :
Работает без ошибок в стеке. Спасибо всем! |