Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2012, 09:09   #1
malor
Форумчанин
 
Регистрация: 23.05.2007
Сообщений: 151
Вопрос WSAAddressToString: несоответствие параметров ? E2033 : Ругается компилятор.

В код добавил строчку
Цитата:
WSAAddressToStringW(LpAdapterAddres ses^.FirstUnicastAddress.Address.lp Sockaddr,
LpAdapterAddresses^.FirstUnicastAdd ress.Address.iSockaddrLength,
@protocolInfo, @text, bufferSize);
с целью получения IP в привычном виде (т.е., например, 192.168.50.200).

Код:
function GetAdaInfo2(out AInfoStr: AnsiString; const AOnlyMac: Boolean):Boolean;
const
  cntAdaCount=2;
  cntAdaTypesInt: array[0..cntAdaCount] of Cardinal = ($6, $47, $90);
  cntAdaTypesDef: array[0..cntAdaCount] of AnsiString =
                 ('Ethernet Network Adapter',
                  'Wireless Network Adapter',
                  'FireWire Network Adapter');
var
  i: Integer;
  bf: Cardinal;
  LqFind: Boolean;
  LsMac: AnsiString;
  LpAdapterAddresses: PIP_ADAPTER_ADDRESSES;

    text : array[1..46] of WideChar;
    bufferSize :DWORD;
  protocolInfo: WSAPROTOCOL_INFO;
begin

  bufferSize := sizeof(text);

  Result := True;
  AInfoStr := '';
  try
    bf := 0;
    if GetAdaptersAddresses(0, 0, nil, nil, @bf) <> ERROR_BUFFER_OVERFLOW then Abort;
    try
      GetMem(LpAdapterAddresses, bf);
      if GetAdaptersAddresses(0, 0, nil, LpAdapterAddresses, @bf) <> ERROR_SUCCESS then Abort;

      while LpAdapterAddresses <> nil do
      begin
        try
          // Определяем тип адаптера
          LqFind := False;
          for i := 0 to cntAdaCount do
            if LpAdapterAddresses^.IfType = cntAdaTypesInt[i] then
            begin
              LqFind := True;
              Break;
            end;

          if not LqFind then Continue;

          //собираем информацию об устройстве
          if not AOnlyMac then
            AInfoStr := Format('%s%s (%s)'#13#10'%s'#13#10,
                             [AInfoStr, LpAdapterAddresses^.FriendlyName,
                              LpAdapterAddresses^.Description, cntAdaTypesDef[i]]);

            WSAAddressToStringW(LpAdapterAddresses^.FirstUnicastAddress.Address.lpSockaddr,
                               LpAdapterAddresses^.FirstUnicastAddress.Address.iSockaddrLength,
                               @protocolInfo, @text,  bufferSize);

          LsMac := '';
          if LpAdapterAddresses^.PhysicalAddressLength = 0 then Continue;

          for i := 0 to LpAdapterAddresses^.PhysicalAddressLength - 1 do
            LsMac := LsMac + IntToHex(LpAdapterAddresses^.PhysicalAddress[i], 2) + '-';
          SetLength(LsMac, Length(LsMac) - 1);
          AInfoStr := Format('%s%s'#13#10#13#10, [AInfoStr, LsMac]);
        finally
          LpAdapterAddresses := LpAdapterAddresses^.Next;
        end;
      end;
    finally
      FreeMem(LpAdapterAddresses, bf);
    end;
  except
    Result := False;
    AInfoStr := '';
  end;
end;
Компилятор выдает:
[DCC Error] UMain.pas(88): E2033 Types of actual and formal var parameters must be identical



Что не так ?

Delphi XE
Изображения
Тип файла: jpg WSAAddressToStringW_E2033.jpg (91.6 Кб, 131 просмотров)
malor вне форума Ответить с цитированием
Старый 09.04.2016, 21:41   #2
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Такая же проблема:
Код:
buf: array [0..MAX_PATH] of WideChar;
dlina:DWORD;
...
pUnicast:= pCurrAddresses.FirstUnicastAddress;
WSAAddressToStringW(pUnicast.Address.lpSockaddr, pUnicast.Address.iSockaddrLength,  nil, buf, dlina);
Ругается на несоответствие параметров. Причем на C++ таких проблем нет:
Код:
 DWORD length = 256;
 WCHAR buf[MAX_PATH];
...
pUnicast = pCurrAddresses->FirstUnicastAddress;
WSAAddressToStringW(pUnicast->Address.lpSockaddr, pUnicast->Address.iSockaddrLength, NULL, buf, &length);
calypso вне форума Ответить с цитированием
Старый 10.04.2016, 01:12   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

---

Последний раз редактировалось p51x; 10.04.2016 в 01:21.
p51x вне форума Ответить с цитированием
Старый 10.04.2016, 01:32   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а точный текст ошибки засекречен?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.04.2016, 16:22   #5
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

E2033 Types of actual and formal var parameters must be identical
Какой именно параметр ему не нравится, компилятор почему-то указать не считает нужным. Видимо, пользователь должен одеть телепатический шлем и сам догадаться
calypso вне форума Ответить с цитированием
Старый 11.04.2016, 09:18   #6
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Победил эту заразу, вот так надо делать:
Код:
WSAAddressToStringW(PSOCKADDR(pUnicast.Address.lpSockaddr)^,
	pUnicast.Address.iSockaddrLength, nil , @buf, dlina);
myIPadress:=buf;
Memo1.Lines.Add('IP адрес сетевой карты: '+myIPadress);
Для тех, кто так и не въехал, почему ничего не работало, всё просто: первый параметр преобразуем из PSockAddr в SOCKADDR.
calypso вне форума Ответить с цитированием
Старый 11.04.2016, 09:23   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,881
По умолчанию

Первую ссылку в гугле (delphi WSAAddressToStringW) смотрели http://www.cyberforum.ru/delphi-netw...ead673969.html ?

Какой именно параметр, можно узнать либо по курсору, куда он встанет (не строка а именно курсор), если он не встаёт (возможно, зависит от дельфи), то каждый параметр на новую строку, тогда точно увидите.
phomm вне форума Ответить с цитированием
Старый 11.04.2016, 13:42   #8
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Не знаю, у меня вообще жутко кривая Делфи ХЕ8, там даже красным подсвечивается совсем не те строки, где ошибка. И вообще очень много глюков, иногда намертво зависает. То ли она на Windows 8.1 себя неадекватно ведёт, то версия такая кривожопая
calypso вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
компилятор ругается novak3 Общие вопросы C/C++ 4 21.05.2011 01:58
Ругается компилятор.. CormiX Помощь студентам 0 14.05.2011 16:13
компилятор ругается на AnsiString CodeNOT Общие вопросы C/C++ 6 04.01.2011 01:50
Компилятор ругается на ;(точку с запятой) Android_ua Общие вопросы C/C++ 2 19.05.2010 19:06
Ругается компилятор JSM Общие вопросы Delphi 2 17.06.2007 23:04