[C++] Sterownie internet explorerem.

0

Witam. Chciał bym napisać program, który wchodził by na strony w ukrytym IE.
Może najpierw przedstawię o co mi dokładnie chodzi:
-odczyt pliku .txt o treści:
http://www.onet.pl
http://www.google.pl
http://www.wp.pl
-otworzenie IE(ukrytego)
-wejście na stronę pierwszą
-po wejściu program ma odczekać 4 sekundy i zatrzymać ładowanie reszty strony
-odczekuje 10 sekund,
-wchodzi na kolejną, odczekuje, zatrzymuje...

Przedstawię teraz materiały jakie udało mi się zgromadzić:
Ukrywanie IE:

/**

  Program: Internet Explorer Hider v1.0

  File: hide.cpp

  Purpose: Hides all instances of Internet Explorer windows when the [F8] key is pressed.
  
  Note(s): Requires Microsoft Platform SDK
		   Compiled in Microsoft Visual C++ 6.0 (Win 98 SE)
		   This application can be terminated by pressing the [Esc] key.

  Copyright © 2007 Brenton Andrew Saunders. All Right Reserved

  [email protected]   (Personal)
  [email protected] (Business)
  
  Last Revised 2/14/07

 */

#include <windows.h> // For Win32 API

/** Global Variables */

BOOL g_bHide = FALSE; // TRUE if all instances of Internet Explorer should be hidden

/** Function Prototypes */

BOOL CALLBACK EnumWindowsProc(HWND, LPARAM);

/**

  Function: WinMain()

  Purpose: Standard Win32-application entry point. Tests if the [F8] key is being pressed.
		   If so, it enumerates all top-level windows (See EnumWindowsProc).

  Parameters (from MSDN):

			hInstance     - handle to current instance
			hPrevInstance - handle to previous instance
			lpCmdLine     - pointer command line
			nShowCmd      - show state of window

  Note(s): Hitting the [Esc] key causes the application to exit the main loop; thus ending
		   the program.

 */

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
				   int nShowCmd) {

	while(TRUE) { // Main loop; Keeps the program running

		if(GetAsyncKeyState(VK_F8) & 0x8000) { // Is the [F8] key being pressed ?

			// Determine whether to show or hide all instances of Internet Explorer

			if(g_bHide == TRUE) {
	
				g_bHide = FALSE;
			}
			else
				g_bHide = TRUE;

			EnumWindows(EnumWindowsProc, (LPARAM)NULL);

			while(GetAsyncKeyState(VK_F8) & 0x8000); // Wait until the [F8] key is released to continue ...
		}
		else if(GetAsyncKeyState(VK_ESCAPE) & 0x8000) { // Is the [Esc] key being pressed ?

			break; // Terminate the application
		}

		Sleep(0); // So we won't be a CPU hog
	}

	return 0;
}

/**

  Function: EnumWindowsProc()

  Purpose: Enumerates all top-level windows. If the enumerated window is an Internet Explorer
		   window, then it is hidden based on the value of g_bHide.

  Parameters (from MSDN):

			hwnd   - pointer to callback function
			lParam - application-defined value

  Note(s): N/A

 */

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {

	CHAR szClassName[80];

	GetClassName(hwnd, szClassName, 80); // Retrieve the class name of the enumerated window

	if(lstrcmp(szClassName, "IEFrame") == 0) { // Is it an Internet Explorer window ?

		if(g_bHide == TRUE) { // Should we restore or hide the window ?

			ShowWindow(hwnd, SW_HIDE); // Hide the window
		}
		else
			ShowWindow(hwnd, SW_SHOW); // Show the window
	}

	return TRUE;
}

Wchodzenie na strony:

plik.seekg(0, ios::beg);
    while(!plik.eof()){
                       char start[100] = "start ";
                       string str;
                       getline(plik,str);
                       str.copy(link,100);
                       strcat(start,link); //sam nie rozumie... ale dziala
                       system(start);
                       memset(start,'\0',strlen(start));
                       memset(link,'\0',strlen(link));
                       DelaySecs(x);
                       }
    plik.close();

Potrzebuje teraz funkcji naciskającej klawisz ESC(zatrzymanie ładowania strony) i pomocy jak to posklejać bo ja już się pogubiłem :(

Z poważaniem,
evolucja.</ort>

0

Tego nie robi się w taki sposób, poza tym ukrycie IE przez SW_HIDE spowoduje że się zamknie jeśli to wykryje nawigując gdzieś.

IWebBrowser2 *browser; // Exdisp.h
CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_SERVER, IID_IWebBrowser2, (void**)&browser);

while (index--)
{
	VARIANT vUrl, v;
	vUrl.vt      = VT_BSTR;
	vUrl.bstrVal = SysAllocString(wszUrl[index]); // wszUrl = WCHAR*[] {L"http://onet.usa", L"http://com.com"}
	v.vt         = VT_EMPTY;

	browser->Navigate2(&vUrl, &v, &v, &v, &v);
	VariantClear(&vUrl);

	Sleep(time);
	browser->Stop();
}
browser->Release();
0
#include <windows.h>
#include <exdisp.h>

IWebBrowser2 *browser; // Exdisp.h
CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_SERVER, IID_IWebBrowser2, (void**)&browser);

