Windows XP Tablet 版Visual C++ 7.1Visual C++ 8.0Visual Studio 6Windows VistaVisual C++ 7.0Windows 2003Windows 2000Visual C++ 6.0Windows XPC中级开发Visual StudioWindowsC++
使用 WinInet 异步调用服务器脚本






4.77/5 (6投票s)
使用 WinInet 异步调用服务器脚本。
引言
我想要找到一种简单的方法来在 Web 服务器上运行脚本(例如 Perl、PHP 等),但它需要是异步的,因为我不想让应用程序在等待 Web 服务器的响应时挂起。我不需要读取脚本的任何输出,所以我发现的所有解决方案对于我的需求来说都过于复杂。
理论
- 使用
INTERNET_FLAG_ASYNC
打开会话 - 使用
InternetSetStatusCallback
设置状态回调函数 - 使用
InternetOpenUrl
打开连接 - 当回调函数收到
INTERNET_STATUS_HANDLE_CREATED
时读取句柄 - 当调用完成并且回调函数收到
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 日:初始发布