Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
#1

Не пойму где ошибка - C++

06.04.2011, 22:10. Просмотров 2185. Ответов 33
Метки нет (Все метки)

Всем привет, вот решил написать простенький класс для работы с интернетом и выскакивают какие-то ошибки, не пойму в чем дело, вот эти ошибки:

Run-Time Check Failure #3 - The variable 'szData' is being used without being initialized.
Первый этап обработки исключения в "0x77c370f2" в "tfbti_lib_AP.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
Необработанное исключение в "0x77c370f2" в "tfbti_lib_AP.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
Программа "[11620] tfbti_lib_AP.exe: Машинный код" завершилась с кодом 0 (0x0).


Вот код. В этом файле только прототипы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// tfbti_motor.h - Содержит в себе класс с прототипами методов
// tfbti - The future behind the Internet - Будущее за интернетом
// Заточен под Windows XP.
#include <Windows.h>
#include <WinInet.h>
 
namespace CPPtfbti_class {
 
    // - КОНСТАНТЫ ДЛЯ РАБОТЫ С БИБЛИОТЕКОЙ
    const INTERNET_PORT IDHP = INTERNET_DEFAULT_HTTP_PORT;
    const DWORD ISH = INTERNET_SERVICE_HTTP;
    const DWORD IOTP = INTERNET_OPEN_TYPE_PRECONFIG;
    const DWORD IFKC = INTERNET_FLAG_KEEP_CONNECTION;
 
    class WIAP {
    public:
        WIAP(LPCSTR pNameBot = "AP_bot", int i = 0);
        ~WIAP();
    // Сами функции
 
    // - Есть ли подключение к интернету?
    bool is_Inet();
 
    // - Открывает библиотеку
    void Open_Internet(DWORD D = IOTP, LPCSTR N = NULL, LPCSTR N2 = NULL, DWORD flag = 0);
 
    // - Открывает соединение с интернетом
    void Open_Connection(
            
        LPCSTR site = "www.yandex.ru",
        INTERNET_PORT constant = IDHP, 
        LPCSTR N = NULL, 
        LPCSTR N2 = NULL, 
        DWORD serv = ISH, 
        DWORD i = 0, 
        DWORD i2 = 1);
 
    // - Выводит все прочитанные сайты
    void my_Sites();
 
    // - Строит запрос для входа на сайт
    void Build_Query(
 
        LPCSTR method = "GET", 
        LPCSTR path = "/",
        LPCSTR N = NULL, 
        LPCSTR N2 = NULL, 
        LPCSTR* i = 0, 
        DWORD ip = IFKC, 
        DWORD i2 = 0);
 
    // - Отправляет запрос
    bool Send_Query(LPCSTR N = NULL, DWORD i = 0, LPVOID N2 = NULL, DWORD i2 = 0);
 
    // - Читает страницу
    bool Read_File(char* szData, DWORD size, DWORD *dwBytes);
 
    // - Закрывает указанный дескриптор
    void close(HINTERNET desc);
 
 
 
    protected:
 
    int status;
    LPCSTR name_Bot;
    HINTERNET hOpen, hConnect, hRequest;
 
    };
}
Вот их реализации.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// release.cpp
#include <iostream>
#include <fstream>
#include "tfbti_motor.h"
#pragma comment(lib, "wininet.lib")
using namespace std;
 
namespace CPPtfbti_class {
    // Конструктор
    WIAP::WIAP(LPCSTR pNameBot, int i) : status(i), name_Bot(pNameBot) {}
    // Деструктор
    WIAP::~WIAP() {}
 
    // - Есть ли подключение к интернету?
    bool WIAP::is_Inet() {
        if(InternetAttemptConnect(0) != ERROR_SUCCESS)
            return false;
        return true;
    }
 
    // - Открывает библиотеку
    void WIAP::Open_Internet(DWORD D, LPCSTR N, LPCSTR N2, DWORD flag) {
        hOpen = InternetOpen(name_Bot, D, N, N2, flag);
    }
 
    // - Открывает соединение с интернетом
    void WIAP::Open_Connection(LPCSTR site, INTERNET_PORT constant, LPCSTR N, LPCSTR N2, DWORD serv, DWORD i, DWORD i2) {
        hConnect = InternetConnect(hOpen, site, constant, N, N2, serv, i, i2);
    }
 
    // - Строит запрос для входа на сайт
    void WIAP::Build_Query(LPCSTR method, LPCSTR path, LPCSTR N, LPCSTR N2, LPCSTR* i, DWORD ip, DWORD i2) {
        hRequest = HttpOpenRequest(hConnect, method, path, N, N2, i, ip, i2);
    }
 
