Managed code in C#

Home Forums Discussions Support Portal Managed code in C#

This topic contains 4 replies, has 2 voices, and was last updated by  Jaze 10 years, 10 months ago.

Viewing 5 posts - 1 through 5 (of 5 total)
  • Author
    Posts
  • #5062

    Jaze
    Participant

    Использую CNdisApi в managed _gc классе. Соответственно, объявляю


    СNdisApi* api;
    TCP_AdapterList* adapterList;
    api = new CNdisApi("NDISRD");
    adapterList = new TCP_AdapterList();

    Потом вызов


    bool inf = api->GetTcpipBoundAdaptersInfo(adapterList);

    В adapterList после вызова нет ни имен адаптеров ни их адресов.(m_szAdapterNameList и m_czCurrentAddress по нулям).
    Хэндлы есть, работают. При и спользовании в родном c++ все нормально. В чем беда?

    #6152

    Vadim Smirnov
    Moderator

    Сложно сказать (не являюсь поклонником С#), но предположить можно. Драйверу то все равно что за кусок памяти ему передали, он с ней работает как со структурой языка C и соответтвенно заполняет данными. Так что тут дело в том как C# интерпретирует полученную бинарную структуру, а он похоже то же самое обьявление интерпретирует по другому (возможно где-то неявно доставляются элементы, которых обычный С/C++ не добавляет). Думаю не ошибусь если предположу что в C# еть какое-то обьявление которое может заставить компилятор интерпретировать структуру как структуру С, а не managed C#. Что-нибудь подобное extern “C”, ведь как-то стандартные Win32 структуры обрабатываются нормально, думаю стоит посмотреть хидеры.

    #6153

    Jaze
    Participant

    А я совсем не силен в c++ )) Но вот что я обнаружил если вместо
    unsigned char m_szAdapterNameList[ ADAPTER_LIST_SIZE ][ ADAPTER_NAME_SIZE ];
    написать
    unsigned char m_szAdapterNameList[ ADAPTER_LIST_SIZE * ADAPTER_NAME_SIZE ];
    то массив заполняется нормально через каждые 256 элементов.

    #6154

    Vadim Smirnov
    Moderator

    В смысле С.С++ обьявления идентичны, единтсвенное по разному массивы приходится адресовать. А вот в случае C# интерпретация похоже отличается. Ну тут надо смотреть отладчиком что да как…

    #6155

    Jaze
    Participant

    Немного все переделал теперь выглядит так


    api->GetTcpipBoundAdaptersInfo(adapterList);
    const char* name = (const char*)adapterList->m_szAdapterNameList[2];
    char* friendlyName;
    bool res = api->ConvertWindows2000AdapterName(name, friendlyName, 256);

    в этом случае name показывает реальную информацию о адаптере(/DEVICE/{Идентификатор}), вызов Convert2000AdapterName возвращает true вот только friendlyName не записывается(( Может я чего с указателями путаю? Это уже почти чистый C.

    ВСЕ! Разобрался. Вопрос снят.

Viewing 5 posts - 1 through 5 (of 5 total)

You must be logged in to reply to this topic.