| 
			| 
					
						| Fg99 
								Гость
 | 
								|  | «  : 28-01-2007 14:27 »  |  | 
 
 После третьего вызова функции присходит ошибка "Access violation at address 00000000. Read of address 00000000."
 Выделяю память так:
 BYTE Mac[6] = { 0, 0, 0, 0, 0, 0};
 DWORD   Len = 6;
 вызов:
 SendARP( ipAddr, 0, (PULONG)&Mac, &Len);
 Освобождаю:
 delete [] Mac;
 Проблема точно с Mac[]. Тип его менял, но тот же эффект - три раза и вылет. Может кто подскажет что делаю нетак.
 Спасибо.
 |  
						| 
								|  |  
								| « Последнее редактирование: 28-01-2007 14:31 от Fg99 » |  Записан | 
 |  |  | 
	| 
			| 
					
						| RXL | 
								|  | « Ответ #1 : 28-01-2007 14:45 »  |  | 
 
 Fg99, неправильно делаешь!delete - оператор освобождения динамически выделяемой памяти, а для Mac[] память выделяется автоматически. Это разные методы. Автоматическая память сама освобождается при выходе из ф-ии.
 |  
						| 
								|  |  
								|  |  Записан | 
 
 ... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. |  |  | 
	| 
			| 
					
						| Fg99 
								Гость
 | 
								|  | « Ответ #2 : 28-01-2007 16:16 »  |  | 
 
 Спасибо. Да, конечно. Присобачил такое удаление, ибо не мог понять где ошибка.Без delete[] ни чего не изменилось - ровно три вызова и всё тут.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #3 : 28-01-2007 16:25 »  |  | 
 
 Fg99, SendARP( ipAddr, 0, (PULONG)&Mac, &Len);
 
 - точно амперсенд нужен?
 |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| tishka17 
								Участник    Offline 
								Не разбрасывайте мусор
								
								
								
								
								
							 | 
								|  | « Ответ #4 : 28-01-2007 16:32 »  |  | 
 
 приведи код, как ты работаешь с этим массивом в самой функции...ты гдето обращаешься к указателю, который равен NULL
 |  
						| 
								|  |  
								| « Последнее редактирование: 28-01-2007 16:33 от tishka17 » |  Записан | 
 
 //1001101010110100010100110011101111000010110111010101110011 |  |  | 
	| 
			| 
					
						| Fg99 
								Гость
 | 
								|  | « Ответ #5 : 28-01-2007 16:48 »  |  | 
 
 tishka17, ошибка происходит при вызове самой функции.Алексей1153++, да.
 Но почему именно три раза? По идее все параметры уничтожаются, ошибки подгрузки библиотеки или ф-ии исключаются.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #6 : 28-01-2007 16:51 »  |  | 
 
 Fg99, а зачем тебе указатель на переменную, хранящую адрес начала массива?  Нипаняяятнаа. |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Fg99 
								Гость
 | 
								|  | « Ответ #7 : 28-01-2007 18:39 »  |  | 
 
 хз    Запарился. Фишка в том, что работало всё еще несколько часов назад. Вот пример: //где тут тег типа CODE?//-----
 PMIB_IFTABLE ifTbl;
 ULONG dwSize = 0;
 DWORD dwRetVal = 0;
 
 ifTbl = (MIB_IFTABLE*) malloc(sizeof(MIB_IFTABLE));
 
 if (GetTable(ifTbl, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
 free(ifTbl);
 ifTbl = (MIB_IFTABLE *) malloc (dwSize);
 }
 
 if ((dwRetVal = GetTable(ifTbl, &dwSize, 0)) == NO_ERROR) {
 for (int i = 0; i<ifTbl->dwNumEntries;i++)
 {
 String s = (char*)ifTbl->table[i].bDescr;
 String t1 =(String)IntToHex(ifTbl->table[i].bPhysAddr[0],2);
 /*String str = (String)IntToHex(ifTbl->table[i].bPhysAddr[0],2)
 IntToHex(ifTbl->table[i].bPhysAddr[0],2)+":"+
 IntToHex(ifTbl->table[i].bPhysAddr[1],2)+":"+
 IntToHex(ifTbl->table[i].bPhysAddr[2],2)+":"+
 IntToHex(ifTbl->table[i].bPhysAddr[3],2)+":"+
 IntToHex(ifTbl->table[i].bPhysAddr[4],2)+":"+
 IntToHex(ifTbl->table[i].bPhysAddr[5],2)+ " | ";
 str = (String)str + (ifTbl->table[i].dwInOctets/8) + " | ";
 str = (String)str + (ifTbl->table[i].dwOutOctets/8);
 mmt->Lines->Add(str);   */
 }
 }
 //.........
 
Тоже не бог весть какая ошибка. Правда, не при вызове, а при обращении к bPhysAddr или bDescr. Функция отрабатывает отлично. Если не через ss, а просто Add()(TMemo), то ошибка 100%. А так - катит. t1-уже ошибка опять. Ни черта не понимаю. Ведь все работало. Главное, другие программы(вообще сторонних производителей) отрабатывают отлично. Пипец... |  
						| 
								|  |  
								| « Последнее редактирование: 28-01-2007 19:13 от Алексей1153++ » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Антон (LogRus) | 
								|  | « Ответ #8 : 29-01-2007 06:09 »  |  | 
 
 попробуй сделать, так как написано вот тутhttp://msdn2.microsoft.com/en-us/library/aa366358.aspx обрати внимание на то что буфер перед вызовом зачищают и 4-й параметр переустанавливают он IN/OUT кстати вот это (char*) не хорошо и даже плохо используй конструкции C++ а не C кстати в каком потоке это String s = (char*)ifTbl->table.bDescr; выполняется? |  
						| 
								|  |  
								|  |  Записан | 
 
 Странно всё это.... |  |  | 
	| 
			| 
					
						| Fg99 
								Гость
 | 
								|  | « Ответ #9 : 29-01-2007 09:44 »  |  | 
 
 кстати вот это (char*) не хорошо и даже плохо используй конструкции C++ а не Cкстати в каком потоке это String s = (char*)ifTbl->table.bDescr; выполняется?
 
 1)почему же? явное преобразование...2)не понял вопроса=)LogRus , спасибо за ответ. На счет кода МСДН - с него и начиналось всё когда-то. Однако коду на МСДН верить нужно осторожно, т.к. большинство содержит ошибки, как и в случае SendARP(). Но все-равно спасибо,  буфер перед вызовом зачищают и 4-й параметр переустанавливают ты совершенно прав, а я в панике    уже забыл об этом.Что получится - отпишу. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Fg99 
								Гость
 | 
								|  | « Ответ #10 : 29-01-2007 11:26 »  |  | 
 
 нет. Ни какого эффекта. Не понимаю в чем проблема. А проект МСДН вообще не компилируется, кстати. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Антон (LogRus) | 
								|  | « Ответ #11 : 29-01-2007 13:33 »  |  | 
 
 1)почему же? явное преобразование...2)не понял вопроса=)LogRus , спасибо за ответ. На счет кода МСДН - с него и начиналось всё когда-то. Однако коду на МСДН верить нужно осторожно, т.к. большинство содержит ошибки, как и в случае SendARP(). Но все-равно спасибо,  буфер перед вызовом зачищают и 4-й параметр переустанавливают ты совершенно прав, а я в панике    уже забыл об этом.Что получится - отпишу.1) не хорошо потому, что в коде это преобразование в глаза не бросается лучше C++ static_cast, dynamic_cast их явно видно в коде и не даёт ворнингов в аутпут, у нас в контере требование, ворнингов быть не должно 2)поток GUI или дополнительный 3) пример со страницы компилится и работает поставил в код цикл 100 итераций прошли успешно, ты случайно не забыл линковщику сказатать брать библиотечки ws2_32.lib and iphlpapi.lib |  
						| 
								|  |  
								|  |  Записан | 
 
 Странно всё это.... |  |  | 
	| 
			| 
					
						| Fg99 
								Гость
 | 
								|  | « Ответ #12 : 30-01-2007 17:26 »  |  | 
 
 1) дык и так нет варнингов, да и привычка ужо=). На счет визуального восприятия-учту, спасибо. 2)GUI 3)ты про МСДН? хммм... Да, конечно линковал. Пробовал вручную описывать структуры и подгружать функцию из библиотеки - вот тогда получалось. Впрочем, и в приведенных примерах функции описаны мной, а не подключением хелпер.h. Надо попробовать чрез .h, вдруг в этом прблема? Хотя вряд ли... Жаль ближайшие лни некогда будет разбираться с этим, но как пойдет дело отпишу. Спасибо, что не оставляете тему без внимания    . |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Антон (LogRus) | 
								|  | « Ответ #13 : 30-01-2007 17:47 »  |  | 
 
 Fg99, дело не только в визуальном восприятии но и в возможности поиском найти все точки явных преобразований особенно полезно когда преходишь на другую платформу. 2) прекрасно   3) а вот руками ты зря структуры описываешь насчет не оставлять без внимания это от тебя зависит   |  
						| 
								|  |  
								|  |  Записан | 
 
 Странно всё это.... |  |  | 
	| 
			| 
					
						| zubr 
								Гость
 | 
								|  | « Ответ #14 : 30-01-2007 18:15 »  |  | 
 
 В общето IntToHex возвращает тип AnsiString, похоже преобразование типов AnsiString в string и вызывает ошибку. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Fg99 
								Гость
 | 
								|  | « Ответ #15 : 30-01-2007 18:23 »  |  | 
 
 zubr, String == AnsiString   LogRus , 3) почему? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Fg99 
								Гость
 | 
								|  | « Ответ #16 : 30-01-2007 18:25 »  |  | 
 
 Там преобразование (String) идет, чтоб дать понять что я вовсе не хочу складывать "строки", а склеивать их и результат - строка. //не знаю как это по-русски объяснить    |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #17 : 30-01-2007 18:28 »  |  | 
 
 Fg99,  str = (String)str + (ifTbl->table[i].dwInOctets/8) --------------------->
 str = ((String)str) + (String)(ifTbl->table[i].dwInOctets/8)
 
 
