Страница 1 из 1

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

СообщениеДобавлено: 12.11.2010 18:51:34
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"

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

СообщениеДобавлено: 12.11.2010 19:11:48
Иван Шихалев
Должно быть @BufferLen, очевидно.

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

СообщениеДобавлено: 12.11.2010 19:27:58
Sheleh
Спасибо, заработало. Но в чем очевидность и зачем этот знак "@"

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

СообщениеДобавлено: 12.11.2010 19:36:10
coyot.rush
Но в чем очевидность и зачем этот знак "@"

Насколько я помню MS SDK всё что начинается c lp есть указатель

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

СообщениеДобавлено: 12.11.2010 20:42:19
Mr.Smart
Код: Выделить всё
type
  ...
  LPDWORD = ^DWORD;
  ...

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

СообщениеДобавлено: 13.11.2010 05:22:39
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)

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

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

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

СообщениеДобавлено: 13.03.2018 16:58:53
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.