Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 874

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Установил себе Delphi 2009 и получил несколько проблем.
Перестали компилироваться проекты использующие модули IPHelper и IPHLPAPI. Помогите разобраться связано ли это с (см. приложение к вопросу).
Если связано, то как подправить эти модули, чтобы они заработали под Delphi 2009 ?
И ещё один нюанс - если из этих модулей использовать выборочно функции не вызывающие ошибки при компиляции, то даже явно указав в программе активность какого сетевого интерфейса я хочу отслеживать (входящего, исходящего трафика) - она не отслеживается.
Можно ли всё это дело как-то подправить, и как ?

Приложение:
  1.  
  2.  


Сергей П. Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Сергей П. (статус: Посетитель)
Вопрос отправлен: 4 сентября 2008, 12:17
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 23; последнее сообщение — 8 сентября 2008, 14:14; участников в обсуждении: 2.

Страницы: [1] [2] [Следующая »]

Вадим К

Вадим К (статус: Академик), 4 сентября 2008, 13:27 [#1]:

Эти модули стандартные? просто я не нахожу их под 7 делфи. Если нестандартные, то вполне может быть. Но можно взять и заменить все вхождение String на AnsiString и должно решиться.
Галочка "подтверждения прочтения" - вселенское зло.
Сергей П.

Сергей П. (статус: Посетитель), 4 сентября 2008, 19:45 [#2]:

Модули не стандартные, но очень часто используются, в частности в программе Net_traff_monitor, которая выложена на данном сайте. String на AnsiString попробую заменить. Странно что сети не видит. Функция с помощью которой можно считать входящий/исходяший трафик работает (по крайней мере ошибку не выдает), но возвращает не понятную константу и активности не видно.
Сергей П.

Сергей П. (статус: Посетитель), 4 сентября 2008, 20:14 [#3]:

Все заменил, ошибка на месте.
Интересно, а что теперь к примеру с функцией IntToStr делать ?
Вот так писать:
MyString:=AnsiString(IntToStr(MyInteger)); ?
Сергей П.

Сергей П. (статус: Посетитель), 4 сентября 2008, 21:39 [#4]:

Вот чем наполнились все мои проекты:

[DCC Warning] Unit2.pas(107): W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'

[DCC Warning] Unit2.pas(260): W1057 Implicit string cast from 'AnsiString' to 'string'

И как с этим теперь бороться ? Не сосчитать сколько стандартных функций возвращает строковый тип, как быть, чего то я не понимаю.
^Это просто мысли вслух^
Сергей П.

Сергей П. (статус: Посетитель), 5 сентября 2008, 13:46 [#5]:

А не подскажете, стандартными средствами Delphi можно добраться до значений вх/исх трафика, тех что можно посмотреть в "Состоянии соединения" в пунктах "Получено/Отправлено" ? Мне для моей задачи нужны только эти данные, а в упомянутых выше модулях, простой заменой указанных типов кажется всё не ограничивается, что-то ещё упускаю из виду или просто не знаю куда посмотреть.
Вадим К

Вадим К (статус: Академик), 5 сентября 2008, 14:19 [#6]:

чувствую, надо мне качать Delphi2009. Телепат с меня плохой. А кода, который будет там заведомо работать - мало. А всё потому, что многие программисты разленились и полагались на то, что один символ - один байт.
Галочка "подтверждения прочтения" - вселенское зло.
Сергей П.

Сергей П. (статус: Посетитель), 5 сентября 2008, 14:36 [#7]:

Я вот погуглил ещё разок на тему учета трафика. Процентов 90 все используют IPHelper и IPHLPAPI, остальные 10% используют какие-то очень хитрые методы. Неужели ничего стандартного и попроще нет ?
Вадим К

Вадим К (статус: Академик), 5 сентября 2008, 14:44 [#8]:

ну думаю можно подчитывать с специальной ветки реестра. Но решение с IPHelper и IPHLPAPI обкатано и используется повсеместно.

Есть ещё один вариант - в настройках компилятора отключить использования юникода. Он тогда должен работать как 2007 делфи.
Галочка "подтверждения прочтения" - вселенское зло.
Сергей П.

Сергей П. (статус: Посетитель), 5 сентября 2008, 14:52 [#9]:

А в этой процедуре не посмотрите, что бы вы изменили с учетом новшеств.
procedure TMainForm.tmrTrafficTimer(Sender: TObject);
// Вспомогательная функция, преобразующая МАС адрес к "нормальному" виду
//Определяем специальный тип, чтобы можно было передать в функцию массив
type TMAC = array [0..7] of Byte;
//В качестве первого значения массив, второе значение, размер данных в массиве
function GetMAC(Value: TMAC; Length: DWORD): String;
var
i: Integer;
p : PChar;
begin
if Length = 0 then Result := '00-00-00-00-00-00' else
begin
Result := '';
for i:= 0 to Length -2 do
Result := Result + IntToHex(Value[i],2)+'-';
Result := Result + IntToHex(Value[Length-1],2);
end;
end;

Первая же ошибка указывает на него, а точнее на строчку
Result := Result + IntToHex(Value[i],2)+'-';

Отключить юникод попробую, хотя не знаю пока как, но это все равно будет временным решением.
Вадим К

Вадим К (статус: Академик), 5 сентября 2008, 14:59 [#10]:

IntToHex возвращает строку. А вот юникодную или нет - я не знаю. Если сама функция GetMAC будет возвращаеть не юникод, то можно переписать IntToHex (в данном случае это очень просто).
Замечание. Если говорите "выводит ошибку" - приводите саму ошибку. Если приводите кусок исходного кода, и ошибки в нём - делайте их привязку - иногда сложно догадаться, где там 19, а где 39 строка в коде.
Галочка "подтверждения прочтения" - вселенское зло.
Сергей П.

Сергей П. (статус: Посетитель), 5 сентября 2008, 15:04 [#11]:

Прошу прощения. Ошибка:
First chance exception at $757B42EB. Exception class EAccessViolation with message 'Access violation at address 00488033 in module 'Demo.exe'. Read of address 00134000'. Process Demo.exe (3996)
Сергей П.

Сергей П. (статус: Посетитель), 5 сентября 2008, 15:07 [#12]:

IntToHex возвращает AnsiString, судя по встроенному хелпу.
Вадим К

Вадим К (статус: Академик), 5 сентября 2008, 15:10 [#13]:

Хелп может ошибаться. Доверять надо исходниками. В них сила.:)
Во вторых, надо различать ошибки времени компиляции и времени исполнения. У Вас - вторая, а пишете, как будто времени компиляции.
скорее всего причина в передаваемом параметре Length. Попробуйте сделать контроль, где то так
function GetMAC(Value: TMAC; Length: DWORD): String;
var
i: Integer;
p : PChar;
begin
Assert(length>7,'Ops!, length = '+inttostr(length)); //<====
if Length = 0 then Result := '00-00-00-00-00-00' else
begin
Result := '';
Галочка "подтверждения прочтения" - вселенское зло.
Сергей П.

Сергей П. (статус: Посетитель), 5 сентября 2008, 15:16 [#14]:

Вот чего получил
First chance exception at $757B42EB. Exception class EAssertionFailed with message 'Ops!, length = 0 (D:\Delphi\About 2009\source\Main.pas, line 804)'. Process Demo.exe (3236)

С теми которые во время компиляции вроде решилось, теперь эти лезут.
Вадим К

Вадим К (статус: Академик), 5 сентября 2008, 15:16 [#15]:

ой, как всегда смазал в условии:)
Assert(length<=7,'Ops!, length = '+inttostr(length));
Галочка "подтверждения прочтения" - вселенское зло.
Сергей П.

Сергей П. (статус: Посетитель), 5 сентября 2008, 15:18 [#16]:

First chance exception at $757B42EB. Exception class EAssertionFailed with message 'Ops!, length = 3407922 (D:\Delphi\About 2009\source\Main.pas, line 804)'. Process Demo.exe (3800)
Вадим К

Вадим К (статус: Академик), 5 сентября 2008, 15:22 [#17]:

Вот теперь надо посмотреть, кто там выше по стеку дергал в этот момент функцию GetMAC и передал ей такой плохой параметр. Если не знаете, как искать "выше по стеку", просто обычным поиском найдите, кто вызвал эту функцию.
Галочка "подтверждения прочтения" - вселенское зло.
Сергей П.

Сергей П. (статус: Посетитель), 5 сентября 2008, 15:28 [#18]:

GetMAC отсюда вызывается, это из одного из обсуждаемых иодулей

SubItems.Add(GetMAC(TMAC(Table.Table[i].bPhysAddr),Table.Table[i].dwPhysAddrLen));

Все идет к тому чтобы полжить перед собой исходник и начать его изучать
Вадим К

Вадим К (статус: Академик), 5 сентября 2008, 15:30 [#19]:

надо просто подумать, почему Table.Table[i].dwPhysAddrLen бывает таким большим. Может банально забыли инициализировать что то вначале?
А изучение исходников - полезная вещь. А вот если ещё заставить всё это дело нормально компилироваться под юникод и не юникод - вообще цени знаниям не было бы:)
Галочка "подтверждения прочтения" - вселенское зло.
Сергей П.

Сергей П. (статус: Посетитель), 5 сентября 2008, 15:35 [#20]:

Так дело в том что это тоже готовый исходник, который в 2007 работает, а в 2009 вот такие фокусы показывает.
Вот здесь он http://rapidshare.com/files/142804811/source.rar.html

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:34
Выполнено за 0.03 сек.