    // - Отправляет запрос
    bool WIAP::Send_Query(LPCSTR N, DWORD i, LPVOID N2, DWORD i2) {
        return HttpSendRequest(hRequest, N, i, N2, i2);
    }
 
    // - Читает страницу
    bool WIAP::Read_File(char* szData, DWORD size, DWORD *dwBytes) {
        if(InternetReadFile(hRequest, szData, size, dwBytes)) {
            if(status) {
                ofstream file("newStr.html");
                file << *szData;
                cout << *szData;
                return true;
            }
            cout << *szData;
            return true;
        }
        return false;
    }
}
Вот как я их вызываю.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include "tfbti_motor.h"
using namespace CPPtfbti_class;
using namespace std;
 
int main() {
    setlocale(0, "Russian");
    cout << "Привет" << endl;
 
    WIAP inet("Andrew Bot");
    if(inet.is_Inet()) {
    inet.Open_Internet();
    inet.Open_Connection("www.google.ru");
    inet.Build_Query();
    inet.Send_Query();
    char* szData;
    DWORD bytes;
    inet.Read_File(szData, sizeof(szData)-1, &bytes);
 
    }
    else {
        cout << "Нет интернета";
    }
 
 
    system("pause >> void");
    return 0;
}
Подскажите пожалуйста, в чем проблема?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2011, 22:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не пойму где ошибка (C++):

Не пойму, где ошибка - C++
Здравствуйте, что-то никак не разберусь в этом куске кода, и почему компилятор нашел там narrowing conversion во второй фигурной скобке...

Не пойму, где ошибка - C++
Всем добрый день. Недавно начал изучать С++ вот столкнулся с проблемой в одной из задач: Из матрицы размером NxM получить вектор B,...

Не пойму где ошибка - C++
#include &lt;iostream&gt; using namespace std; int main() { setlocale(0, &quot;&quot;); double a, b; char f; a = 0; f = &quot;+&quot;; ...

Не пойму где ошибка - C++
Помогите исправить код, ошибок он не выдает, но программа почему то не работает, после вводы данных ничего не происходит, ниже условие и...

Не пойму где ошибка в коде - C++
Задача: (В задаче можно использовать только такие библиотеки и решить надо только через условные операторы.) Все проходит и решение...

STL stack, не пойму где ошибка - C++
#include &lt;iostream&gt; #include &lt;stack&gt; #include &lt;string&gt; #include &lt;sstream&gt; using namespace std; bool isOperator(const string&amp;...

33
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
06.04.2011, 22:33 #16
ну да, теперь потому что у вас буфер выделен размером 1024 байта всего, надо видимо больше))
0
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
06.04.2011, 22:33  [ТС] #17
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
<script type="text/javascript" src="/al_loader.php?act=nav&v=2673"></script>

<link rel="shortcut icon" href="/images/faviconnew.ico" />

<meta http-equiv="content-type" content="text/html; charset=windows-1251" />
<meta name="description" content="<b>ВКонтакте</b> – универсальное средство коммуникации и поиска людей,<br>которым ежедневно пользуются десятки миллионов человек. Мы хотим, чтобы друзья, однокурсники, одноклассники, соседи и коллеги всегда оставались в контакте." />

<title>В Контакте | Добро пожаловать</title>

<noscript><meta http-equiv="refresh" content="0; URL=/badbrowser.php"></noscript>

<link rel="stylesheet" type="text/css" href="/css/al/common.css?127" />
<!--[if lte IE 6]><style type="text/css" media="screen">/* <![CDATA[ */ @import url(/css/al/ie6.css?19); /* ]]> */</style><![endif]-->
<!--[if IE 7]><styээээ

Все что прочитано, даже не все линки к странице и боди нету, почему?
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,933
06.04.2011, 22:33 #18
кстати на чем пишешь
0
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
06.04.2011, 22:35  [ТС] #19
расширил до 4096, читает тоже самое, только плюсует к этому вот эту строку. Что это?
НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН ННННННННННННННННННННээээ
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,933
06.04.2011, 22:35 #20
сдесь примерно и есть 1024
добавь буфер
0
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
06.04.2011, 22:36  [ТС] #21
Цитата Сообщение от ValeryS Посмотреть сообщение
кстати на чем пишешь
На VC++
0
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
06.04.2011, 22:37 #22
буффер то добавил а при чтении в файл заменил на sizeof(char)*4096?

C++
1
inet.Read_File(szData, 4096, &bytes);
1
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
06.04.2011, 22:41  [ТС] #23
точно =))))

