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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2017, 18:34   #1
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию WinInet в потоке - проблема при компиляции

Здравствуйте!
Получаю страницу... Этим способом...
Код:
    hInet := InternetOpen('My Agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
    if not Assigned(hInet) then
      raise Exception.Create('Ошибка при выполнении функции InternetOpen' + sLineBreak + SysErrorMessage(GetLastError));
    try
      hCon := InternetConnect(hInet, PWideChar('192.168.0.'+printer_nom), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
      if not Assigned(hCon) then
        raise Exception.Create('Ошибка при выполнении функции InternetConnect' + sLineBreak + SysErrorMessage(GetLastError));
      try
        if ochered then hReq := HttpOpenRequest(hCon, 'GET', 'pages/_jobusr.htm', HTTP_VERSION, nil, nil, INTERNET_FLAG_KEEP_CONNECTION or INTERNET_FLAG_RELOAD, 0)
                   else hReq := HttpOpenRequest(hCon, 'GET', '', HTTP_VERSION, nil, nil, INTERNET_FLAG_KEEP_CONNECTION or INTERNET_FLAG_RELOAD, 0);
        if not Assigned(hReq) then
          raise Exception.Create('Ошибка при выполнении функции HttpOpenRequest' + sLineBreak + SysErrorMessage(GetLastError));
        try
{          HttpSendRequest(hReq,'', 0, nil, 0);
          StatusSize := SizeOf(Status);
          Index := 0;
          HttpQueryInfo(hReq, HTTP_QUERY_FLAG_NUMBER or HTTP_QUERY_STATUS_CODE, @Status, StatusSize, Index);
          if Status <> HTTP_STATUS_OK then
            raise Exception.Create('Ошибка при выполнении функции HttpSendRequest' + sLineBreak + 'Статус: ' + IntToStr(Status) + sLineBreak + SysErrorMessage(GetLastError));
          posi := 1;
          b := 1;
          ResponseString := '';
          while b > 0 do begin
            if not InternetQueryDataAvailable( hReq, bytes, 0, 0 ) then
              raise Exception.Create('Ошибка при выполнении функции InternetQueryDataAvailable' + sLineBreak + SysErrorMessage(GetLastError));
            SetLength( ResponseString, Length(ResponseString) + bytes );
            InternetReadFile( hReq, @ResponseString[Posi], bytes, b );
            Inc(Posi, b);
          end;                                      }
        finally
          InternetCloseHandle(hReq);
        end;
      finally
        InternetCloseHandle(hCon);
      end;
    finally
      InternetCloseHandle(hInet);
    end;
Всё было енормально, пока я не попытался закинуть это в поток.
Если переношу фигурные скобки так, чтобы внутри комментариев оказалось
Код:
        try
        finally
          InternetCloseHandle(hReq);
        end;
(т.е. на строчку выше и на три строчки ниже), то код нормально компилируется и запускается. А в таком виде компилятор выдаёт ошибку "Отказано в доступе". Или "Процесс не может получить доступ к файлу, т.к. этот файл занят другим процессом" и удаляет exe'шник предыдущей компиляции.
На всякий случай: запуск потоков находится в нажатии кнопки, не при создании формы или запуске приложения.
Ship_1 вне форума Ответить с цитированием
Старый 21.04.2017, 11:12   #2
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Даже если просто оставить незакомментированными
Код:
   try
//
//
//
   finally
//
   end;
всё равно ошибка... Как это так?

Последний раз редактировалось Ship_1; 21.04.2017 в 11:15.
Ship_1 вне форума Ответить с цитированием
Старый 21.04.2017, 15:07   #3
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Дальнейшие попытки понять что не нравится компилятору привели к следующему результату
Код:
    hInet := InternetOpen('My Agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
    if not Assigned(hInet) then
      raise Exception.Create('Ошибка при выполнении функции InternetOpen' + sLineBreak + SysErrorMessage(GetLastError));
    try
      hCon := InternetConnect(hInet, PWideChar('192.168.0.'+printer_nom), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
      if not Assigned(hCon) then
        raise Exception.Create('Ошибка при выполнении функции InternetConnect' + sLineBreak + SysErrorMessage(GetLastError));
      try
        if ochered then hReq := HttpOpenRequest(hCon, 'GET', 'pages/_jobusr.htm', HTTP_VERSION, nil, nil, INTERNET_FLAG_KEEP_CONNECTION or INTERNET_FLAG_RELOAD, 0)
                   else hReq := HttpOpenRequest(hCon, 'GET', '', HTTP_VERSION, nil, nil, INTERNET_FLAG_KEEP_CONNECTION or INTERNET_FLAG_RELOAD, 0);
        if not Assigned(hReq) then
          raise Exception.Create('Ошибка при выполнении функции HttpOpenRequest' + sLineBreak + SysErrorMessage(GetLastError));
//        try
//          HttpSendRequest(hReq,'', 0, nil, 0);
          StatusSize := SizeOf(Status);
          Index := 0;
          HttpQueryInfo(hReq, HTTP_QUERY_FLAG_NUMBER or HTTP_QUERY_STATUS_CODE, @Status, StatusSize, Index);
          if Status <> HTTP_STATUS_OK then
            raise Exception.Create('Ошибка при выполнении функции HttpSendRequest' + sLineBreak + 'Статус: ' + IntToStr(Status) + sLineBreak + SysErrorMessage(GetLastError));
          posi := 1;
          b := 1;
          ResponseString := '';
          while b > 0 do begin
            if not InternetQueryDataAvailable( hReq, bytes, 0, 0 ) then
              raise Exception.Create('Ошибка при выполнении функции InternetQueryDataAvailable' + sLineBreak + SysErrorMessage(GetLastError));
//            SetLength( ResponseString, Length(ResponseString) + bytes );
//            InternetReadFile( hReq, @ResponseString[Posi], bytes, b );
            Inc(Posi, b);
          end;
//        finally
//          InternetCloseHandle(hReq);
//        end;
      finally
        InternetCloseHandle(hCon);
      end;
    finally
      InternetCloseHandle(hInet);
    end;
Снятие комментариев с любой из этих строчек вызывает ошибку. В таком виде компилируется нормально.
Никто, что ль, не может помочь?..
Ship_1 вне форума Ответить с цитированием
Старый 21.04.2017, 15:22   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Антивирь какой?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.04.2017, 15:32   #5
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Каспер с удалённым управлением от айтишников.
Но я до этого сделал версию программы без потоков - прекрасно работает. Теперь просто перенёс процедуру вызова этого кода в execute потока - и появились ошибки...
Ship_1 вне форума Ответить с цитированием
Старый 21.04.2017, 15:36   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Я бы попробовал без каспера откомпилировать. Возможно настройки его поменять в плане контроля программ. Наиболее вероятно из-за антивиря
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.04.2017, 15:55   #7
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Приостановил защиту. Действительно скомпилировалось... Что за фокусы?..
При запущенном Каспере уже скомпилированная программа тоже не хочет запускаться.
Но как же так? Та же самая программа, выполняющая те же самые действия без потоков запускается и работает нормально. Проверил на другой программке, в которой как-то криво в первый раз реализовал поток - нормально скомпилировалась.
А главное, как теперь быть? Ведь не здорово же сделать такую программу, которая может работать только с отключённым антивирусом...
Ship_1 вне форума Ответить с цитированием
Старый 21.04.2017, 16:01   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну у антивиря крыша едет )) У меня НОД32 как-то орал на почти пустой проект с одной формой. Каспером не пользуюсь, где-то в инете попадалось об изменении настроек у него в части контроля программ, естесно не помню каких )
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.04.2017, 16:03   #9
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Вот приколы-то )
И что, варианта только два теперь? Первый - всё время отключать антивирь, второй - забить на проект?
Ship_1 вне форума Ответить с цитированием
Старый 21.04.2017, 16:07   #10
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Мда... А в D7 нормально компилируется... (не компилируется в XE)
Ship_1 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема при компиляции всех файлов! Neal Помощь студентам 3 20.08.2011 23:22
Проблема при компиляции rihannatest Общие вопросы C/C++ 6 21.11.2010 14:34
Проблема при компиляции artemavd Общие вопросы Delphi 9 22.07.2010 11:03
Проблема с обработкой исключений в Delphi при компиляции программы на сервере ivladak Общие вопросы Delphi 14 15.08.2009 20:58
проблема с wininet API delphi_coder Работа с сетью в Delphi 4 18.09.2007 14:08