Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ShellExecute, iexplorer страница как результат. 
:(
    Опции темы
Opik
Дата 19.2.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Открываю IE через ShellExecute. Все понятно. Но мне важен сам результат, как его можно получить? т.е HTML source страницы.
PM MAIL Skype   Вверх
azesmcar
Дата 19.2.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



А зачем так извращенно?? тебе сам интернет експлорер нужен или просто код страницы??? просто отправь HTTP запрос на соответствующий сервер..он тебе и вернет HTML код страницы..

Добавлено @ 16:01 
Код

HINTERNET HttpOpenRequest(          HINTERNET hConnect,
    LPCTSTR lpszVerb,
    LPCTSTR lpszObjectName,
    LPCTSTR lpszVersion,
    LPCTSTR lpszReferer,
    LPCTSTR* lpszAcceptTypes,
    DWORD dwFlags,
    DWORD_PTR dwContext
);


А вот и функция..

PM   Вверх
Opik
Дата 19.2.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



azesmcar, 
Нет, мне не нужен только HTML код, мне нужно что бы именно через браузер был визит на страницу, а код нужен, что бы стянуть ссылки со страницы  smile 
PM MAIL Skype   Вверх
azesmcar
Дата 19.2.2007, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Код

int main()
{
    HINTERNET hInter = InternetOpen("Microsoft Internet Explorer", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, INTERNET_FLAG_ASYNC);
    HINTERNET hConnect = InternetConnect(hInter, "85.195.166.51", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
    HINTERNET hRequest = HttpOpenRequest( hConnect, "GET", "main.php", NULL, NULL, NULL, NULL, NULL );
    
    return 0;
}


А если так??? это не считается как визит через браузер?? Остается только получить результат

Добавлено @ 16:14 
Эксплорер этими же функциями пользуется...по моему без разницы
PM   Вверх
Opik
Дата 19.2.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



azesmcar, 
Нужна полная обработка JS на странице, и прочего smile
PM MAIL Skype   Вверх
azesmcar
Дата 19.2.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Я немного не понял..если тебе нужен HTML код страницы..причем тут обработка JS?? JS же не изменяет код в HTML-е??
В любом случае если тебе нужно именно через эксплорер думаю тебе надо копать в сторону написания Plugin -ов для Explorer -а..

http://www.ishodniki.ru/art/artshow.php?ca...amp;pr=vcpp_net
PM   Вверх
Opik
Дата 19.2.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



azesmcar, 
Поясню по-другому, мне нужно:
1) Визит браузера на странице, например IE.
2) Выбрать на странице случайно одну ссылку.
3) Перейти по этой ссылке браузером.


Просто получение через HTTP код страницы - не катит, не считается это за "живой" визит.
PM MAIL Skype   Вверх
Dray
Дата 19.2.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: 2
Всего: 6



А ты открывай браузер через ShellExecute. Сурс той же страницы получай через функцию, которую предложил 
azesmcar. И снова через ShellExecute открывай страницу по нужной ссылке.  smile 


--------------------
忍者

user posted image
PM MAIL   Вверх
Opik
Дата 19.2.2007, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Dray, 
Всего лишь навсего появляется "неживой" визит и переход без сессии smile
PM MAIL Skype   Вверх
azesmcar
Дата 20.2.2007, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Ну это уже совсем меняет дело smile

Код

void KeyPress(BYTE vkKey)
{
    keybd_event( vkKey, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );
    keybd_event( vkKey, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}

int main()
{
        //Здесь запускаешь internet explorer и убеждаешся что его окно активировано
        //А дальше все просто, инитируешь случайное количество нажатия Tab, а потом ENTER!
    for ( int i = 0; i < rand()%50; ++i )
        KeyPress( VK_TAB );
    KeyPress( VK_RETURN );
    return 0;
}

PM   Вверх
Opik
Дата 20.2.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



azesmcar, 
Да, это как вариант, но нужно именно клик мышки smile такое уж условие
PM MAIL Skype   Вверх
azesmcar
Дата 20.2.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Блин..ну у вас и запросы smile а какая разница? чисто технически..для эксплорера тоже самое, а если мышкой подвигать и нажимать? Хотя как-то неправильно это..

Добавлено @ 16:19 
Хотя если тебе нужно имитировать полностью пользовательский ввод то без мышки никак...или надо найти обьект в эксплорере и отправить ему WM_LBUTTONCLICK но это не кажется реальным...link это не окно

Добавлено @ 16:21 
Мы помоему уже сбились с вопроса smile

Цитата

Но мне важен сам результат, как его можно получить? т.е HTML source страницы. 


Мне интересно, а как ты хотел сделать еслиб получил HTML код страницы?
PM   Вверх
Opik
Дата 20.2.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



azesmcar, 
ну там я бы хотя бы ссылки получил, но ты тоже на мысль натолкнул, пока думаю как лучше сделать... нужно как то определить где ссылка, навести туда мышку и кликнуть smile о как
PM MAIL Skype   Вверх
azesmcar
Дата 20.2.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



А если так?

Использовать первую часть моего примера..т.е. TAB, потом получить GetFocus() т.е. HANDLE сфокусированного обьекта и отправить ему WM_LBUTTONCLICK?
Только надо сперва сделать AttachThreadInput.
Должно сработать..
PM   Вверх
Opik
Дата 20.2.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Ща буду иска как это все делать smile
PM MAIL Skype   Вверх
azesmcar
Дата 20.2.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Код

int main()
{
    HWND hw = GetForegroundWindow();
    AttachThreadInput( GetWindowThreadProcessId( hw, NULL ), GetCurrentThreadId(), true );
    std::cout << GetFocus() << std::endl;
        return 0;
}


Да вроде бы так...хотя у меня пока независимо от фокуса один и тот же хендл возвращяет
PM   Вверх
Opik
Дата 20.2.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Извините за банальный вопрос, но что нужно подключить, что бы заработал ShellExecute? smile)) И вообще как определять что нужно подключать в тех или иных случаях?
PM MAIL Skype   Вверх
Opik
Дата 20.2.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



так, с этим сам разобрался smile
PM MAIL Skype   Вверх
Opik
Дата 20.2.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



azesmcar, 
Что ещё немаловажно, окно создается с параметрами SW_HIDE
PM MAIL Skype   Вверх
Rockie
Дата 21.2.2007, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Opik, msdn говорит что
Цитата
Function Information

Minimum DLL Version shell32.dll version 3.51 or later 
Custom Implementation No 
Header shellapi.h
Import library shell32.lib 
Minimum operating systems Windows NT 4.0, Windows 95 
Unicode Implemented as ANSI and Unicode versions.  

p.s.: сам не проверял.

Добавлено @ 01:41 
Цитата(Opik @  20.2.2007,  18:42 Найти цитируемый пост)
так, с этим сам разобрался 

этот пост я уже проспал smile




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Opik
Дата 23.2.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



А каким образом можно получить Thread ID процесса, созданного, через ShellExecute?
PM MAIL Skype   Вверх
codelord
Дата 24.2.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



вот посмотри надеюсь правильно понял суть вопроса.
Код

bool GetProcessByExeName(DWORD* Pid, String ExeName,DWORD* YPid) //
{
HANDLE hProcessSnap = NULL;
PROCESSENTRY32 pe32      = {0};
String temp="";

hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
pe32.dwSize=sizeof(PROCESSENTRY32);

if(Process32First(hProcessSnap,&pe32)) temp=pe32.szExeFile; 
if((temp.UpperCase()).Pos(ExeName.UpperCase()))
       {
       if(pe32.th32ParentProcessID==*YPid)
       {
         *Pid= pe32.th32ProcessID;
         CloseHandle (hProcessSnap);
         return true;
        }
       }
pe32.dwSize=sizeof(PROCESSENTRY32);

while(Process32Next(hProcessSnap,&pe32))
        {
        temp=pe32.szExeFile;
        if((temp.UpperCase()).Pos(ExeName.UpperCase()))
                {
                if(pe32.th32ParentProcessID==*YPid)
                         {
                         *Pid= pe32.th32ProcessID;
                          CloseHandle (hProcessSnap);
                          return true;
                         }
                }
        pe32.dwSize=sizeof(PROCESSENTRY32);
        }
        
CloseHandle(hProcessSnap);
*Pid=0;
return false;
}

пользуемся так:
Код

 DWORD pid, YPid; //pid это создаваемого процесса, а YPid твоей проги
 YPid=getpid();
 ShellExecute(Handle,NULL,"notepad.exe",NULL,NULL,SW_RESTORE);
 GetProcessByExeName(&pid,"notepad.exe",&YPid);
 // Edit1->Text = pid; //тут уже будет нужный пид созданный по шелл экзекюте

подрубаем хедеры
#include "tlhelp32.h"
#include <process.h>
делал Borland BCB 6.0, но та в принципе API поэтому должно  работать в других средах..

Это сообщение отредактировал(а) codelord - 24.2.2007, 13:59


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Opik
Дата 24.2.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



codelord, 
На моем примере я запускаю iexplorer.exe, а если у пользователя уже будет запущен оный?

Добавлено @ 15:49 
codelord, 
+ Нужен именно Thread ID, созданного процесса.
Код

AttachThreadInput(  GetCurrentThreadId(), threadID, true );

PM MAIL Skype   Вверх
codelord
Дата 24.2.2007, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



Цитата

На моем примере я запускаю iexplorer.exe, а если у пользователя уже будет запущен оный?

если у пользователя был запущен не тобой, то код покажет пид твоего, того которая запустила твоя прога, т.е. родителский пид запущенного процесса должен быть пид твоей проги, а если запустил не ты будет 0.

Это сообщение отредактировал(а) codelord - 24.2.2007, 20:09


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Opik
Дата 24.2.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



codelord, 
Насколько я понял по коду, возращается pid, a не thread id
PM MAIL Skype   Вверх
codelord
Дата 25.2.2007, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



Цитата(Opik @  24.2.2007,  16:31 Найти цитируемый пост)
codelord, Насколько я понял по коду, возращается pid, a не thread id

правильно, это я отвечал на 
Цитата(Opik @  24.2.2007,  11:47 Найти цитируемый пост)
codelord, На моем примере я запускаю iexplorer.exe, а если у пользователя уже будет запущен оный?

, а про ThreadID не очень догоняю, потому как я понимаю если ShellExecute () запустит прогу 
которая создаст 100 потоков, какой именно забрать?

Добавлено @ 03:16 
 думаю смотреть надо в сторону
GetWindowThreadProcessId, ищем нужное окно и забираем Id потока который его создал.


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
codelord
Дата 25.2.2007, 03:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



вот запусти IEXPLORE который ты видимо будешь запускать через ShellEx.. и посмотри в диспетчере сколько у него потоков.
который из них нужен?


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Opik
Дата 25.2.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



codelord, 
А будет ли GetWindowThreadProcessId работать, если окно SW_HIDE? Ведь как такового окна не будет?
PM MAIL Skype   Вверх
azesmcar
Дата 26.2.2007, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата

А будет ли GetWindowThreadProcessId работать, если окно SW_HIDE? Ведь как такового окна не будет?


Будет..окно есть, просто его не видно..Я думаю тебе нужен поток обработки сообщений основного окна..codelord верно сказал..тебе нужна функция GetWindowThreadProcessId..
А насчет получение ID процесса..лучше используй ShellExecuteEx. Он возвращяет..

Но учти что
Цитата


hProcess - Handle to the newly started application. This member is set on return and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched. For example, if a document to be launched is a URL and an instance of Microsoft® Internet Explorer is already running, it will display the document. No new process is launched, and hProcess will be NULL. 

typedef struct _SHELLEXECUTEINFO{
    DWORD cbSize; 
    ULONG fMask; 
    HWND hwnd; 
    LPCTSTR lpVerb; 
    LPCTSTR lpFile; 
    LPCTSTR lpParameters; 
    LPCTSTR lpDirectory; 
    int nShow; 
    HINSTANCE hInstApp; 
 
    // Optional members 
    LPVOID lpIDList; 
    LPCTSTR lpClass; 
    HKEY hkeyClass; 
    DWORD dwHotKey; 
    union {
  HANDLE hIcon;
  HANDLE hMonitor;
    } DUMMYUNIONNAME;
    HANDLE hProcess; 
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO; 


PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0690 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.