Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача параметра в COM метод, C# 
:(
    Опции темы
nextzi0
Дата 14.3.2013, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.5.2008
Где: о. Корсика

Репутация: нет
Всего: нет



В общем есть подключенный к проекту COM объект, в нужном мне COM классе есть метод. Сигнатура: mScan(ref byte pDevList):void. При попытке передать параметр, выскакивает AccesViolation (попытка чтения или записи в защищенную память). Я так понял, нужно юзать P/Invoke? Как в таком случае передать параметр?
--------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник"
PM MAIL ICQ   Вверх
mihryak
Дата 14.3.2013, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



попробуй поиграться с STA/MTA, ошибки маршалинга нередко имеют корни в этом
PM MAIL ICQ   Вверх
nextzi0
Дата 15.3.2013, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.5.2008
Где: о. Корсика

Репутация: нет
Всего: нет



Пробовал, не  в этом дело. Дело в том, что не могу передать адрес в куче как параметр в COM метод, т.к. идет несовпадение типов
--------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник"
PM MAIL ICQ   Вверх
DarkDragon
Дата 15.3.2013, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: нет
Всего: 8



может попробовать так:
mScan([MarshalAs(UnmanagedType.LPArray)]ref byte pDevList)

или использовать unsafe код вида:
mScan(byte * pDevList)
PM MAIL   Вверх
nextzi0
Дата 15.3.2013, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.5.2008
Где: о. Корсика

Репутация: нет
Всего: нет



MarshalAs так не используется, у меня же нет атрибута [DllImport()]
С небезопасным кодом тоже ничего не выходит. Застрял на ref byte. Нативная функция принимает параметр unsigned char *
--------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник"
PM MAIL ICQ   Вверх
mihryak
Дата 15.3.2013, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



так может выделить память через какой-нибудь Marshal.AllocHGlobal, положить туда данные и передать указатель?
PM MAIL ICQ   Вверх
DarkDragon
Дата 15.3.2013, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: нет
Всего: 8



Цитата(nextzi0 @  15.3.2013,  15:51 Найти цитируемый пост)
MarshalAs так не используется, у меня же нет атрибута [DllImport()]

DllImport - это прямой импорт функции из неуправляемой библиотеки. MarshalAs указывает как интерпретировать (передавать, получать) параметр и данные в функции между управляемым и неуправляемым кодом. Так что не понял почему MarshalAs не может быть использован без DllImport, вроде как работаете с неуправляемым COM объектом.
PM MAIL   Вверх
DarkDragon
Дата 15.3.2013, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: нет
Всего: 8



Еще можно попробовать так: 
Код

mScan([Out] byte[] pDevList)
...
byte[] bData = new byte[1];
mScan(bData);

PM MAIL   Вверх
nextzi0
Дата 16.3.2013, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.5.2008
Где: о. Корсика

Репутация: нет
Всего: нет



Цитата(mihryak @ 15.3.2013,  17:36)
так может выделить память через какой-нибудь Marshal.AllocHGlobal, положить туда данные и передать указатель?

Ну мне достаточно ее выделить и передать указатель, я пробовал так уже, ругается на несовместимость типов, как только я не приводил

Добавлено через 2 минуты и 12 секунд
DarkDragon, ну этот код mScan([MarshalAs(UnmanagedType.LPArray)]ref byte pDevList) точно не работает, иначе мне надо описать эту ф-ию с другим типом параметров и потом ее вызывать... ? Попробую
--------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник"
PM MAIL ICQ   Вверх
DarkDragon
Дата 16.3.2013, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GradVin
**


Профиль
Группа: Участник
Сообщений: 296
Регистрация: 19.8.2006

Репутация: нет
Всего: 8



nextzi0, попробуйте еще с атрибутом [Out]byte[]. Я проверял работу на WinAPI функции - работает, возможно еще возвращается не один байт а скажем несколько, тогда возможно выходит за границы и провоцирует Access Violation?
PM MAIL   Вверх
nextzi0
Дата 18.3.2013, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.5.2008
Где: о. Корсика

Репутация: нет
Всего: нет



Argument is 'out' while parameter is declared as 'ref'.

Вот этот код в C++ работает:

Код

unsigned char *pTest[10];
for (i=0; i<10; i++)
            pTest[i] = (unsigned char *)malloc(100);

bootCOM->mScan((unsigned char *)pTest);

i= 0;
while (pTest[i] != 0)
{
    printf("Device %d = %s\n\r", i, pTest[i]);
    i++;
}


Ф-я сканирует подключенные устройства и заполняет выделенную память названиями устройств. Под каждое название д.б. выделено > 80 байт (в описании к dll).

Вся проблема в ref byte... Это, по сути, неверный параметр для данной ф-ии в C#
--------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник"
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1336 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.