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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Platform Invoke, Вызов функций dll и работа с памятью 
:(
    Опции темы
erjb
Дата 11.7.2013, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток. 

Вызов неуправляемого кода. Функция GetTcpTable. Принимает 3 параметра , первый это структура, параметр out, второй параметр (in out) это количество байт структуры , куда собственно будет функция писать данные, третий параметр это bool (true|false) - он нас не интересует. 

Фишка это функции в том, что при первом вызове она проверяет может ли записать данные в структуру, то есть размер структуры вмещает ли данные. Если да - то пишет , если нет - то во втором параметры указывает необходимый размер структуры и возвращает ошибку. Можно заново пересоздать структуру и снова ее вызвать (функцию) .

В примере msdn там структуре выделяется память через malloc и потом идет первичный вызов , если не хватило памяти то вызывается повторно уже с другим значением для malloc.

описание http://msdn.microsoft.com/en-us/library/aa...v=vs.85%29.aspx


Код

class Tcp
    {
        [DllImport("Iphlpapi.dll")]
        public static extern Int32 GetTcpTable(out TcpTable table, ref Int32 pdwSize, bool bOrder);
    }

//struct _MIB_TCPTABLE
    [StructLayout(LayoutKind.Sequential)]
    public class TcpTable
    {
        public Int32 dwNumEntries;
        public TcpRow []table;

        public TcpTable()
        {
            this.dwNumEntries = 0;
            this.table = new TcpRow[200];
        }

    }

//struct _MIB_TCPROW 
    [StructLayout(LayoutKind.Sequential)]
    public class TcpRow
    {
        public Int32 dwState;
        public Int32 dwLocalAddr;
        public Int32 dwLocalPort;
        public Int32 dwRemoteAddr;
        public Int32 dwRemotePort;

    }


при вызове функции Tcp.GetTcpTable 
вылетает программа, а если через дебагер - то вылетает такое исключение : An unhandled exception of type 'System.AccessViolationException' occurred in System.Windows.Forms.dll

Need help 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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