2013-06-27 15 views
7

Wie kann ich eine URL von meinem C++ - Programm öffnen? Was ist das Äquivalent in C++Öffnen Sie die URL von C++ - Code

in Ruby können Sie

%x(open https://google.com) 

tun? Ich frage mich, ob es eine plattformunabhängige Lösung gibt. Aber wenn es nicht der Fall, würde ich den Unix/Mac besser gefällt :)

Hier ist mein Code:

#include <stdio.h> 
#include <string.h> 
#include <fstream> 

int main (int argc, char *argv[]) 
{ 
    char url[1000] = "https://www.google.com"; 

    std::fstream fs; 
    fs.open(url); 
    fs.close(); 

    return 0; 
} 
+2

Bibliotheken sagen wie Qt eine plattformunabhängige Art und Weise zur Verfügung stellen zu mach das. Es gibt nichts in der C++ - Sprache selbst, das zu liefern. – drescherjm

+5

Warum ist der Titel dieser Frage völlig anders als das eigentliche Thema? –

+0

Entschuldigung, es wurde behoben. Vielen Dank. – rodrigoalves

Antwort

12

Verwenden libcurl, hier ist eine einfache example.

EDIT:

system("<mybrowser> http://google.com"); 

Durch das Ersetzen <mybrowser> mit dem Browser, den Sie starten möchten: Wenn diese einen Web-Browser über das Starten von C++ ist, können Sie einen Shell-Befehl mit system auf einem POSIX-System aufrufen kann.

+2

Ihr Update ist genau das, was ich wollte. Siehe Anwendung unter https://gist.github.com/rodrigoalvesvieira/662e400f34dd9de38176 – rodrigoalves

3

C ist nicht so hoch wie die von Ihnen erwähnte Skriptsprache. Wenn Sie sich jedoch von der Socket-basierten Programmierung fernhalten wollen, versuchen Sie es mit Curl. Curl ist eine großartige C-Bibliothek und hat viele Funktionen. Ich habe es seit Jahren benutzt und empfehle es immer. Es enthält auch einige eigenständige Programme zum Testen oder Shell-Einsatz.

+1

@rodrigoalves Curl ist auf fast jedem Betriebssystem verfügbar, einschließlich vieler Varianten von Windows und Linux. Es ist die Zeit wert, es zu lernen. Es hat viele, viele großartige Eigenschaften. –

+0

Ja. Ich habe häufig vom Terminal aus gearbeitet, meistens um API-Ausgaben und ähnliches zu testen. Niemals aus einem C++ - Programm, tho. – rodrigoalves

15

Ihre Frage kann zwei verschiedene Dinge bedeuten. 1) Öffnen Sie die Webseite mit dem Browser.

ShellExecute(0, 0, L"http://www.google.com", 0, 0 , SW_SHOW); 

Dies sollte funktionieren, es öffnet Datei mit zugehörigem Programm. Sollte Browser öffnen, ist es in der Regel Standard. 2) Holen Sie sich den Code der Webseite und Sie werden es selbst rendern oder etwas anderes tun. Dazu würde ich gerne lesen this oder/und this

Ich hoffe, es ist zumindest ein wenig hilfreich.

EDIT: Habe nicht bemerkt, was Sie für UNIX fragen, das funktioniert nur unter Windows.

+0

es ist nur für Windows, oder? Ich meine ShellExecute. Danke trotzdem – rodrigoalves

+1

Dies ist eine Windows-Lösung zum Starten des Standard-Browsers zum Öffnen einer URL. Das OP erwähnte plattformunabhängig. Qt würde das bereitstellen, obwohl es für diese Aufgabe ziemlich schwer wäre. – drescherjm

+0

Nur um diese Frage ein wenig interessanter zu machen: Was, wenn ich ein gewöhnliches Terminalprogramm von meinem C/C++ Code ausführen möchte. Gibt es einen Weg? Führen Sie zum Beispiel cd – rodrigoalves

4

Hier ist ein Beispiel in Windows-Code mit Winsock.

