2008-09-30 2 views
9

Хорошо, это, вероятно, имеет очень простой ответ, но я никогда не пытался это сделать раньше: как вы запускаете веб-страницу из приложения? Вы знаете, «нажмите здесь, чтобы перейти к нашим часто задаваемым вопросам», и когда они это сделают, он запускает свой веб-браузер по умолчанию и переходит на вашу страницу. Я работаю на C/C++ в Windows, но если есть более широкий, более портативный способ сделать это, я тоже хотел бы это знать.Запустить веб-страницу из моего приложения

ответ

17
#include <windows.h> 

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

Работает ли это без привилегий администратора? – foobar 2014-07-05 19:17:20

4

Я считаю, что вы хотите использовать функцию ShellExecute(), которая должна уважать выбор пользователей браузера по умолчанию.

3

Вы можете использовать функцию ShellExecute. Пример кода:

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

Пожалуйста, прочитайте docs для ShellExecute близко. Чтобы действительно бронировать ваш код, они рекомендуют инициализировать COM. См. Здесь документы и найдите часть, в которой говорится: «COM должен быть инициализирован, как показано здесь». Короткий ответ, чтобы сделать это (если вы еще не init'd COM):

CoInitializeEx (NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)

+0

Damn COM снова ударяет .. – Everyone 2017-03-28 03:02:38

4

Для записи (так как вы просили вариант кросс-платформенной) следующее хорошо работает в 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); 
} 

Использование в качестве:

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

BROWSER env не установлен в Ubuntu. Этот код выходит из строя, когда getenv возвращает NULL: `terminate call после вызова экземпляра 'std :: logic_error' what(): basic_string :: _ S_construct null not valid`. – 2014-08-01 11:10:45

1

по какой-то причине, ShellExecute не работают иногда, если приложение собирается Termin ел сразу после его вызова. Мы добавили Sleep (5000) после ShellExecute, и это помогает.