while (index--)
{
        VARIANT vUrl, v;
        vUrl.vt      = VT_BSTR;
        vUrl.bstrVal = SysAllocString(wszUrl[index]); 
        wszUrl = WCHAR*[] {L"http://onet.pl", L"http://google.com"}
        v.vt         = VT_EMPTY;

        browser->Navigate2(&vUrl, &v, &v, &v, &v);
        VariantClear(&vUrl);

        Sleep(3000);
        browser->Stop();
}
browser->Release();

}

To nie chce się skompilować :/

0

mistrz Yoda mowi: main() funkcji uzyj!

0

po opakowaniu tego w main:

#include <cstdlib>
#include <iostream>
#include <Exdisp.h>

using namespace std;

int main(int argc, char *argv[])
{
    IWebBrowser2 *browser; // Exdisp.h
CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_SERVER, IID_IWebBrowser2, (void**)&browser);

while (index--)
{
        VARIANT vUrl, v;
        vUrl.vt      = VT_BSTR;
        vUrl.bstrVal = SysAllocString(wszUrl[index]); 
        wszUrl = WCHAR*[] {L"http://onet.usa", L"http://com.com"}
        v.vt         = VT_EMPTY;

        browser->Navigate2(&vUrl, &v, &v, &v, &v);
        VariantClear(&vUrl);

        Sleep(time);
        browser->Stop();
}
browser->Release();
    system("PAUSE");
    return EXIT_SUCCESS;
}

Wyskakuje jakiś 3 D:\Dev-Cpp\include\Exdisp.h:9, from main.cpp In file included from D:/Dev-Cpp/Bin/../lib/gcc/mingw32/3.4.2/../../../../include/Exdisp.h:9, from main.cpp

0

Masz spore braki skoro definiujesz (i to źle) wszUrl po użyciu.

#include <ole2.h>
#include <Exdisp.h>
#include <shlguid.h>

// project options->parameters->linker->wklej poniższe
// -luuid -loleaut32 -lshell32 -lole32 -lkernel32

int main(int argc, char *argv[])
{
	IWebBrowser2 *browser; // Exdisp.h
	CoInitialize(0);
	CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_SERVER, IID_IWebBrowser2, (void**)&browser);
	// pokaż IE
	//browser->put_Visible(VARIANT_TRUE);

	WCHAR* wszUrl[] = {L"http://onet.pl", L"http://google.com"};
	int index = sizeof(wszUrl)/4;

	while (index--)
	{
		VARIANT vUrl, v;
		vUrl.vt      = VT_BSTR;
		vUrl.bstrVal = SysAllocString(wszUrl[index]);
		v.vt         = VT_EMPTY;

		browser->Navigate2(&vUrl, &v, &v, &v, &v);
		VariantClear(&vUrl);

		Sleep(5000); // 5 sekund
		browser->Stop();
	}
	// zamknij IE jeśli trzeba
	//browser->Quit();

	browser->Release();
	CoUninitialize();
	return 0;
}
0

dalej nie działa :/

Kompilator: Default compiler
Building Makefile: "D:\Dev-Cpp\4programmers\Makefile.win"
Wykonywanie  make...
make.exe -f "D:\Dev-Cpp\4programmers\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"lib/gcc/mingw32/3.4.2/include"  -I"include/c++/3.4.2/backward"  -I"include/c++/3.4.2/mingw32"  -I"include/c++/3.4.2"  -I"include"   

g++.exe main.o  -o "Projekt1.exe" -L"lib"  

main.o(.text+0x132):main.cpp: undefined reference to `CoInitialize@4'
main.o(.text+0x144):main.cpp: undefined reference to `IID_IWebBrowser2'
main.o(.text+0x160):main.cpp: undefined reference to `CoCreateInstance@20'
main.o(.text+0x19c):main.cpp: undefined reference to `SysAllocString@4'
main.o(.text+0x1ee):main.cpp: undefined reference to `VariantClear@4'
main.o(.text+0x234):main.cpp: undefined reference to `CoUninitialize@0'
collect2: ld returned 1 exit status

make.exe: *** [Projekt1.exe] Error 1
0

Przepraszam :) teraz ładnie wszystko działa. zapomniałem dodać do linkera...
Jak teraz zrobić by linki w "wszUrl" były pobieranie z pliku linki.txt z serwerwww.pl/?

0

Nikt nie wie?

0

Na stronie serwerwww.pl nie ma takiego pliku, jest tylko pełno linków.
Napisz technicznym językiem co chcesz zrobić i jakie masz dane wejściowe.
Jeśli chcesz otworzyć każdy/zbiór linków z tej strony, to adres każdego z nich można pobrać bezpośrednio ze przeglądarki.

0

Co chcę zrobić? Chce pobrać do zmiennej z linkami plik.txt z adresu np. http://www.evolucja.ugu.pl/linki.txt o formie:

http://www.onet.pl/
http://www.google.pl/
http://www.wp.pl

Czy teraz już wszystko jasne? :)

0

i po to potrzebujesz komponentu przegladardki????? otworz polaczenie zwyklymi socketami, wyslij httprequest i dostaniesz w odpowiedzi tresc pliku czystym tekstem.. tekst sobie polamiesz po \n i bedziesz mial kolekcje linkow..

0

Ale skoro komponent został już użyty nie ma sensu tego zmieniać.

0

jak chcesz. ale poczytaj o brzytwie occam'a i na drugi raz nie wywazaj wieczka do majonezu łopatą..

1 użytkowników online, w tym zalogowanych: 0, gości: 1