Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 20.04.2017, 19:34   #1
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 423
Репутация: 60
По умолчанию 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, 12:12   #2
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 423
Репутация: 60
По умолчанию

Даже если просто оставить незакомментированными
Код:

   try
//
//
//
   finally
//
   end;

всё равно ошибка... Как это так?

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

Дальнейшие попытки понять что не нравится компилятору привели к следующему результату
Код:

    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, 16:22   #4
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк, Украина
Сообщений: 16,195
Репутация: 5783
По умолчанию

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

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

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

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

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

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

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема при компиляции всех файлов! Neal Помощь студентам 3 20.08.2011 23:22
Проблема при компиляции rihannatest Общие вопросы C/C++ 6 21.11.2010 15: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




23:05.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru