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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2011, 18:55   #1
[CACHE]
 
Аватар для [CACHE]
 
Регистрация: 25.06.2011
Сообщений: 8
Вопрос

решил заняться win api, и вроде когда все было на уровне создания виндоокон и консольных функций - все было шикарно. но блин, как только связался с wininternet начались проблемы:

Код:
#include <cstdlib>
#include <iostream>
#include <string>
#include <WinInet.h>
#include <Windows.h>

using namespace std;

int main(int argc, char *argv[])
{
        BOOL  bResults = FALSE;
    HINTERNET hSession = NULL,
              hConnect = NULL,
              hRequest = NULL;
    DWORD id,orq,srq,dwSize;
//    LPCSTR addr,filename;
    LPVOID rcve;
    PDWORD outbyte;

    cout<<"starting"<<endl;
    
/*    cout<<"type URI of server"<<endl;
    cin>>addr;
    cout<<"type path on server to this file"<<endl;
    cin>>filename;
*/    // Use WinHttpOpen to obtain a session handle.
    hSession = InternetOpen (  "DOLBOEBILLA dev simple/1.0",
                               INTERNET_OPEN_TYPE_PRECONFIG,
                               NULL,
                               NULL,
                               0);

    cout<<"Open done"<<endl;

    // Specify an HTTP server.
    if (hSession){
        hConnect = InternetConnect ( hSession, "http://www.google.ru",
                             INTERNET_DEFAULT_HTTP_PORT,
                             NULL, 
                             NULL,
                             INTERNET_SERVICE_HTTP,
                             0,
                             id
                             );
        cout<<"open OK"<<endl;
    };

    // Create an HTTP Request handle.
    if (hConnect){
        hRequest = HttpOpenRequest( hConnect, "GET", 
                                       "/index.html", 
                                       NULL,
                                       NULL, 
                                       NULL,
                                       0,
                                       orq);
        cout<<"connect OK"<<endl;
    };

    // Send a Request.
    if (hRequest){ 
        bResults = HttpSendRequestEx ( hRequest, 
                                       NULL,
                                       NULL,
                                       0,
                                       srq);
        cout<<"open request OK"<<endl;
    };
    
    // Ending sensing RQ
    if (bResults){
       bResults = HttpEndRequest(hRequest,
                                 NULL,
                                 0,
                                 0);
       cout<<"send RQ OK"<<endl;
    };
    if (bResults){
        bResults = InternetReadFile( hRequest, rcve, 99999, outbyte);
        cout<<"RQ succ sent"<<endl;
    };

    // Close any open handles.
    if (hRequest) InternetCloseHandle(hRequest);
    if (hConnect) InternetCloseHandle(hConnect);
    if (hSession) InternetCloseHandle(hSession);
    
    cout<<"reading file"<<bResults<<endl<<rcve<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
при компиляции этого на все инетовские функции выдавало примерно это:
" [Linker error] undefined reference to `InternetOpenA@20' ".

когда поискал в нете - выснилось что компоновщику нужно приписать аргумент "-Iwininet", и все вроде заработало, но - прога виснет после ввода урл(как будто выход за пределы массива).
но это я обошел подставкой строк в функции напрямую. теперь еще большее "но" - "самодиагностика" выдает что запрос не посылается и не оканчивается как следствие.

если что - юзаю devcpp 4.9.9.2
хелп плиз

еще: проверял через браузер, http://www.google.ru/index.html точно существует =)
const BOOL HumanToHuman = (Human.toHuman=="Wolf");
cout<<HumanToHuman<<endl; //TRUE
код неверный, но все меня поняли...

Последний раз редактировалось Stilet; 26.06.2011 в 18:25.
[CACHE] вне форума Ответить с цитированием
Старый 25.06.2011, 19:44   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

либу подцепи Wininet.lib
counter вне форума Ответить с цитированием
Старый 25.06.2011, 19:53   #3
[CACHE]
 
Аватар для [CACHE]
 
Регистрация: 25.06.2011
Сообщений: 8
По умолчанию

зачем? все функции работают ведь. мне нужна помощь в вопросе "почему запрос ниреха не посылается, и как это лечить" ?
const BOOL HumanToHuman = (Human.toHuman=="Wolf");
cout<<HumanToHuman<<endl; //TRUE
код неверный, но все меня поняли...
[CACHE] вне форума Ответить с цитированием
Старый 25.06.2011, 22:47   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Ошибка 1.
Цитата:
Сообщение от [CACHE] Посмотреть сообщение
еще: проверял через браузер, http://www.google.ru/index.html точно существует =)
Не тот URL проверял. У тебя имя сервера "http://www.google.ru"
Код:
ping http://www.google.ru
Такого сервера нет.
Ошибка 2.
Код:
bResults = InternetReadFile( hRequest, rcve, 99999, outbyte);
А этот rcve даже неинициализированный.
Somebody вне форума Ответить с цитированием
Старый 25.06.2011, 23:42   #5
[CACHE]
 
Аватар для [CACHE]
 
Регистрация: 25.06.2011
Сообщений: 8
По умолчанию

Somebody, спасибо. с первой проблемой я разобрался - не нужно указывать что это http://. а что со второй делать, пишу:
Код:
    LPVOID rcve = "";
выдает "invalid conversion from `const void*' to `void*' "
потом пытаюсь
Код:
    LPVOID rcve = NULL;
происходит то, что обычно, правда запрос отправляется. но них не приходит. чему еще приравнять можно

ок, исправил так:
Код:
LPVOID rcve = new char*[1024]
bResults = InternetReadFile( hRequest, rcve, 1024, outbyte);
ок, работает!
смотрим далее - хочу сделать ввод адреса сервера и файла пользователем и опять нихера не работает:
Код:
int main(int argc, char *argv[])
{
        BOOL  bResults = FALSE;
    HINTERNET hSession = NULL,
              hConnect = NULL,
              hRequest = NULL;
    DWORD id,orq;
    LPCSTR addr,filename;
    LPVOID rcve = new char*[1024];
    PDWORD outbyte;

    cout<<"***---*** starting ***---***"<<endl;
    
    cout<<"type URI of server"<<endl;
    cin>>addr;
    cout<<"type path on server to this file"<<endl;
    cin>>filename;
    // Use WinHttpOpen to obtain a session handle.
    hSession = InternetOpen (  "DOLBOEBILLA dev simple/1.0",
                               INTERNET_OPEN_TYPE_PRECONFIG,
                               NULL,
                               NULL,
                               0);

    // Specify an HTTP server.
    if (hSession){
        hConnect = InternetConnect ( hSession, addr,
                             INTERNET_DEFAULT_HTTP_PORT,
                             NULL, 
                             NULL,
                             INTERNET_SERVICE_HTTP,
                             0,
                             id
                             );
        cout<<"open OK"<<endl;
    };

    // Create an HTTP Request handle.
    if (hConnect){
        hRequest = HttpOpenRequest( hConnect, "GET", 
                                       "/"+file, 
                                       NULL,
                                       NULL, 
                                       NULL,
                                       0,
                                       orq);
        cout<<"connect OK"<<endl<<"connection id:"<<id<<endl;
    };

    // Send a Request.
    if (hRequest){ 
        bResults = HttpSendRequest ( hRequest, 
                                       NULL,
                                       0,
                                       NULL,
                                       0);
        cout<<"open request OK"<<endl<<"RQ context:"<<orq<<endl;
    };
    
    if (bResults){
        bResults = InternetReadFile( hRequest, rcve, 1024, outbyte);
        cout<<"RQ succ sent"<<endl;
    };

    // Close any open handles.
    if (hRequest) InternetCloseHandle(hRequest);
    if (hConnect) InternetCloseHandle(hConnect);
    if (hSession) InternetCloseHandle(hSession);
    
    cout<<"ANY reading file ERR "<<!bResults<<endl<<"bytes: "<<*outbyte<<"; recieved data addr: "<<rcve<<
    endl<<"RECIEVED D   A   T   A\n***---***---***---***---***---***"<<endl<<
    (char*)rcve;
    system("PAUSE");
    return EXIT_SUCCESS;
}
const BOOL HumanToHuman = (Human.toHuman=="Wolf");
cout<<HumanToHuman<<endl; //TRUE
код неверный, но все меня поняли...

Последний раз редактировалось Stilet; 26.06.2011 в 18:26.
[CACHE] вне форума Ответить с цитированием
Старый 26.06.2011, 01:15   #6
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от [CACHE] Посмотреть сообщение
зачем?
это я так затупил)
counter вне форума Ответить с цитированием
Старый 26.06.2011, 12:17   #7
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
LPVOID rcve = new char*[1024];
Это не указатель на 1024 char, а указатель на 1024 указателя на char.
Код:
LPCSTR addr,filename;
...
cin>>addr;
...
cin>>filename;
Опять неинициализированные указатели. К тому же на константу. Может быть, лучше сначала с C++ разобраться, а потом с WinInet?
Somebody вне форума Ответить с цитированием
Старый 26.06.2011, 15:55   #8
[CACHE]
 
Аватар для [CACHE]
 
Регистрация: 25.06.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Somebody Посмотреть сообщение
Код:
LPVOID rcve = new char*[1024];
Это не указатель на 1024 char, а указатель на 1024 указателя на char.
Код:
LPCSTR addr,filename;
...
cin>>addr;
...
cin>>filename;
Опять неинициализированные указатели. К тому же на константу. Может быть, лучше сначала с C++ разобраться, а потом с WinInet?
во-первых, это скорее не cpp, а win API, т.к. Страуструп не особо пишет про тип LPCSTR. это так, на "если что".

во-вторых, если ты не читал рефер, то эти функции требуют как раз этот тип. окей, я молчу, т.к. я лох и неудачник. делаю принудительное приведение типов:
Код:
string addr,filename;
...(LPCSTR)&addr...
в третьих, если совать
Код:
LPVOID rcve = new char[1024]
, то как бы я потом не выделял память под это или вообще не выделял, выдает ошибку ReadingFile.

и в четвертых - если ты и правда так крут, как хочешь казаться, сам напиши работаюший код. и тогда уже не тыкай "это не то, это не так", а просто выложи блок.
const BOOL HumanToHuman = (Human.toHuman=="Wolf");
cout<<HumanToHuman<<endl; //TRUE
код неверный, но все меня поняли...
[CACHE] вне форума Ответить с цитированием
Старый 26.06.2011, 16:25   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от [CACHE] Посмотреть сообщение
во-первых, это скорее не cpp, а win API, т.к. Страуструп не особо пишет про тип LPCSTR. это так, на "если что".
Но за всеми этими LPCSTR скрываются простые и честные const char*, void* и т.д.
Цитата:
во-вторых, если ты не читал рефер, то эти функции требуют как раз этот тип. окей, я молчу, т.к. я лох и неудачник. делаю принудительное приведение типов:
Код:
string addr,filename;
...(LPCSTR)&addr...
Ну такого делать точно не надо. Вам совершенно верно подсказали. Все типы в WinAPI, которые начинаются с LP или P - указатели, потому под них нужно выделять память.
Цитата:
Код:
    LPCSTR addr,filename;
    LPVOID rcve = new char*[1024];
    PDWORD outbyte;
Код:
char addr[80];
char filename[250];
char* rcve = new char[1024]; // char rcve[1024];
DWORD outbyte;
И тогда здесь будет так:
Код:
        bResults = InternetReadFile( hRequest, rcve, 1024, &outbyte);
Цитата:
Код:
        hRequest = HttpOpenRequest( hConnect, "GET", 
                                       "/"+file, 
                                       NULL,
                                       NULL, 
                                       NULL,
                                       0,
                                       orq);
Во-первых: file - это что?
Это на первый взгляд - проверить не могу, к сожалению.
netrino вне форума Ответить с цитированием
Старый 26.06.2011, 22:44   #10
[CACHE]
 
Аватар для [CACHE]
 
Регистрация: 25.06.2011
Сообщений: 8
По умолчанию

Код:
DWORD outbyte;
или
Код:
PDWORD outbyte;
- уже дело лично каждого, хранить в переменной ее значение или линк - так что это кому как захочется, при использовании единственная разница(ну и все вытекающие) + инициализация(хотя да, все же удобней Ваш вариант)
Код:
type outbyte;
outbyte - value;
&outbyte - address;
---------------------
type* outbyte = new type;
*outbyte - value;
outbyte - adress;
Цитата:
Но за всеми этими LPCSTR скрываются простые и честные const char*, void* и т.д.
да ладно? я знал, честно. дико тупанул с линком на войд, т.к. раньше его вообще не использовал за ненадобностью.

Цитата:
Во-первых: file - это что?
это filename. код был написан хер знает во сколько (ночи)утра, не откомпилирован и тем более не проверен. извините мою тупость.

мне нахрен не нужно ограничение по длине адреса и пути на сервере, поэтому Ваш способ не подходит для моего случая. огромное спасибо за помощь.

и еще: пытаюсь динамически выделять память под данные ответа, но они как-то затираются, что-ли:
Код:
...
    char* RB = new char[1024];
...

bResults = InternetReadFile( hRequest, rcve, 1024, &outbyte);

cout<<"FStack Kbytes: "<<outbyte/1024<<"; FStack data addr: "<<&rcve<<endl;

    while (bResults && (outbyte>=1024)){
        i++;
        RB = new char[1024*(i-1)];
        for(int k=0;k<1024*(i-1);k++)RB[k] = rcve[k];
        rcve = new char[1024*i];
        for(int k=0;k<1024*(i-1);k++)rcve[k] = RB[k];
        bResults = InternetReadFile( hRequest, rcve, 1024, &outbyte);
    };
...
const BOOL HumanToHuman = (Human.toHuman=="Wolf");
cout<<HumanToHuman<<endl; //TRUE
код неверный, но все меня поняли...
[CACHE] вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Wininet проверкa отправки Dan4ik95 Работа с сетью в Delphi 2 23.01.2011 07:28
WinInet vitalik007 Работа с сетью в Delphi 1 14.10.2007 13:09
проблема с wininet API delphi_coder Работа с сетью в Delphi 4 18.09.2007 14:08
Подключение через WinInet SHEI'TI Работа с сетью в Delphi 1 15.02.2007 19:53