#include <winsock2.h> 
#include <windows.h> 
#include <iostream> 
#include <string> 
#include <locale> 
#pragma comment(lib,"ws2_32.lib") 
using namespace std; 

string website_HTML; 
locale local; 


void get_Website(char *url); 

int main() 
{ 
    //open website 
    get_Website("www.google.com"); 

    //format website HTML 
    for (size_t i=0; i<website_HTML.length(); ++i) 
     website_HTML[i]= tolower(website_HTML[i],local); 

    //display HTML 
    cout <<website_HTML; 

    cout<<"\n\n"; 



    return 0; 
} 



//*************************** 
void get_Website(char *url) 
{ 
    WSADATA wsaData; 
    SOCKET Socket; 
    SOCKADDR_IN SockAddr; 


    int lineCount=0; 
    int rowCount=0; 

    struct hostent *host; 
    char *get_http= new char[256]; 

     memset(get_http,' ', sizeof(get_http)); 
     strcpy(get_http,"GET/HTTP/1.1\r\nHost: "); 
     strcat(get_http,url); 
     strcat(get_http,"\r\nConnection: close\r\n\r\n"); 

     if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) 
     { 
      cout << "WSAStartup failed.\n"; 
      system("pause"); 
      //return 1; 
     } 

     Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
     host = gethostbyname(url); 

     SockAddr.sin_port=htons(80); 
     SockAddr.sin_family=AF_INET; 
     SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr); 

     cout << "Connecting to "<< url<<" ...\n"; 

     if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0) 
     { 
      cout << "Could not connect"; 
      system("pause"); 
      //return 1; 
     } 

     cout << "Connected.\n";  
     send(Socket,get_http, strlen(get_http),0); 

     char buffer[10000]; 

     int nDataLength; 
      while ((nDataLength = recv(Socket,buffer,10000,0)) > 0) 
      {  
       int i = 0; 

       while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') 
       {      
        website_HTML+=buffer[i];      
        i += 1; 
       }    
      } 
     closesocket(Socket); 
     WSACleanup(); 

      delete[] get_http; 
} 
+2

Dies ist tatsächlich, was der Titel des Threads derzeit sagt, aber ich glaube aus den Kommentaren, dass die Frage tatsächlich ist "Wie öffne ich eine URL im Standardbrowser aus C++ - Code mit einer plattformunabhängigen Methode?" – drescherjm

0

Ich hatte viel mehr Glück mit ShellExecuteA(). Ich habe gehört, dass es viele Sicherheitsrisiken gibt, wenn Sie "system()" verwenden. Das habe ich mir für meinen eigenen Code ausgedacht.

void SearchWeb(string word) 
{  
    string base_URL = "http://www.bing.com/search?q="; 
    string search_URL = "dummy"; 
    search_URL = base_URL + word; 

    cout << "Searching for: \"" << word << "\"\n"; 

    ShellExecuteA(NULL, "open", search_URL.c_str(), NULL, NULL, SW_SHOWNORMAL); 
} 

p.s. Es verwendet WinAPI, wenn ich richtig bin. Also ist es keine Multiplattform-Lösung.

+0

Vielen Dank für das Annehmen des Anführungszeichenfehlers. Anscheinend wurde etwas entfernt, als ich meinen Code kopiert habe. – ahogen

-2

Erstellen Sie eine Funktion und kopieren Sie den Code mit Winsock, der bereits von Software_Developer erwähnt wird.

Zum Beispiel:

#ifdef _WIN32 

// this is required only for windows 

if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) 
{ 

    //... 

} 

#endif 

winsock Code hier

#ifdef _WIN32 

WSACleanup(); 

#endif 
0

Es sind Antworten bereits für Windows. In Linux, bemerkte ich open https://www.google.com immer Browser von Shell starten, so können Sie versuchen:

system("open https://your.domain/uri");

, die die

system(("open "s + url).c_str()); // c++

https://linux.die.net/man/2/open

Verwandte Themen