Incompatible type: Got "LongWord", expected "LPDWORD"

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
Sheleh
новенький
Сообщения: 24
Зарегистрирован: 12.11.2010 17:31:07

Incompatible type: Got "LongWord", expected "LPDWORD"

Сообщение Sheleh »

Возможно вопрос глупый, но я впервые работаю на лазарусе (0.9.28.2 windows). Пытаюсь переписать свой проект, и вот вопрос в типичном коде приема файлов через winnet. При компиляции в среду Win32 все работает, а вот в WinCE выскакивает ошибка несовместимости типов:

Код писал(а):var
BufferLen: DWORD;
...
begin
...
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);

Компилятор писал(а):unit1.pas(80,66) Error: Incompatible type for arg no. 4: Got "LongWord", expected "LPDWORD"
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Должно быть @BufferLen, очевидно.
Sheleh
новенький
Сообщения: 24
Зарегистрирован: 12.11.2010 17:31:07

Сообщение Sheleh »

Спасибо, заработало. Но в чем очевидность и зачем этот знак "@"
Аватара пользователя
coyot.rush
постоялец
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Сообщение coyot.rush »

Но в чем очевидность и зачем этот знак "@"

Насколько я помню MS SDK всё что начинается c lp есть указатель
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Код: Выделить всё

type
  ...
  LPDWORD = ^DWORD;
  ...
Sheleh
новенький
Сообщения: 24
Зарегистрирован: 12.11.2010 17:31:07

Сообщение Sheleh »

Компилятор теперь не ругается, но на выходе получается: "Project1 не является приложением Windows CE"
И проблемма именно в "InternetReadFile(hURL, @Buffer, SizeOf(Buffer), @BufferLen);" без вызова этой процедуры программа запускается.



Добавлено спустя 5 часов 14 минут 34 секунды:
В общем в итоге код такой

Код: Выделить всё

  {$IFDEF WINCE}
  hSession:= InternetOpen(PWideChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,nil, nil, 0);
  try
    hURL := InternetOpenURL(hSession,PWideChar(fileURL),nil,0,0,0);
    try
      Stream.Clear;
      repeat
        InternetReadFileEx(hURL, @Buffer, SizeOf(Buffer), BufferLen);
        Stream.Write(Buffer,BufferLen);
      until BufferLen = 0;
    finally
      InternetCloseHandle(hURL)
    end;
  finally
    InternetCloseHandle(hSession)
  end;
  {$ENDIF}
  {$IFDEF WIN32}
  hSession:= InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,nil, nil, 0);
  try
    hURL := InternetOpenURL(hSession,PChar(fileURL),nil,0,0,0);
    try
      Stream.Clear;
      repeat
        InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
        Stream.Write(Buffer,BufferLen);
      until BufferLen = 0;
    finally
      InternetCloseHandle(hURL)
    end;
  finally
    InternetCloseHandle(hSession)
  end;
  {$ENDIF} 


Win32 код работает великолепно. WinCe же часть не ругается, но и не работает. Перепробовал все функции InternetReadFile (Ex, ExA, ExW)
big_big
незнакомец
Сообщения: 1
Зарегистрирован: 12.03.2018 13:39:04

Сообщение big_big »

Кому-то удалось решить проблему?
заметил, что проблема в данном случае не в InternetReadFile, а в HttpSendRequest или InternetOpenUrl. Эти функции не возвращают ничего.
Аватара пользователя
serbod
постоялец
Сообщения: 449
Зарегистрирован: 16.09.2016 10:03:02
Откуда: Минск
Контактная информация:

Сообщение serbod »

1. Лучше использовать InternetOpenUrlW(), для гарантии, что вызывается именно Unicode-версия

2. Возможно, требуется дополнительное преобразование строки URL:
Call InternetCanonicalizeUrl first if the URL being used contains a relative URL and a base URL separated by blank spaces.


3. Глянуть описание ошибки:
To retrieve a specific error message, call GetLastError. To determine why access to the service was denied, call InternetGetLastResponseInfo.
Ответить