а попробуй приоритеты поставить скобками поточнее... Хотя может и так оно правильно, но сразу не очевидно |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Антон (LogRus) | 
								|  | « Ответ #18 : 31-01-2007 07:16 »  |  | 
 
 LogRus, 3) почему?
 потому, что если ты не будешь сообщать о ходе работ то вероятность того, что про тему забудут резко возрастает.   кстати вот тебе рабочий код на основе на основе данных из msdn    : template<class T, class T2>void ByteToHexStream(T& strm, T2 b)
 {
 strm.fill('0');
 strm.setf(std::ios_base:: hex, std::ios_base:: basefield);
 strm << std::setw(sizeof(T2)*2) << static_cast<unsigned long>(b);
 }
 
 int _tmain(int argc, _TCHAR* argv[])
 {
 // Declare and initialize variables
 PMIB_IFTABLE ifTable;
 DWORD dwSize = 0;
 DWORD dwRetVal = 0;
 
 // Allocate memory for our pointers
 ifTable = (MIB_IFTABLE*) malloc(sizeof(MIB_IFTABLE));
 
 // Make an initial call to GetIfTable to get the
 // necessary size into the dwSize variable
 if (GetIfTable(ifTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
 free(ifTable);
 ifTable = (MIB_IFTABLE *) malloc (dwSize);
 }
 
 // Make a second call to GetIfTable to get the
 // actual data we want
 if ((dwRetVal = GetIfTable(ifTable, &dwSize, 0)) == NO_ERROR)
 {
 printf("\tNumber of entries: %ld\n", ifTable->dwNumEntries);
 for (DWORD  i = 0; i<ifTable->dwNumEntries; ++i)
 {
 std::stringstream str;
 
 std::cout << "Entry: " << i << "\n";
 
 if (ifTable->table[i].dwPhysAddrLen)
 ByteToHexStream(str, ifTable->table[i].bPhysAddr[0]);
 
 for (DWORD  j = 1; j < ifTable->table[i].dwPhysAddrLen; ++j)
 {
 str << ":";
 ByteToHexStream(str, ifTable->table[i].bPhysAddr[j]);
 }
 str.setf(std::ios_base::dec, std::ios_base::basefield);
 str << "|" << ifTable->table[i].dwInOctets/8 << "|" << ifTable->table[i].dwOutOctets/8;
 std::cout << str.str() << "\n";
 }
 }
 else
 printf("\tGetIfTable failed.\n");
 
 
 return 0;
 }
 
 |  
						| 
								|  |  
								| « Последнее редактирование: 07-12-2007 21:09 от Алексей1153++ » |  Записан | 
 
 Странно всё это.... |  |  | 
	| 
			| 
					
						| Fg99 
								Гость
 | 
								|  | « Ответ #19 : 05-02-2007 16:45 »  |  | 
 
 LogRus, спасибо =) Твой пример не пробовал запускать, атнака все-равно пасиба.Так и не разобрался в чем была причина. Всё заработало о_0. в общем, спс.
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Fg99 
								Гость
 | 
								|  | « Ответ #20 : 05-02-2007 16:48 »  |  | 
 
 LogRus, 3) почему?
 это я по структурам? Почему считаешь, что "зря"? |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Антон (LogRus) | 
								|  | « Ответ #21 : 05-02-2007 18:18 »  |  | 
 
 Fg99, потому, что велосипед    это раз во вторых малоли какие там прагмы есть/нет посреди структуры в общем без крайней необходимости велосипеды изобретать дело вредное, наверняка кто уже обовсём подумал за нас   |  
						| 
								|  |  
								|  |  Записан | 
 
 Странно всё это.... |  |  | 
	| 
			| 
					
						| Антон (LogRus) | 
								|  | « Ответ #22 :  05-02-2007 18:20 »   |  | 
 
 имхо код был немного, не универсален например, небыло этого for (DWORD  j = 1; j < ifTable->table[i].dwPhysAddrLen; ++j){
 str << ":";
 ByteToHexStream(str, ifTable->table[i].bPhysAddr[j]);
 }
 
и возможно структуры у тебя всёже кривые были. выравнивания нет/есть да мало ли. Это же МАГИЯ   |  
						| 
								|  |  
								| « Последнее редактирование: 07-12-2007 21:10 от Алексей1153++ » |  Записан | 
 
 Странно всё это.... |  |  | 
	|  |