2013-06-27 25 views
7

làm cách nào để mở URL từ chương trình C++ của tôi?Mở URL từ mã C++

Trong ruby ​​bạn có thể làm

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

tương đương trong C++ là gì? Tôi tự hỏi nếu có một giải pháp nền tảng độc lập. Nhưng nếu không có, tôi muốn các Unix/Mac tốt hơn :)

Dưới đây là mã của tôi:

#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

Libraries như Qt cung cấp một nền tảng cách độc lập để làm cái này. Không có gì trong chính ngôn ngữ C++ để cung cấp điều đó. – drescherjm

+5

Tại sao tiêu đề của câu hỏi này hoàn toàn khác với chủ đề thực tế? –

+0

Xin lỗi, nó đã được sửa. Cảm ơn. – rodrigoalves

Trả lời

12

Sử dụng libcurl, đây là một đơn giản example.

EDIT: Nếu đây là về việc bắt đầu một trình duyệt web từ C++, bạn có thể gọi một lệnh shell với system trên một hệ thống POSIX:

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

Bằng cách thay thế <mybrowser> với trình duyệt bạn muốn khởi động.

+2

Bản cập nhật của bạn chính xác là những gì tôi muốn. Xem ứng dụng tại https://gist.github.com/rodrigoalvesvieira/662e400f34dd9de38176 – rodrigoalves

3

C không cao cấp như ngôn ngữ kịch bản bạn đề cập đến. Nhưng nếu bạn muốn tránh xa lập trình dựa trên socket, hãy thử Curl. Curl là một thư viện C tuyệt vời và có nhiều tính năng. Tôi đã sử dụng nó trong nhiều năm và luôn luôn khuyên bạn nên sử dụng nó. Nó cũng bao gồm một số chương trình độc lập để thử nghiệm hoặc sử dụng shell.

+1

@rodrigoalves Curl hiện có sẵn trên mọi hệ điều hành bao gồm nhiều hương vị của cả Windows và Linux. Thật đáng để dành thời gian để học nó. Nó có rất nhiều tính năng tuyệt vời. –

+0

Có. Tôi sử dụng thường xuyên từ thiết bị đầu cuối, chủ yếu là để kiểm tra kết quả đầu ra API và như vậy. Không bao giờ từ bên trong một chương trình C++, tho. – rodrigoalves

15

Câu hỏi của bạn có thể có nghĩa là hai điều khác nhau. 1) Mở trang web bằng trình duyệt.

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

Điều này sẽ hoạt động, nó sẽ mở tệp với chương trình được liên kết. Nên mở trình duyệt, thường là trình duyệt mặc định. 2) Nhận mã trang web và bạn sẽ tự mình làm hoặc làm một số việc khác. Đối với điều này tôi muốn đọc this hoặc/và this

Tôi hy vọng nó ít hữu ích nhất.

EDIT: Không thông báo, những gì bạn đang yêu cầu cho UNIX, điều này chỉ hoạt động trên Windows.

+0

chỉ dành cho Windows, phải không? Ý tôi là ShellExecute. Thanks anyway – rodrigoalves

+1

Đây là giải pháp chỉ dành cho cửa sổ để khởi chạy trình duyệt mặc định để mở URL. OP đã đề cập đến nền tảng độc lập. Qt sẽ cung cấp rằng mặc dù nó sẽ khá nặng chỉ cho nhiệm vụ này .. – drescherjm

+0

Chỉ để làm cho câu hỏi này thú vị hơn một chút: Nếu tôi muốn chạy một chương trình đầu cuối thông thường từ mã C/C++ của tôi. Là có một cách? Ví dụ, chạy cd – rodrigoalves

4

Đây là ví dụ trong mã cửa sổ sử dụng 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

Đây thực sự là tiêu đề của chủ đề hiện tại tuy nhiên tôi tin từ những nhận xét rằng câu hỏi thực sự là "Làm cách nào để mở url trong trình duyệt mặc định từ mã C++ bằng phương pháp độc lập nền tảng?" – drescherjm

0

Tôi đã có may mắn hơn MUCH khi sử dụng ShellExecuteA(). Tôi đã nghe nói rằng có rất nhiều rủi ro bảo mật khi bạn sử dụng "system()". Đây là những gì tôi đã đưa ra cho mã của riêng tôi.

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. Của nó bằng cách sử dụng WinAPI nếu tôi là chính xác. Vì vậy, giải pháp không đa nền tảng của nó.

+0

Cảm ơn bạn đã đánh dấu lỗi báo giá. Rõ ràng một cái gì đó đã được gỡ bỏ khi tôi sao chép mã của tôi hơn. – ahogen

-2

Tạo một hàm và sao chép mã bằng cách sử dụng winsock được Software_Developer đề cập.

ví dụ:

#ifdef _WIN32 

// this is required only for windows 

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

    //... 

} 

#endif 

winsock mã ở đây

#ifdef _WIN32 

WSACleanup(); 

#endif 
0

Như vậy là đã trả lời cho các cửa sổ. Trong Linux, tôi nhận thấy open https://www.google.com luôn khởi động trình duyệt từ vỏ, vì vậy bạn có thể thử:

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

mà nói

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

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