2008-09-30 3 views
9

Ok, das hat wahrscheinlich eine wirklich einfache Antwort, aber ich habe es noch nie zuvor versucht: Wie starte ich eine Webseite aus einer App heraus? Sie wissen, "klicken Sie hier, um zu unseren FAQ zu gelangen", und wenn sie dies tun, startet sie ihren Standard-Webbrowser und geht auf Ihre Seite. Ich arbeite in C/C++ in Windows, aber wenn es einen breiteren, portableren Weg gibt, würde ich das gerne auch wissen.Webseite von meiner Anwendung starten

Antwort

17
#include <windows.h> 

void main() 
{ 
    ShellExecute(NULL, "open", "http://yourwebpage.com", 
      NULL, NULL, SW_SHOWNORMAL); 
} 
+1

Funktioniert es ohne Administratorrechte? – foobar

4

Ich glaube, dass Sie die ShellExecute() Funktion verwenden möchten, die die Benutzerwahl des Standardbrowsers respektieren sollte.

3

Sie können die ShellExecute-Funktion verwenden. Beispielcode:

ShellExecute(NULL, "open", "http://stackoverflow.com", "", ".", SW_SHOWDEFAULT); 
4

Bitte lesen Sie die docs für ShellExecute eng. Um Ihren Code wirklich kugelsicher zu machen, empfehlen Sie, COM zu initialisieren. Sehen Sie sich die Dokumentation hier an und suchen Sie nach dem Teil, der besagt, dass "COM wie hier gezeigt initialisiert werden soll". Die kurze Antwort ist, dies zu tun (wenn Sie nicht bereits init'd COM):

CoInitializeEx (NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)

+0

Verdammt COM schlägt wieder .. – Everyone

4

Für die Aufzeichnung (da sie eine plattformübergreifende Option gefragt) folgendes funktioniert gut in Linux:

#include <unistd.h> 
#include <stdlib.h> 

void launch(const std::string &url) 
{ 
    std::string browser = getenv("BROWSER"); 
    if(browser == "") return; 

    char *args[3]; 
    args[0] = (char*)browser.c_str(); 
    args[1] = (char*)url.c_str(); 
    args[2] = 0; 

    pid_t pid = fork(); 
    if(!pid) 
    execvp(browser.c_str(), args); 
} 

Anwendung:

launch("http://example.com"); 
+2

Der BROWSER env ist nicht in Ubuntu eingestellt. Dieser Code stürzt ab, wenn getenv NULL zurückgibt: 'terminate wird aufgerufen, nachdem eine Instanz von 'std :: logic_error' geworfen wurde what(): basic_string :: _ S_construct null not valid '. –

1

Aus irgendeinem Grund ShellExecute nicht manchmal funktionieren, wenn die Anwendung über zu Anschl ist direkt nach dem Anruf gegessen. Wir haben Sleep (5000) nach ShellExecute hinzugefügt und es hilft.