Добавлено через 2 минуты
увеличил на 1000000 и там и там, при чтении читает пол страницы, а остальное НННННННН
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,933
06.04.2011, 22:43 #24
Цитата Сообщение от DeadRipper Посмотреть сообщение
inet.Read_File(szData, sizeof(char)*1024, &bytes);
чтобы не забывать вызывай так
C++
1
inet.Read_File(szData, sizeof (szData)/sizeof(char), &bytes);
0
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
06.04.2011, 22:45 #25
C++
1
sizeof (szData)/sizeof(char)
если бы массив был определен статически то да,
но ведь у него szData по прежнему указатель

тогда уж лучше так))

C++
1
2
3
4
#define BUF_SIZE ....
 
char* szData = new char[BUF_SIZE]
inet.Read_File(szData, BUF_SIZE/sizeof(char), &bytes);
1
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,933
06.04.2011, 22:46 #26
пардон увлекся
0
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
06.04.2011, 22:47  [ТС] #27
читает максимум 2621 символов, включая ННННН, они всегда есть, что это такое?
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,933
06.04.2011, 22:48 #28
тогда надо объявить макрос или константу размер буфера
иначе таких косяков будет
если в 5 местах использовать запомни все где править
0
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
06.04.2011, 22:49 #29
а может быть на 2621 байте файл и кончается?

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
тогда надо объявить макрос или константу размер буфера
иначе таких косяков будет
если в 5 местах использовать запомни все где править
ага, от структурирования кода многое зависит
потом знай только меняй константу и все)

0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,933
06.04.2011, 22:58 #30
погугли насчет InternetReadFile
я вот сечас нашел
В вининет InternetReadFile дожидается пока не будет заполнен весь буфер или не закачан весь ответ. У меня ответ приходит блоками, блоки разного размера. Хотелось бы чтоб InternetReadFile возвращал каждый блок сразу по его получении, чтоб его обработать, а не ждать пока придут все блоки... как это можно сделать?
Просто если сервер никак не размечает отправляемые "блоки", то у клиента нет никакой возможности их разделить. На долгом пути от сервера эти "блоки" в принципе могут многократно разбиваться на более мелкие и опять склеиваться, причём "разделение" между блоками будет выглядеть просто как некоторая произвольная задержка между группами пакетов транспортного уровня, весьма условное разделение. Всё что можно сделать, это вычитывать из соединения данные блоками фиксированного размера, либо с помощью связки InternetQueryDataAvailable + InternetReadFileEx читать то, что доступно в данный момент. Но ни то, ни другое не гарантирует, что разделение на "блоки", сделанное на сервере, сохранится на клиенте.
и вот что предлагают
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
PVOID pReadBuffer;
int   iBlockSize;      // Сюда будет писаться размер блока
bool  fData = false;
DWORD dwReaded, 
      dwBufferSize = sizeof(int);
pReadBuffer = &iBlockSize;
 
BOOL fNoReadError = TRUE;
while (fNoReadError = InternetReadFile(hRequest, pReadBuffer, dwBufferSize, &dwReaded)) // !! must be = (not ==)
{
   if (dwReaded)
   {
      if (fData)
      {
         ProcessData(pReadBuffer);  // Обрабатываете свой блок
         free(pReadBuffer);
         // Готовимся читать новый блок
         fData = false;
         pReadBuffer  = &iBlockSize;
         dwBufferSize = sizeof(int);
      } else
      {
         pReadBuffer  = malloc(iBlockSize);
         dwBufferSize = iBlockSize;
         fData = true;
      }
   } else
     break;   // все считано
}
...
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2011, 22:58
Привет! Вот еще темы с ответами:

Своя реализация strcpy - не пойму где ошибка! - C++
void copy(char *p, char *q) throw (char*) { int l2 = strlen(q); //cout&lt;&lt;&quot;strlen(q)=&quot;&lt;&lt;strlen(q)&lt;&lt;&quot; strlen(p)=&quot;&lt;&lt;strlen(p)&lt;&lt;endl; ...

Простой консольный калькулятор - не пойму, где ошибка - C++
#include &lt;stdio.h&gt; int main() { float num1,num2,res,moreCalc; char operation; ...

Операции с массивами (есть логическая ошибка, не пойму где) - C++
Программа компилируется нормально. Спрашивает кол-во элементов массива. Вводятся элементы массива Считает сумму от первого до...

Конечные суммы и произведение (не пойму где ошибка в программе) - C++
Создать программу для вычисления конечной суммы и произведения. #include &lt;iostream.h&gt; #include &lt;math.h&gt; int main() { int i,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
06.04.2011, 22:58
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru