- This topic has 4 replies, 2 voices, and was last updated 19 years ago by
Jaze.
-
AuthorPosts
-
October 12, 2006 at 3:32 pm #5062
Использую 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++ все нормально. В чем беда?October 12, 2006 at 6:03 pm #6152Сложно сказать (не являюсь поклонником С#), но предположить можно. Драйверу то все равно что за кусок памяти ему передали, он с ней работает как со структурой языка C и соответтвенно заполняет данными. Так что тут дело в том как C# интерпретирует полученную бинарную структуру, а он похоже то же самое обьявление интерпретирует по другому (возможно где-то неявно доставляются элементы, которых обычный С/C++ не добавляет). Думаю не ошибусь если предположу что в C# еть какое-то обьявление которое может заставить компилятор интерпретировать структуру как структуру С, а не managed C#. Что-нибудь подобное extern “C”, ведь как-то стандартные Win32 структуры обрабатываются нормально, думаю стоит посмотреть хидеры.
October 13, 2006 at 9:39 am #6153А я совсем не силен в c++ )) Но вот что я обнаружил если вместо
unsigned char m_szAdapterNameList[ ADAPTER_LIST_SIZE ][ ADAPTER_NAME_SIZE ];
написать
unsigned char m_szAdapterNameList[ ADAPTER_LIST_SIZE * ADAPTER_NAME_SIZE ];
то массив заполняется нормально через каждые 256 элементов.October 13, 2006 at 9:58 am #6154В смысле С.С++ обьявления идентичны, единтсвенное по разному массивы приходится адресовать. А вот в случае C# интерпретация похоже отличается. Ну тут надо смотреть отладчиком что да как…
October 13, 2006 at 11:56 am #6155Немного все переделал теперь выглядит так
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.
ВСЕ! Разобрался. Вопрос снят.
-
AuthorPosts
- You must be logged in to reply to this topic.
