65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 WinInet 异步调用服务器脚本

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.77/5 (6投票s)

2007年8月24日

CPOL
viewsIcon

49874

使用 WinInet 异步调用服务器脚本。

引言

我想要找到一种简单的方法来在 Web 服务器上运行脚本(例如 Perl、PHP 等),但它需要是异步的,因为我不想让应用程序在等待 Web 服务器的响应时挂起。我不需要读取脚本的任何输出,所以我发现的所有解决方案对于我的需求来说都过于复杂。

理论

  1. 使用 INTERNET_FLAG_ASYNC 打开会话
  2. 使用 InternetSetStatusCallback 设置状态回调函数
  3. 使用 InternetOpenUrl 打开连接
  4. 当回调函数收到 INTERNET_STATUS_HANDLE_CREATED 时读取句柄
  5. 当调用完成并且回调函数收到 INTERNET_STATUS_REQUEST_COMPLETE 时释放所有内容

Using the Code

完整的代码是

HINTERNET    hInternetSession = NULL;   
HINTERNET    hURL = NULL;

typedef struct
{
    HWND        hWindow;     // window handle
    HINTERNET   hResource;   // HINTERNET handle created by InternetOpenUrl
} REQUEST_CONTEXT;

REQUEST_CONTEXT    request_context;

void __stdcall InternetCallbackFunction(HINTERNET hInternet,
                        DWORD dwContext,
                        DWORD dwInternetStatus,
                        LPVOID lpvStatusInformation,
                        DWORD dwStatusInformationLength)
{
    REQUEST_CONTEXT* cpContext;
    INTERNET_ASYNC_RESULT* res;

    cpContext = (REQUEST_CONTEXT*)dwContext;

    // what has this callback function been told has happened?
    switch (dwInternetStatus)
    {
        case INTERNET_STATUS_HANDLE_CREATED:
            // get the handle now that it has been created so it can be freed up later
            res = (INTERNET_ASYNC_RESULT*)lpvStatusInformation;
            hURL = (HINTERNET)(res->dwResult);

            break;

        case INTERNET_STATUS_REQUEST_COMPLETE:
            // script has been called so close handles now and 
	   // cancel the callback function
            InternetCloseHandle(hURL);
            InternetSetStatusCallback(hInternetSession, NULL);
            InternetCloseHandle(hInternetSession);

            // flag as having been completed now
            hURL = NULL;
            hInternetSession = NULL;

            break;
    }
}

void RunScript(char* szURL)
{
    // only run this script if finished all others
    if (hInternetSession == NULL)
    {
        hInternetSession = InternetOpen("Microsoft Internet Explorer",
                        INTERNET_OPEN_TYPE_PRECONFIG,
                        NULL,
                        NULL,
                        INTERNET_FLAG_ASYNC);
        
        if (hInternetSession != NULL)
        {
            // set the callback function
            InternetSetStatusCallback(hInternetSession,
                        (INTERNET_STATUS_CALLBACK)InternetCallbackFunction);

            // run the script
            hURL = InternetOpenUrl(hInternetSession,
                        szURL,
                        NULL,
                        0,
                        INTERNET_FLAG_RELOAD |
                        INTERNET_FLAG_PRAGMA_NOCACHE |
                        INTERNET_FLAG_NO_CACHE_WRITE,
                        (unsigned long)(&request_context));
        }
    }
}   

历史

  • 2007 年 8 月 24 日:初始发布
© . All rights reserved.