![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
nextzi0 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 28.5.2008 Где: о. Корсика Репутация: нет Всего: нет |
В общем есть подключенный к проекту COM объект, в нужном мне COM классе есть метод. Сигнатура: mScan(ref byte pDevList):void. При попытке передать параметр, выскакивает AccesViolation (попытка чтения или записи в защищенную память). Я так понял, нужно юзать P/Invoke? Как в таком случае передать параметр?
--------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник" |
|||
|
||||
mihryak |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
попробуй поиграться с STA/MTA, ошибки маршалинга нередко имеют корни в этом
|
|||
|
||||
nextzi0 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 28.5.2008 Где: о. Корсика Репутация: нет Всего: нет |
Пробовал, не в этом дело. Дело в том, что не могу передать адрес в куче как параметр в COM метод, т.к. идет несовпадение типов
--------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник" |
|||
|
||||
DarkDragon |
|
|||
![]() GradVin ![]() ![]() Профиль Группа: Участник Сообщений: 296 Регистрация: 19.8.2006 Репутация: нет Всего: 8 |
может попробовать так:
mScan([MarshalAs(UnmanagedType.LPArray)]ref byte pDevList) или использовать unsafe код вида: mScan(byte * pDevList) |
|||
|
||||
nextzi0 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 28.5.2008 Где: о. Корсика Репутация: нет Всего: нет |
MarshalAs так не используется, у меня же нет атрибута [DllImport()]
С небезопасным кодом тоже ничего не выходит. Застрял на ref byte. Нативная функция принимает параметр unsigned char * --------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник" |
|||
|
||||
mihryak |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
так может выделить память через какой-нибудь Marshal.AllocHGlobal, положить туда данные и передать указатель?
|
|||
|
||||
DarkDragon |
|
|||
![]() GradVin ![]() ![]() Профиль Группа: Участник Сообщений: 296 Регистрация: 19.8.2006 Репутация: нет Всего: 8 |
DllImport - это прямой импорт функции из неуправляемой библиотеки. MarshalAs указывает как интерпретировать (передавать, получать) параметр и данные в функции между управляемым и неуправляемым кодом. Так что не понял почему MarshalAs не может быть использован без DllImport, вроде как работаете с неуправляемым COM объектом. |
|||
|
||||
DarkDragon |
|
|||
![]() GradVin ![]() ![]() Профиль Группа: Участник Сообщений: 296 Регистрация: 19.8.2006 Репутация: нет Всего: 8 |
Еще можно попробовать так:
|
|||
|
||||
nextzi0 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 28.5.2008 Где: о. Корсика Репутация: нет Всего: нет |
Ну мне достаточно ее выделить и передать указатель, я пробовал так уже, ругается на несовместимость типов, как только я не приводил Добавлено через 2 минуты и 12 секунд DarkDragon, ну этот код mScan([MarshalAs(UnmanagedType.LPArray)]ref byte pDevList) точно не работает, иначе мне надо описать эту ф-ию с другим типом параметров и потом ее вызывать... ? Попробую --------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник" |
|||
|
||||
DarkDragon |
|
|||
![]() GradVin ![]() ![]() Профиль Группа: Участник Сообщений: 296 Регистрация: 19.8.2006 Репутация: нет Всего: 8 |
nextzi0, попробуйте еще с атрибутом [Out]byte[]. Я проверял работу на WinAPI функции - работает, возможно еще возвращается не один байт а скажем несколько, тогда возможно выходит за границы и провоцирует Access Violation?
|
|||
|
||||
nextzi0 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 28.5.2008 Где: о. Корсика Репутация: нет Всего: нет |
Argument is 'out' while parameter is declared as 'ref'.
Вот этот код в C++ работает:
Ф-я сканирует подключенные устройства и заполняет выделенную память названиями устройств. Под каждое название д.б. выделено > 80 байт (в описании к dll). Вся проблема в ref byte... Это, по сути, неверный параметр для данной ф-ии в C# --------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник" |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [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. |