freepascal.ru • Просмотр темы - Incompatible type: Got "LongWord", expected "LPDWORD"
 

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

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

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

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

Сообщение Sheleh » 12.11.2010 18:51:34

Возможно вопрос глупый, но я впервые работаю на лазарусе (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"
Sheleh
новенький
 
Сообщения: 24
Зарегистрирован: 12.11.2010 18:31:07

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

Сообщение Иван Шихалев » 12.11.2010 19:11:48

Должно быть @BufferLen, очевидно.
Аватара пользователя
Иван Шихалев
постоялец
 
Сообщения: 440
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

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

Сообщение Sheleh » 12.11.2010 19:27:58

Спасибо, заработало. Но в чем очевидность и зачем этот знак "@"
Sheleh
новенький
 
Сообщения: 24
Зарегистрирован: 12.11.2010 18:31:07

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

Сообщение coyot.rush » 12.11.2010 19:36:10

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

Насколько я помню MS SDK всё что начинается c lp есть указатель
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 306
Зарегистрирован: 14.08.2009 08:59:48

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

Сообщение Mr.Smart » 12.11.2010 20:42:19

Код: Выделить всё
type
  ...
  LPDWORD = ^DWORD;
  ...
Mr.Smart
долгожитель
 
Сообщения: 1797
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение Sheleh » 13.11.2010 05:22:39

Компилятор теперь не ругается, но на выходе получается: "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)
Sheleh
новенький
 
Сообщения: 24
Зарегистрирован: 12.11.2010 18:31:07

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

Сообщение big_big » 12.03.2018 14:44:00

Кому-то удалось решить проблему?
заметил, что проблема в данном случае не в InternetReadFile, а в HttpSendRequest или InternetOpenUrl. Эти функции не возвращают ничего.
big_big
незнакомец
 
Сообщения: 1
Зарегистрирован: 12.03.2018 14:39:04

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

Сообщение serbod » 13.03.2018 16:58:53

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.
Аватара пользователя
serbod
постоялец
 
Сообщения: 295
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru