Managed code in C#

Home Forums Discussions Support Managed code in C#

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
      Keymaster

        Сложно сказать (не являюсь поклонником С#), но предположить можно. Драйверу то все равно что за кусок памяти ему передали, он с ней работает как со структурой языка 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
          Keymaster

            В смысле С.С++ обьявления идентичны, единтсвенное по разному массивы приходится адресовать. А вот в случае 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.