2009年4月24日星期五

在VC中WININET如何使用HTTP的POSTA和GET方法

在VC中WININET如何使用HTTP的POSTA和GET方法 2009-02-13 16:35
分类:默认分类
字号: 大大 中中 小小

Post资料:

SUMMARY

To properly simulate a Form submission using WinInet, you need to send a header that indicates the proper Content-Type. For Forms, the proper Content-Type header is: Content-Type: application/x-www-form-urlencoded



MORE INFORMATION

In many cases, the server does not respond appropriately if a Content-Type is not specified. For example, the Active Server Pages component of IIS 3.0 actually checks this header specifically for 'application/x-www-form- urlencoded' before adding form variables to the "Request.Form" object. This MIME/Content-Type indicates that the data of the request is a list of URL- encoded form variables. URL-encoding means that space character (ASCII 32) is encoded as ' ', special character such '!' encoded in hexadecemal form as '!'.

Here is a snippet of code that uses the MFC WinInet classes to simulate a Form POST request:

CString strHeaders = _T("Content-Type: application/x-www-form-urlencoded");

// URL-encoded form variables -

// name = "John Doe", userid = "hithere", other = "P&Q"

CString strFormData = _T("name=John Doe&userid=hithere&other=P&Q");

CInternetSession session;

CHttpConnection* pConnection = session.GetHttpConnection(_T("ServerNameHere"));

CHttpFile* pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,_T("FormActionHere"));

BOOL result = pFile->SendRequest(strHeaders,(LPVOID)(LPCTSTR)strFormData, strFormData.GetLength());

Without MFC, the same code translates to straight SDK calls as follows:

static

TCHAR hdrs[] = _T("Content-Type: application/x-www-form-urlencoded");

static

TCHAR frmdata[] = _T("name=John Doe&userid=hithere&other=P&Q");

statuc TCHAR accept[] = _T("Accept: */*");



// for clarity, error-checking has been removed

HINTERNET hSession = InternetOpen("MyAgent",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

HINTERNET hConnect = InternetConnect(hSession, _T("ServerNameHere"),

INTERNET_DEFAULT_HTTP_PORT,

NULL,

NULL,

INTERNET_SERVICE_HTTP,

0,

1);

HINTERNET hRequest = HttpOpenRequest(hConnect,

"POST",

_T("FormActionHere"),

NULL,

NULL,

accept,

0,

1);

HttpSendRequest(hRequest,

hdrs,

strlen(hdrs),

frmdata,

strlen(frmdata));

// close any valid internet-handles

我这里有一段程序,用来在一个对话框里显示出一次http request的原始信息,不过使用Inet API做的,希望能有帮助。

void CHTTPRequestDlg::OnButtonRequest()

{

UpdateData(TRUE);

HINTERNET hInternet = InternetOpen("Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.0)",

INTERNET_OPEN_TYPE_DIRECT,

NULL,

NULL,

NULL);

HINTERNET hSession = InternetConnect(hInternet,

m_strHost,

m_nPort,

"username",

"password",

INTERNET_SERVICE_HTTP,

0,

0);

char* szAccept[] = {"*/*",NULL};

CString strVerb;

m_comboVerb.GetWindowText(strVerb);

HINTERNET hRequest = HttpOpenRequest(hSession,

strVerb,

m_strObject,

NULL,

NULL,

(LPCSTR*)szAccept,

0,

0);

struct

{

char* Language;

char* Encoding;

char* ContentType;

}Headers = {"Accept-Language:zh-cn\r\n",

"Accept-Encoding:gzip,deflate\r\n",

"Content-Type:application/x-www-form-urlencoded\r\n"};



if(m_bLanguage)

{

HttpAddRequestHeaders(hRequest,

Headers.Language,

-1,

HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);

}

if(m_bEncoding)

{

HttpAddRequestHeaders(hRequest,

Headers.Encoding,

-1,

HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);

}

if(m_bContentType)

{

HttpAddRequestHeaders(hRequest,

Headers.ContentType,

-1,

HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);

}

LPCSTR lpAddHeader = NULL;

LPCSTR lpContent = NULL;

if(m_strHeaders.GetLength())

{

if(m_strHeaders.Right(2) != "\r\n")

{

m_strHeaders+="\r\n";

}

lpAddHeader = (LPCSTR)m_strHeaders;

}

if(m_strContent.GetLength() && (strVerb == "POST" || strVerb == "PUT"))

{

lpContent = (LPCSTR)m_strContent;

}

HttpSendRequest(hRequest,

lpAddHeader,

-1,

(LPVOID)lpContent,

m_strContent.GetLength());



m_editContentGot.SetSel(0,-1);

m_editContentGot.ReplaceSel("");



LPSTR lpszData; //buffer for the data

DWORD dwSize; //size of the data available

DWORD dwDownloaded; //size of the downloaded data



//Set the cursor to an hourglass.

SetCursor(LoadCursor(NULL,IDC_WAIT));



// This loop handles reading the data.

while(1)

{

// The call to InternetQueryDataAvailable determines the amount of

// data available to download.

if (!InternetQueryDataAvailable(hRequest,&dwSize,0,0))

{

SetCursor(LoadCursor(NULL,IDC_ARROW));

break;

}

else

{

// Allocates a buffer of the size returned by InternetQueryDataAvailable

lpszData = new char[dwSize+1];



// Reads the data from the HINTERNET handle.

if(!InternetReadFile(hRequest,(LPVOID)lpszData,dwSize,&dwDownloaded))

{

delete[] lpszData;

break;

}

else

{

// Adds a null terminator to the end of the data buffer

lpszData[dwDownloaded]='\0';



int nLen = m_editContentGot.GetWindowTextLength();

m_editContentGot.SetSel(nLen-1, nLen-1);

m_editContentGot.ReplaceSel(lpszData);



// Delete the two buffers

delete[] lpszData;



// Check the size of the remaining data. If it is zero, break.

if (dwDownloaded == 0)

{

break;

}

}

}

}



// Close the HINTERNET handle

InternetCloseHandle(hRequest);

InternetCloseHandle(hSession);

InternetCloseHandle(hInternet);



// Set the cursor back to an arrow

SetCursor(LoadCursor(NULL,IDC_ARROW));

}

==========================================

关文件:#include

使用MFC示例如下:

首先设置m_strRequest请求字符串 eg."name=aaa&pass=bbb";

m_strServerName 服务器名称或者IP eg."www.yahoo.com"

m_strObjectName 请求文件位置 eg. "pub/aaa.asp"

请求的结果存放在m_strHtml中

void func()

{

CInternetSession m_InetSession("session");

CHttpConnection *pServer = NULL;

CHttpFile* pFile = NULL;

try

{

INTERNET_PORT nPort;

nPort=80;

pServer = m_InetSession.GetHttpConnection(m_strServerName, nPort);

pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,m_strObjectName);

char szHeaders[100];

strcpy(szHeaders,"Accept: text*/*\r\nContent-Type: application/x-www-form-urlencoded");

pFile->AddRequestHeaders(szHeaders);



pFile->SendRequestEx(m_strRequest.GetLength());

pFile->WriteString(m_strRequest);//重要-->m_Request 中有"name=aaa&name2=BBB&"

pFile->EndRequest();

DWORD dwRet;

pFile->QueryInfoStatusCode(dwRet);

CString str;



//m_Mutex.Lock();

m_strHtml="";

char szBuff[1024];

if (dwRet == HTTP_STATUS_OK)

{

UINT nRead;

while ((nRead = pFile->Read(szBuff,1023))>0)

{

m_strHtml += CString(szBuff,nRead);

}

}

//m_Mutex.Unlock();



delete pFile;

delete pServer;

}

catch (CInternetException* e)

{

CString s;

s.Format("Internet Exception\r\nm_dwError%u,m_dwContextError%u",e->m_dwError,e->m_dwContext);

AfxMessageBox(s);

//catch errors from WinInet

}

}

============================

1、获得WebBrowser Control的DWebBrowserEvents2::DocumentComplete事件

2、在DWebBrowserEvents2::DocumentComplete事件中根据IWebBrowser2::Document获得IHTMLDocument2

3、IHTMLDocument2::forms得到IHTMLElementCollection

4、在IHTMLElementCollection中根据name、tagName、ID得到指定的IHTMLElement

5、从IHTMLElement得到IHTMLFormElement

6、执行IHTMLFormElement::submit

==================================================

要正确模拟表单提交使用 WinInet, 您需要发送一个指示正确 Content-Type 标头。 对于窗体, 正确 Content-Type 标题是:

Content-Type: application/x-www-form-urlencoded

如果没有指定 Content-Type 在许多情况下, 服务器不响应正确。 在之前将表单变量添加到 " Request.Form "

对象例如, IIS 3.0 的 ActiveServerPages 组件实际上检查专门用于应用表单 ' www 程序 / x -

urlencoded ' 此标题。 此 MIME / 内容类型指示请求数据是 - URL 编码窗体变量的列表。 URL 编码意味着空格字符

(ASCII 32) 被编码为 + ' ', 特殊字符如 ' ! ' 以十六进制形式编码为 21 % '。

下面是使用 MFCWinInet 类来模拟 FormPOST 请求的代码段:

CString strHeaders =

_T("Content-Type: application/x-www-form-urlencoded");

// URL-encoded form variables -

// name = "John Doe", userid = "hithere", other = "P&Q"

CString strFormData = _T("name=John+Doe&userid=hithere&other=P%26Q");

CInternetSession session;

CHttpConnection* pConnection =

session.GetHttpConnection(_T("ServerNameHere"));

CHttpFile* pFile =

pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,

_T("FormActionHere"));

BOOL result = pFile->SendRequest(strHeaders,

(LPVOID)(LPCTSTR)strFormData, strFormData.GetLength());



没有 MFC, 相同的代码将转换为直 SDK 调用如下:

static TCHAR hdrs[] =

_T("Content-Type: application/x-www-form-urlencoded");

static TCHAR frmdata[] =

_T("name=John+Doe&userid=hithere&other=P%26Q");

static LPSTR accept[2]={"*/*", NULL};

// for clarity, error-checking has been removed

HINTERNET hSession = InternetOpen("MyAgent",

INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

HINTERNET hConnect = InternetConnect(hSession, _T("ServerNameHere"),

INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);

HINTERNET hRequest = HttpOpenRequest(hConnect, "POST",

_T("FormActionHere"), NULL, NULL, accept, 0, 1);

HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));

// close any valid internet-handles

===================================================



Get资料:

#include "winsock2.h"

#include "stdio.h"

#include "Wininet.h"

#pragma comment (lib,"Wininet.lib")

void main()

{

HINTERNET hNet = ::InternetOpen("Google page", //当HTTP协议使用时,这个参数随意赋值

PRE_CONFIG_INTERNET_ACCESS, //访问类型指示Win32网络函数使用登记信息去发现一个服务器。

NULL,

INTERNET_INVALID_PORT_NUMBER, //使用INTERNET_INVALID_PORT_NUMBER相当于提供却省的端口数。

0 //标志去指示使用返回句句柄的将来的Internet函数将"不"为回调函数发送状态信息

) ;

HINTERNET hUrlFile = ::InternetOpenUrl(hNet, //从InternetOpen返回的句柄

"http://www.google.com", //需要打开的URL

NULL, //用来向服务器传送额外的信息,一般为NULL

0, //用来向服务器传送额外的信息,一般为 0

INTERNET_FLAG_RELOAD, //InternetOpenUrl行为的标志

0) ; //信息将不会被送到状态回调函数

char buffer[1024] ;

DWORD dwBytesRead = 0;

BOOL bRead = ::InternetReadFile(hUrlFile, //InternetOpenUrl返回的句柄

buffer, //保留数据的缓冲区

sizeof(buffer),

&dwBytesRead); //指向包含读入缓冲区字节数的变量的指针;

//如果返回值是TRUE,而且这里指向0,则文件已经读到了文件的末尾。

::InternetCloseHandle(hUrlFile) ;

::InternetCloseHandle(hNet) ;

printf("%s", buffer);

}

WinInet API 的异步方式使用

作者邮箱:zhtrue@sina.com

异步方式并不是什么高深莫测的事物,WinInet API 更是大家耳熟能详。

如果你仔细看过 MSDN 和 internet 上关于 WinInet API 的文章,你会发现尽管在很多篇章中提到了异步方式的使用,但是大部分说明都只说可以使用,而没有说如何使用。尽管如此,还是有一些文章可以给我们很多的提示,我会在后面列出。

由于网络数据传输经常会消耗一定的时间,因此我们总是把这些可能消耗时间的操作放到一个单独的子线程,以免影响主线程正常的进行。可是当子线程发生 长时间阻塞的时候,主线程由于某种原因需要退出,我们通常希望子线程能在主线程退出前正常退出。这时主线程就不得不 wait 子线程,这样就导致主线程也被阻塞了。当然,主线程可以不 wait 子线程而自行退出,还可以使用 TerminateThread 强行终止子线程,但是这样的后果通常是不可预料的,内存泄漏或许是最轻的一种危害了。

使用异步方式是解决这类问题的正确手段,下面我们根据一个实例来分析一下 WinInet API 异步方式的使用方法和注意事项。

我们的例子完成这样的功能:给定一个 URL (如:http://www.sina.com.cn/), 使用 HTTP 协议下载该网页或文件。我们一共创建了三个线程:主线程负责创建下载子线程,并等待子线程返回消息;子线程则使用异步方式的 WinInet API 完成下载任务,并在各个阶段返回消息给主线程;子线程还会创建一个回调函数线程,其作用我们稍后解释。

实例代码中涉及到一些线程,消息,事件,错误处理的 API,由于不是我讨论的内容,就不仔细说明了。

1. 主线程工作流程
a. 创建下载子线程
m_hMainThread = ::CreateThread(NULL,
0,
AsyncMainThread,
this,
NULL,
&m_dwMainThreadID);

b. 等待子线程返回消息
MSG msg;
while (1)
{
::GetMessage(&msg, m_hWnd, 0, 0);

if (msg.message == WM_ASYNCGETHTTPFILE)
{ //子线程发回消息
switch(LOWORD(msg.wParam))
{
case AGHF_FAIL:
{
MessageBox(_T("下载行动失败结束!"));
return;
}
case AGHF_SUCCESS:
MessageBox(_T("下载行动成功结束!"));
return;
case AGHF_PROCESS:
//下载进度通知
break;
case AGHF_LENGTH:
//获取下载文件尺寸通知
break;
}
}

DispatchMessage(&msg);
}

2. 下载子线程工作流程
a. 使用标记 INTERNET_FLAG_ASYNC 初始化 InternetOpen
m_hInternet = ::InternetOpen(m_szAgent,
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
INTERNET_FLAG_ASYNC);
起步并不费劲,也不难理解,MSDN 上说这样设置之后,以后所有的 API 调用都是异步的了。
警惕......
看起来好像很简单,但是会有无数的陷阱等着我们掉进去。

b. 设置状态回调函数 InternetSetStatusCallback
::InternetSetStatusCallback(m_hInternet, AsyncInternetCallback);
第一个陷阱就在这里等着你呢,文献[2]中提到使用一个单独的线程来进行这项设置,并解释说如果不这样会有潜在的影响,而在其他文档中却没有这样使用的例子。尽管看起来多余,并且增加了一些复杂度,我们还是先把这种方法写出来再讨论。子线程需要创建一个回调函数线程:
//重置回调函数设置成功事件
::ResetEvent(m_hEvent[0]);
m_hCallbackThread = ::CreateThread(NULL,
0,
AsyncCallbackThread,
this,
NULL,
&m_dwCallbackThreadID);
//等待回调函数设置成功事件
::WaitForSingleObject(m_hEvent[0], INFINITE);
回调函数线程的实现如下:
DWORD WINAPI CAsyncGetHttpFile::AsyncCallbackThread(LPVOID lpParameter)
{
CAsyncGetHttpFile * pObj = (CAsyncGetHttpFile*)lpParameter;

::InternetSetStatusCallback(pObj->m_hInternet, AsyncInternetCallback);

//通知子线程回调函数设置成功,子线程可以继续工作
::SetEvent(pObj->m_hEvent[0]);

//等待用户终止事件或者子线程结束事件
//子线程结束前需要设置子线程结束事件,并等待回调线程结束
::WaitForSingleObject(pObj->m_hEvent[2], INFINITE);
return 0;
}
确实复杂了很多吧,虽然我试验的结果发现两种设置方法都能正确工作,但是确实发现了这两种设置方法产生的一些不同效果,遗憾的是我没有弄清具体的原因。我推荐大家使用后一种方法。

c. 打断一下子线程的流程,由于回调函数和上一部分的关系如此密切,我们来看看它的实现
void CALLBACK CAsyncGetHttpFile::AsyncInternetCallback(
HINTERNET hInternet,
DWORD dwContext,
DWORD dwInternetStatus,
LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength)
{
CAsyncGetHttpFile * pObj = (CAsyncGetHttpFile*)dwContext;
//在我们的应用中,我们只关心下面三个状态
switch(dwInternetStatus)
{
//句柄被创建
case INTERNET_STATUS_HANDLE_CREATED:
pObj->m_hFile = (HINTERNET)(((LPINTERNET_ASYNC_RESULT)
(lpvStatusInformation))->dwResult);
break;
//句柄被关闭
case INTERNET_STATUS_HANDLE_CLOSING:
::SetEvent(pObj->m_hEvent[1]);
break;
//一个请求完成,比如一次句柄创建的请求,或者一次读数据的请求
case INTERNET_STATUS_REQUEST_COMPLETE:
if (ERROR_SUCCESS == ((LPINTERNET_ASYNC_RESULT)
(lpvStatusInformation))->dwError)
{ //设置句柄被创建事件或者读数据成功完成事件
::SetEvent(pObj->m_hEvent[0]);
}
else
{ //如果发生错误,则设置子线程退出事件
//这里也是一个陷阱,经常会忽视处理这个错误,
::SetEvent(pObj->m_hEvent[2]);
}
break;
}
}

d. 继续子线程的流程,使用 InternetOpenUrl 完成连接并获取下载文件头信息
//重置句柄被创建事件
::ResetEvent(m_hEvent[0]);
m_hFile = ::InternetOpenUrl(m_hInternet,
m_szUrl,
NULL,
NULL,
INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_RELOAD,
(DWORD)this);
if (NULL == m_hFile)
{
if (ERROR_IO_PENDING == ::GetLastError())
{
if (WaitExitEvent())
{
return FALSE;
}
}
else
{
return FALSE;
}
}
等我们把 WaitExitEvent 函数的实现列出在来再解释发生的一切:
BOOL CAsyncGetHttpFile::WaitExitEvent()
{
DWORD dwRet = ::WaitForMultipleObjects(3, m_hEvent, FALSE, INFINITE);
switch (dwRet)
{
//句柄被创建事件或者读数据请求成功完成事件
case WAIT_OBJECT_0:
//句柄被关闭事件
case WAIT_OBJECT_0+1:
//用户要求终止子线程事件或者发生错误事件
case WAIT_OBJECT_0+2:
break;
}
return WAIT_OBJECT_0 != dwRet;
}
在 这里我们终于看到异步方式的巨大优势了,InternetOpenUrl 函数要完成域名解析,服务器连接,发送请求,接收返回头信息等任务,异步方式中 InternetOpenUrl 并不等待成功创建了 m_hFile 才返回,我们看到 m_hFile 是可以在回调函数中赋值的。如果 InternetOpenUrl 的返回值为 NULL 并且 GetLastError 返回 ERROR_IO_PENDING,我们使用 WaitForMultipleObjects 来等待请求的成功完成,这样主线程就有机会在这个等待过程中终止子线程的操作。我真是迫不及待的想把主线程如何强行终止子线程的代码列出来了:
//设置要求子线程结束事件
::SetEvent(m_hEvent[2]);
//等待子线程安全退出
::WaitForSingleObject(m_hMainThread, INFINITE);
//关闭线程句柄
::CloseHandle(m_hMainThread);
哈哈,不需要使用 TerminateThread 终止线程,一切都是安全的,可预料的。
我 们再考虑一种情况,这种情况好得超乎你的想象,InternetOpenUrl 返回了一个非空的 m_hFile 怎么办?呵呵,这说明 InternetOpenUrl 已经成功创建了一个 m_hFile,并且没有发生任何阻塞,都不用等待任何事件,直接继续下一步吧。
最后需要说明得是,InternetOpenUrl 的最后一个参数会被作为回调函数的第二个参数使用。并且哪怕在回调函数中不需要这个参数,这个值你也不能设置为 0,否则 InternetOpenUrl 将不会按照异步的方式工作。
到这里,我们已经将 WinInet API 的异步方式使用的关键部分都展示了,你应该可以使用 WinInet API 的异步方式写出你自己的应用了。不过还是让我们继续完成这个实例的其他部分。

e. 使用 HttpQueryInfo 分析头信息
DWORD dwStatusSize = sizeof(m_dwStatusCode);
if (FALSE == ::HttpQueryInfo(m_hFile,
HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
&m_dwStatusCode,
&dwStatusSize,
NULL)) //获取返回状态码
{
return FALSE;
}
//判断状态码是不是 200
if (HTTP_STATUS_OK != m_dwStatusCode)
{
return FALSE;
}
DWORD dwLengthSize = sizeof(m_dwContentLength);
if (FALSE == ::HttpQueryInfo(m_hFile,
HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
&m_dwContentLength,
&dwLengthSize,
NULL)) //获取返回的Content-Length
{
return FALSE;
}
...//通知主线程获取文件大小成功
需要说明的是 HttpQueryInfo 并不进行网络操作,因此它不需要进行异步操作的处理。

f. 使用标记 IRF_ASYNC 读数据 InternetReadFileEx
//为了向主线程报告进度,我们设置每次读数据最多 1024 字节
for (DWORD i=0; i {
INTERNET_BUFFERS i_buf = {0};
i_buf.dwStructSize = sizeof(INTERNET_BUFFERS);
i_buf.lpvBuffer = new TCHAR[1024];
i_buf.dwBufferLength = 1024;

//重置读数据事件
::ResetEvent(m_hEvent[0]);
if (FALSE == ::InternetReadFileEx(m_hFile,
&i_buf,
IRF_ASYNC,
(DWORD)this))
{
if (ERROR_IO_PENDING == ::GetLastError())
{
if (WaitExitEvent())
{
delete[] i_buf.lpvBuffer;
return FALSE;
}
}
else
{
delete[] i_buf.lpvBuffer;
return FALSE;
}
}
else
{
//在网络传输速度快,步长较小的情况下,
//InternetReadFileEx 经常会直接返回成功,
//因此要判断是否发生了用户要求终止子线程事件。
if (WAIT_OBJECT_0 == ::WaitForSingleObject(m_hEvent[2], 0))
{
::ResetEvent(m_hEvent[2]);
delete[] i_buf.lpvBuffer;
return FALSE;
}
}
i += i_buf.dwBufferLength;
...//保存数据
...//通知主线程下载进度
delete[] i_buf.lpvBuffer;
}
这里 InternetReadFileEx 的异步处理方式同 InternetOpenUrl 的处理方式类似,我没有使用 InternetReadFile 因为它没有异步的工作方式。

g. 最后清理战场,一切都该结束了
//关闭 m_hFile
::InternetCloseHandle(m_hFile);
//等待句柄被关闭事件或者要求子线程退出事件
while (!WaitExitEvent())
{
::ResetEvent(m_hEvent[0]);
}
//设置子线程退出事件,通知回调线程退出
::SetEvent(m_hEvent[2]);
//等待回调线程安全退出
::WaitForSingleObject(m_hCallbackThread, INFINITE);
::CloseHandle(m_hCallbackThread);
//注销回调函数
::InternetSetStatusCallback(m_hInternet, NULL);
::InternetCloseHandle(m_hInternet);
...//通知主线程子线程成功或者失败退出


实例中,我们建立一个完整的 HTTP 下载程序,并且可以在主线程中对下载过程进行完全的监控。我们使用了 WinInet API 中的这些函数:
InternetOpen
InternetSetStatusCallback
InternetOpenUrl
HttpQueryInfo
InternetReadFileEx
InternetCloseHandle
其中 InternetOpenUrl 和 InternetReadFileEx 函数是按照异步方式工作的,文献[4]中列出了可以按照异步方式工作的 API:
FtpCreateDirectory
FtpDeleteFile
FtpFindFirstFile
FtpGetCurrentDirectory
FtpGetFile
FtpOpenFile
FtpPutFile
FtpRemoveDirectory
FtpRenameFile
FtpSetCurrentDirectory
GopherFindFirstFile
GopherOpenFile
HttpEndRequest
HttpOpenRequest
HttpSendRequestEx
InternetConnect
InternetOpenUrl
InternetReadFileEx


参考文献:
1. http://www.codeproject.com/internet/asyncwininet.asp
2. MSDN:
3. MSDN:
4. MSDN:

查询的结果网页

问题描述如下:
我想从www.dymeteo.com上取得查询的结果网页,步骤如下:登陆主页后->点击最新
天气实状链接后->在弹出的网页的中输入我想查询的城市,点查询出现查询结果.。现在
我想使用程序指定城市自动抓取该网页,那么我该如何发送何种命令才能取得这个结果,
也就是说我发这个命令串与我在该主页上输入城市点查询的功能是一样的????,
有没有什么工具可以在本地查看我在执行这个动作后其发出的结果串????

先HttpOpenRequest得到hRequest,open参数指定"POST"

然后HttpAddRequestHeaders加入"Content-Type: application/x-www-form-urlencoded\r\n"

然后HttpSendRequest指定lpPostData诸如"lname=Doe&fname=John"

然后InternetReadFile循环

最后CloseHandle

2009年4月20日星期一

wxwidgets的消息处理机制

wxwidgets的消息处理机制比较灵活,效率也比较高,这里只研究一下最基本的东西。

自定义一个消息以前的用法是
BEGIN_DECLARE_EVENT_TYPES()
DECLARE_EVENT_TYPE(, )
END_DECLARE_EVENT_TYPES()
现在的用法是
DEFINE_EVENT_TYPE()

消息处理也很容易理解
BEGIN_EVENT_TABLE(窗口类,基类)
EVT_BUTTON(窗口标识,处理函数)
........
END_EVENT_TABLE()
如果是自定义消息就要看处理函数的类型是怎样的。
如果处理函数是wxEventHandler类型直接使用EVT_CUSTOM来处理,如果处理函数类型是wxCommandEventHandler,就要使用EVT_CUSTOM来处理。

下面的例子在http://blog.csdn.net/kese/archive/2007/09/08/1776985.aspx例子 的基础上改造出来的

wxButtonStudio.cpp



#include <wx/wx_gch.h>

class wxButtonStudio : public wxApp
{
public:
bool OnInit();
};

class wxButtonFrame : public wxFrame
{
public:
wxButtonFrame(wxWindow* parent,const wxWindowID id,const wxString& title);
~wxButtonFrame();
wxChoice* choice;
wxButton* button;
wxButton* button2;


void OnButtonClick(wxCommandEvent& event);
void OnButton2Click(wxCommandEvent& event);
private:
DECLARE_EVENT_TABLE()
};

DEFINE_EVENT_TYPE(wxEVT_CUSTOM1)

IMPLEMENT_APP(wxButtonStudio)

enum
{
ID_BUTTON1,
ID_BUTTON2,
ID_CHOICE1
};

BEGIN_EVENT_TABLE(wxButtonFrame,wxFrame)
EVT_BUTTON(ID_BUTTON1,wxButtonFrame::OnButtonClick)
EVT_BUTTON(ID_BUTTON2,wxButtonFrame::OnButton2Click)
EVT_COMMAND(ID_BUTTON1,wxEVT_CUSTOM1,wxButtonFrame::OnButtonClick)
END_EVENT_TABLE()

bool wxButtonStudio::OnInit()
{
wxButtonFrame* frame = new wxButtonFrame((wxWindow*)NULL,wxID_ANY,_T("ButtonFrame"));
frame->Show(true);
return true;
}

wxButtonFrame::wxButtonFrame(wxWindow* parent,const wxWindowID id,const wxString& title)
: wxFrame(parent,id,title,wxDefaultPosition,wxDefaultSize,wxDEFAULT_FRAME_STYLE)
{
choice = new wxChoice(this,ID_CHOICE1);
choice->Append(_T("A"));
choice->Append(_T("B"));
choice->Append(_T("C"));
choice->Append(_T("D"));
choice->Append(_T("E"));
choice->Append(_T("F"));
choice->Append(_T("G"));
button = new wxButton(this,ID_BUTTON1,_T("A Button"),wxPoint(200,0),wxSize(100,30));
button2 = new wxButton(this,ID_BUTTON1,_T("B Button"),wxPoint(200,60),wxSize(100,30));
}

wxButtonFrame::~wxButtonFrame()
{
}

void wxButtonFrame::OnButtonClick(wxCommandEvent& event)
{
if (choice->GetCurrentSelection() < (int)choice->GetCount() - 1)
choice->Select(choice->GetCurrentSelection() + 1);
else
choice->Select(-1);
}

void wxButtonFrame::OnButton2Click(wxCommandEvent& event)
{
::SendMessageA((HWND)button->GetHWND(),wxEVT_CUSTOM1,0,0);
}

2009年4月19日星期日

如何使用gcc编译器?

 
如何使用gcc编译器?
 
如何使用gcc编译器?2007-05-18 16:08
GCC rules
你 能想象使用封闭源代码的私有编译器编译自由软件吗?你怎么知道编译器在你的 可执行文件中加入了什么?可能会加入各种后门和木马。Ken Thompson是一个著名 的黑客,他编写了一个编译器,当编译器编译自己时,就在'login'程序中留下后门 和永久的木马。请到 这里 阅读他对 这个杰作的描述。幸运的是,我们有了gcc。当你进行 configure; make; make install 时, gcc在幕后做了很多繁重的工作。如何才能让gcc为我们工作呢?我们将开始编写一个纸牌游戏, 不过我们只是为了演示编译器的功能,所以尽可能地精简了代码。 我们将从头开始一步一步地做,以便理解编译过程,了解为了制作可执行文件需要 做些什么,按什么顺序做。我们将看看如何编译C程序,以及如何使用编译选项 让gcc按照我们的要求工作。步骤(以及所用工具)如下: 预编译 (gcc -E), 编译 (gcc), 汇编 (as),和 连接 (ld)。
开始...
首先,我们应该知道如何调用编译器。实际上,这很简单。我们将从那个著名的第一个C程序开始。 (各位老前辈,请原谅我)。

[pre]#include <stdio.h>

int main()


{
printf("Hello World!n");
}
[/pre]把这个文件保存为 game.c。 你可以在命令行下编译它:
[pre]gcc game.c
[/pre]在默认情况下,C编译器将生成一个名为 a.out 的可执行文件。 你可以键入如下命令运行它: [pre]./a.out

Hello World

[/pre]每一次编译程序时,新的 a.out 将覆盖原来的程序。你无法知道是哪个 程序创建了 a.out。我们可以通过使用 -o 编译选项,告诉 gcc我们想把可执行文件叫什么名字。我们将把这个程序叫做 game,我们 可以使用任何名字,因为C没有Java那样的命名限制。 [pre]gcc -o game game.c
game

Hello World

[/pre] 到现在为止,我们离一个有用的程序还差得很远。如果你觉得沮丧,你可以想一想我们 已经编译并运行了一个程序。因为我们将一点一点为这个程序添加功能,所以我们必须 保证让它能够运行。似乎每个刚开始学编程的程序员都想一下子编一个1000行的程序, 然后一次修改所有的错误。没有人,我是说没有人,能做到这个。你应该先编一个可以 运行的小程序,修改它,然后再次让它运行。这可以限制你一次修改的错误数量。另外, 你知道刚才做了哪些修改使程序无法运行,因此你知道应该把注意力放在哪里。这可以 防止这样的情况出现:你认为你编写的东西应该能够工作,它也能通过编译,但它就是 不能运行。请切记,能够通过编译的程序并不意味着它是正确的。
下一步为我们的游戏编写一个头文件。头文件把数据类型和函数声明集中到了一处。 这可以保证数据结构定义的一致性,以便程序的每一部分都能以同样的方式看待一切事情。
[pre]#ifndef DECK_H
#define DECK_H

#define DECKSIZE 52

typedef struct deck_t
{
int card[DECKSIZE];
/* number of cards used */
int dealt;
}deck_t;

wxWidgets类列表(一)

 
wxWidgets类列表(一)
 
管理窗口

这里有若干直接由窗口管理器(例如:MS WindowsMotif Window Manager)操纵的窗口类型。在wxWidgets中,framesdialogs是相似的,但是只有dialogs可能是模式的。
wxTopLevelWindow
       
任意的顶层窗口,dialogframe
       
wxDialog
       
对话框
       
wxFrame
       
通用的frame
       
wxMDIChildFrame
       
MDI(多文档界面)child frame
       
wxMDIParentFrame
       
MDI parent frame
       
wxMiniFrame
       
带有瘦标题栏的frame
       
wxSplashScreen
       
飞溅屏幕类
       
wxPropertySheetDialog
       
属性表对话框
       
wxTipWindow
       
在一个小窗口中显示文本
       
wxWizard
       
向导对话框
       
参见 公共对话框


其它窗口

这里有由wxWindow派生的各种类。
wxPanel
       
跟随当前用户设置而改变颜色的窗口
       
wxScrolledWindow
       
自动管理滚动条的窗口
       
wxGrid
       
表格窗口
       
wxSplitterWindow
       
可以被拆分为水平或垂直的窗口
       
wxStatusBar
       
frame上实现状态栏
       
wxToolBar
       
工具栏类
       
wxNotebook
       
笔记本类
       
wxListbook
       
类似于笔记本,但使用列表控件
       
wxChoicebook
       
类似于笔记本,但使用选择控件
       
wxSashWindow
       
包含四个可拖拽框格的窗口
       
wxSashLayoutWindow
       

       
wxVScrolledWindow
       
wxScrolledWindow一样,但支持可变高度的行
       
wxWizardPage
       
向导对话框中页面的基类
       
wxWizardPageSimple
       
向导对话框中的页面
       


公共对话框

公共对话框是在应用程序中被频繁使用的现成的对话框类。
wxDialog
       
公共对话框的基类
       
wxColourDialog
       
颜色选择对话框
       
wxDirDialog
       
目录选择对话框
       
wxFileDialog
       
文件选择对话框
       
wxFindReplaceDialog
       
文本搜索/替换对话框
       
wxMultiChoiceDialog
       
从列表获得一个或多个选择的对话框
       
wxSingleChoiceDialog
       
从列表中获得一个选择的对话框,并且返回一个字符串
       
wxTextEntryDialog
       
从用户那里获得一行文本的对话框
       
wxPasswordEntryDialog
       
从用户那里获得一个密码的对话框
       
wxFontDialog
       
字体选择对话框
       
wxPageSetupDialog
       
标准页面设置对话框
       
wxPrintDialog
       
标准打印对话框
       
wxProcessDialog
       
进程指示对话框
       
wxMessageDialog
       
简单的消息对话框
       
wxWizard
       
向导对话框
       


控件

典型的,提供与用户之间交互的小窗口。控件不是静态的,它们能够具有与之关联的validators
wxControl
       
控件的基类
       
wxButton
       
按钮控件,显示文本
       
wxBitmapButton
       
按钮控件,显示一张位图
       
wxToggleButton
       
一个按钮,当用户单击时保持按下(状态)
       
wxCalendarCtrl
       
显示一个完整的月历的控件
       
wxCheckBox
       
检查框控件
       
wxCheckBox
       

       
wxCheckListBox
       
每个条目左边都有一个检查框的列表框
       
wxChoice
       
选择控件(一个没有可编辑区的组合框)
       
wxComboBox
       
包含一个可编辑区的选择框
       
wxDatePickerCtrl
       
简单的日期选择控件
       
wxGauge
       
显示一个变化数量的控件,如剩余时间
       
wxGenericDirCtrl
       
显示一个目录树的控件
       
wxHtmlListBox
       
显示HTML内容的列表框
       
wxStaticBox
       
一个静态的或将相关控件在视觉上组合在一起的方框
       
wxListBox
       
单选或多选的字符串列表
       
wxListCtrl
       
显示字符串列表,和/或图标,加上一个多列报表视图
       
wxListView
       
一个简单的界面(wxListCtrl的报表视图外观)
       
wxTextCtrl
       
单行或多行文本编辑控件
       
wxTreeCtrl
       
树(层次)控件
       
wxScrollBar
       
滚动条控件
       
wxSpinButton
       
一个旋转或'up-down'控件
       
wxSpinCtrl
       
一个旋转控件 例如:旋转按钮和文本控件
       
wxStaticText
       
一行或多行的不可编辑文本
       
wxStaticBitmap
       
显示一张位图的控件
       
wxRadioBox
       
一个单选按钮的组合
       
wxRadioButton
       
以相互排斥的方式和其它圆形按钮一起使用的圆形按钮
       
wxSlider
       
用户可拖拽的滑块
       
wxVListBox
       
支持可变行高的列表框
       


菜单

wxMenu
       
显示连续的菜单条目以供选择
       
wxMenuBar
       
包含连续菜单以一个frame的方式以供使用
       
wxMenuItem
       
表示单个菜单条目
       


窗口布局

有两种不同的窗口(特别是对话框)布局系统。一个是基于号称sizer的,它需要少量的定位,思考和计算,并且在所有平台下产生看起来一样的对话框。另一个是基于所谓的约束的,
虽然它仍然可用,但是已经被废弃了。
Sizer概述 描述基于sizer的布局
这些类是有关基于sizer布局的
wxSizer
       
抽象基类
       
wxGridSizer
       
在所有单元有着相同大小的网格中布局窗口的sizer
       
wFlexGridSizer
       
在一个可变网格中布局窗口的sizer
       
wxGridBagSizer
       
另一个网格sizer,让你指定一个条目的单元,且条目可以跨越行和/或列
       
wxBoxSizer
       
在一行或一列中布局窗口的sizer
       
wxStaticBoxSizer
       
wxBoxSizer相同,但是包含一个静态框的边框
       
约束概述 描述基于约束的布局
这些类是有关基于约束的窗口布局
wxIndividualLayoutConstraint
       
描述单个约束尺寸
       
wxLayoutConstraints
       
描述一个窗口类的约束
       


设备环境

概述
设备环境是一个能够在上面绘图的界面,并且提供一个允许传递不同的设备环境给你的绘图代码参数的抽象。
wxBufferedDC
       
双缓冲绘图的设备环境助手
       
wxBufferedPaintDC
       
OnPaint内部的双缓冲绘图设备环境助手
       
wxClientDC
       
OnPaint事件之外访问客户区的设备环境
       
wxPaintDC
       
OnPaint事件内部访问客户区的设备环境
       
wxWindowDC
       
访问非客户区的设备环境
       
wxScreenDC
       
访问整个屏幕的设备环境
       
wxDC
       
设备环境基类
       
wxMemoryDC
       
在位图上绘图的设备环境
       
wxMetafileDC
       
在元文件上绘图的设备环境
       
wxMirrorDC
       
允许简单映射的代理设备环境
       
wxPostScriptDC
       
PostScript文件上绘图的设备环境
       
wxPrinterDC
       
在打印机上绘图的设备环境
       


图形设备接口

位图概述
这里是在设备环境和窗口上绘图的相关类。
wxColour
       
描绘红,蓝和绿的颜色元素
       
wxDCClipper
       
包装设置操作并销毁剪切区域
       
wxBitmap
       
描绘一张位图
       
wxBrush
       
用于在设备环境上填充区域
       
wxBrushList
       
预定义刷子的列表
       
wxCursor
       
一个小的透明的描绘光标的位图
       
wxFont
       
描述字体
       
wxFontList
       
预定义字体的列表
       
wxIcon
       
一个小的透明的指派给帧的在设备环境上绘制位图,
       
wxImage
       
一个平台独立的图像类
       
wxImageList
       
一个图像列表,用于某些控件
       
wxMask
       
描绘一个掩码用于透明地绘制位图
       
wxPen
       
用于在设备环境上画线
       
wxPenList
       
预定义的画笔列表
       
wxPalette
       
描绘一个RGB值的索引表
       
wxRegion
       
描绘一个窗口或设备环境中简单或复杂的区域
       
wxRendererNative
       
抽象高水平的绘图原语
       


事件

概述
一个事件对象包含具体事件的信息。事件处理器(通常为成员函数)有一个单独的事件参数。
wxActivateEvent
       
一个窗口或应用程序的激活事件
       
wxCalendarEvent
       
用于wxCalendarCtrl
       
wxCalculateLayoutEvent
       
用于计算窗口布局
       
wxCloseEvent
       
一个关闭窗口或结束会话事件
       
wxCommandEvent
       
来自各种标准控件的事件
       
wxContextMenuEvent
       
当用户发出一个索引菜单命令时产生该事件
       
wxDateEvent
       
用于wxDatePickerCtrl
       
wxDialUpEvent
       
wxDialUpManager发出的事件
       
wxDropFilesEvent
       
一个撤销文件事件
       
wxEraseEvent
       
一个擦除背景事件
       
wxEvent
       
事件基类
       
wxFindDialogEvent
       
wxFindReplaceDialog发出的事件
       
wxFocusEvent
       
一个窗口聚焦事件
       
wxKeyEvent
       
一次击键事件
       
wxIconizeEvent
       
一个图标化/还原事件
       
wxIdleEvent
       
一个空闲事件
       
wxInitDialogEvent
       
一个对话框初始化事件
       
wxJoystickEvent
       
一个操纵杆事件
       
wxListEvent
       
一个列表控件事件
       
wxMaximizeEvent
       
一个最大化事件
       
wxMenuEvent
       
菜单事件
       
wxMouseCaptureChangedEvent
       
一个鼠标捕获变化事件
       
wxMouseEvent
       
鼠标事件
       
wxMoveEvent
       
移动事件
       
wxNotebookEvent
       
一个记事本控件事件
       
wxNotifyEvent
       
一个可以被禁止的通知事件
       
wxPaintEvent
       
绘画事件
       
wxProcessEvent
       
进程结束事件
       
wxQueryLayoutInfoEvent
       
用于查询布局信息
       
wxScrollEvent
       
来自滑块,独立的滚动条和旋转按钮的卷动事件
       
wxScrollWinEvent
       
来自滚动窗口的卷动事件
       
wxSizeEvent
       
一个大小化事件
       
wxSocketEvent
       
一个socket事件
       
wxSpinEvent
       
来自wxSpinButton的事件
       
wxSplitterEvent
       
来自wxSplitterWindow的事件
       
wxSysColourChangedEvent
       
一个系统颜色变化事件
       
wxTimerEvent
       
一个定时器到期事件
       
wxTreeEvent
       
树控件事件
       
wxUpdateUIEvent
       
用户界面更新事件
       
wxWindowCreateEvent
       
一个窗口建立事件
       
wxWindowDestroyEvent
       
一个窗口销毁事件
       
wxWizardEvent
       
一个向导事件  
 
 
 

wxWidgets类列表(二)

 
wxWidgets类列表(二)
 
校验器

概述
这些窗口校验器用于过滤和校验用户输入。
wxValidator
       
基本的检验器类
       
wxTextValidator
       
文本控件检验器类
       
wxGenericValidator
       
通用控件检验器类
       


数据结构

这些是wxWidgets支持的数据结构类。
wxCmdLineParser
       
命令行分析器类
       
wxDateSpan
       
一个合理的时间间隔
       
wxDateTime
       
操纵日期/时间的类
       
wxArray
       
一个动态数组的实现
       
wxArrayString
       
一个保存wxString对象的高效容器
       
wxHaskMap
       
一个简单的哈希map的实现
       
wxHashSet
       
一个简单的哈希集合的实现
       
wxHaskTable
       
一个简单的哈希表的实现(不建议使用,建议使用wxHaskMap
       
wxList
       
一个简单的链表实现
       
wxLongLong
       
一种可移植的64位整型
       
wxNode
       
表示wxList中的一个节点
       
wxObject
       
大多数wxWidgets类的基类
       
wxPathList
       
帮助查找多个路径的类
       
wxPoint
       
一个点的表示
       
wxRect
       
表示一个矩形的类
       
wxRegEx
       
正则表达式支持
       
wxRegion
       
表示一个区域的类
       
wxString
       
一个字符串类
       
wxStringTokenizer
       
表示一种记号或单词列表的字符串类
       
wxRealPoint
       
一个用浮点数表示的点
       
wxSizer
       
一个size的表示
       
wxTimeSpan
       
一个时间间隔
       
wxURI
       
表示一个统一资源标识符
       
wxVariant
       
可保存任意类型的运行时刻可改变的类
       


运行时类信息系统

概述
wxWidgets支持运行时类信息的处理和指定类名的动态对象的建立。
wxClassInfo
       
保存运行时的类信息
       
wxObject
       
带有运行时信息类的基类
       
RTTI macros
       
处理运行时信息的宏
       


日志特征

概述
wxWidgets为消息日志提供了若干类和函数。详见wxLog概述。
wxLog
       
基本的日志类
       
wxLogStderr
       
记录消息到一个C STDIO
       
wxLogStream
       
记录消息到一个C++ iostream
       
wxLogTextCtrl
       
记录消息到一个wxTextCtrl
       
wxLogWindow
       
记录消息到一个日志frame
       
wxLogGui
       
GUI程序的默认日志目标
       
wxLogNull
       
临时禁止消息日志
       
wxLogChain
       
允许链接两个日志目标
       
wxLogPassThrough
       
允许过滤日志消息
       
wxStreamToTextRedirector
       
允许重定向coutwxTextCtrl的输出
       
Log functions
       
错误和警告日志函数
       


调试特征
概述
wxWidgets通过类,函数和宏支持一些应用程序的调试方式。
wxDebugContext
       
提供内存检查设施
       
Debugging macros
       
支持断言和检查的调试宏
       
WXDEBUG_NEW
       
使用该宏得到进一步的调试信息
       
wxDebugReport
       
在一个程序崩溃的情况下建立调试报告的基类
       
wxDebugReportCompress
       
建立压缩的调试报告的类
       
wxDebugReportUpload
       
通过HTTP上载压缩的调试报告的类
       
wxDebugReportPreview
       
预览一个调试报告内容的抽象基类
       
wxDebugReportPreviewStd
       
wxDebugReportPreview的标准实现
       


联网技术类

wxWidgets提供了它自己的基于联网的socket类。
wxDialUpManager
       
提供函数来检测网络连接状态并确定它
       
wxIPV4adress
       
描绘一个因特网地址
       
wxIPadress
       
描绘一个因特网地址
       
wxSocketBase
       
描绘一个socket基本对象
       
wxSocketClient
       
描绘一个socket客户端
       
wxSocketServer
       
描绘一个socket服务端
       
wxSocketEvent
       
一个socket事件
       
wxFTP
       
FTP协议类
       
wxHTTP
       
HTTP协议类
       
wxURL
       
描绘一个URL(统一资源定位符)
       


进程间通讯

概述
wxWidgets提供基于Windows DDE的简单的进程间通讯设施,而大部分平台则使用TCP
wxClientwxDDEClient
       
描绘一个客户
       
wxConnectionwxDDEConnection
       
描绘一个客户端与一个服务端的连接
       
wxServerwxDDEServer
       
描述一个服务端
       


文档/视图框架

概述
wxWidgets支持一种文档/视图框架,它为以文档为中心的应用程序提供了内部管理。
wxDocument
       
表示一个文档
       
wxView
       
表示一个视图
       
wxDocTemplate
       
管理一个文档与一个视图之间的关系
       
wxDocManager
       
管理应用程序中的文档与视图
       
wxDocChildFrame
       
一个显示文档视图的子框架
       
wxDocParentFrame
       
用于包含视图的父框架
       


打印框架

概述
实现一个打印和预览框架让提供文档打印设施变得相对简单。
wxPreviewFrame
       
显示一个打印预览的框架
       
wxPreviewCanvas
       
显示一个打印预览的画布
       
wxPreviewControlBar
       
一个打印预览的标准控制栏
       
wxPrintDialog
       
标准打印对话框
       
wxPageSetupDialog
       
标准的页面设置对话框
       
wxPrinter
       
表示打印机的类
       
wxPrinterDC
       
打印机的设备环境
       
wxPrintout
       
表示一个详细的打印输出的类
       
wxPrintPreview
       
表示一个打印预览的类
       
wxPrintData
       
表示将被打印的文档的信息
       
wxPrintDialogData
       
表示打印对话框的信息
       
wxPageSetupDialogData
       
表示页面设置对话框的信息
       


拖拽和剪切板类

拖拽和剪切板概述
wxDataObject
       
数据对象类
       
wxDataFormat
       
表示一个数据格式
       
wxTextDataObject
       
文本数据对象类
       
wxFileDataObject
       
文件数据对象类
       
wxBitmapDataObject
       
位图数据对象类
       
wxCustomDataObject
       
自定义数据对象类
       
wxClipboard
       
剪贴板类
       
wxDropTarget
       
拖拽目标类
       
wxFileDropTarget
       
文件拖拽目标类
       
wxTextDropTarget
       
文本拖拽目标类
       
wxDropSource
       
拖拽源类
       


文件相关类

wxWidgets有若干个小类来操作磁盘文件,更多细节见文件类概述。
wxFileName
       
操作文件名和属性
       
wxDir
       
列举文件/子目录的类
       
wxDirTraverser
       
wxDir一起递归的列举文件/子目录的类
       
wxFile
       
低级文件输入/输出类
       
wxFFile
       
另一个低级文件输入/输出类
       
wxTempFile
       
安全的替换一个存在文件的类
       
wxTextFile
       
操作以行数组方式表示的文本文件的类
       
wxStandardPaths
       
标准目录路径
       


流类

wxWidgets有它自己的流类集合,作为经常出现bug的标准流库的另外一个选择,并且提供了更加强大的功能。
wxStreamBase
       
流基类
       
wxStreamBuffer
       
流缓冲类
       
wxInputStream
       
输入流类
       
wxOutputStream
       
输出流类
       
wxCountingOutputStream
       
查询一个流的大小的流类
       
wxFilterInputStream
       
过滤输入流类
       
wxFilterOutputStream
       
过滤输出流类
       
wxBufferedInputStream
       
缓冲输入流类
       
wxBufferedOutputStream
       
缓冲输出流类
       
wxMemoryInputStream
       
内存输入流类
       
wxMemoryOuputStream
       
内存输出流类
       
wxDataInputStream
       
平台无关的二进制数据输入流类
       
wxDataOutputStream
       
平台无关的二进制数据输出流类
       
wxTextInputStream
       
平台无关的文件数据输入流类
       
wxTextOutputStream
       
平台无关的文件数据输出流类
       
wxFileInputStream
       
文件输入流类
       
wxFileOutputStream
       
文件输出流类
       
wxFFileInputStream
       
另一个文件输入流类
       
wxFFileOutputStream
       
另一个文件输出流类
       
wxTempFileOutputStream
       
安全的替代一个已存在的文件的流
       
wxStringInputStream
       
字符串输入流
       
wxStringOutputStream
       
字符串输出流
       
wxZlibInputStream
       
Zlib(压缩)输入流
       
wxZlibOutputStream
       
Zlib(压缩)输出流
       
wxZipInputStream
       
读一个ZIP档案的输入流
       
wxZipOutputStream
       
写一个ZIP档案的输出流
       
wxSocketInputStream
       
Socket输入流类
       
wxSocketOutputStream
       
Socket输出流类
       


线程类

多线程概述
wxWidgets提供了一个类的集合来保证在多种平台上使用本地线程的能力。
wxThread
       
线程类
       
wxThreadHelper
       
轻松地管理后台线程
       
wxMutex
       
互斥体类
       
wxMutexLocker
       
互斥锁实用程序类
       
wxCriticalSection
       
临界区类
       
wxCriticalSectionLocker
       
临界区锁实用程序类
       
wxCondition
       
条件类
       
wxSemaphore
       
信号量类
       


HTML

wxWidgets提供一个类的集合来显示HTML格式的文本。这些类包含一个基于HTML窗口部件的帮助系统。
wxHtmlHelpController
       
HTML帮助控制器类
       
wxHtmlWindow
       
HTML窗口类
       
wxHtmlEasyPrinting
       
打印HTML的简单类
       
wxHtmlPrintout
       
一般的HTML wxPrintout
       
wxHtmlParser
       
一般的HTML分析器类
       
wxHtmlTagHandler
       
HTML标签处理器,可以插入到wxHtmlParser
       
wxHtmlWinParser
       
wxHtmlWindowHTML分析器类
       
wxHtmlWinTagHandler
       
HTML标签处理器,可以插入到wxHtmlWinParser
       


虚拟文件系统类

wxWidgets提供了一组实现一个易扩展的虚拟文件系统的类,它们由HTML类内部使用。
wxFSFile
       
表示一个虚拟文件系统中的文件
       
wxFileSystem
       
虚拟文件系统的主要接口
       
wxFileSystemHandler
       
用于通知文件系统类型的类
       


基于XML的资源系统的类

基于XML的资源系统(XRC)概述
允许你的应用程序以保存在一个XML格式中的规格来建立控件和其它用户界面元素的资源。
wxXmlResource
       
操作资源的主类
       
wxXmlResourceHandler
       
XML资源处理器的基类
       


在线帮助

wxHelpController
       
控制帮助窗口的类族
       
wxHtmlHelpController
       
HTML帮助控制器类
       
wxContextHelp
       
使应用程序进入上下文敏感的帮助模式中的类
       
wxContextHelpButton
       
使应用程序进入上下文敏感的帮助模式中的按钮类
       
wxHelpProvider
       
提供上下文敏感的帮助准备的抽象类
       
wxSimpleHelpProvider
       
简单地提供上下文敏感的帮助准备的类
       
wxHelpControllerHelpProvider
       
通过一个帮助控制器来提供上下文敏感的帮助准备的类
       
wxToolTip
       
实现工具提示的类
       


数据库类

数据库类概述
wxWidgets提供一组类来访问微软的ODBC(开放数据互连)产品,它由Remstar捐赠。这就是大家知道的wxODBC
wxDb
       
ODBC数据库连接
       
wxDbTable
       
提供访问一个数据库表
       
wxDbInf
       

       
wxDbTableInf
       

       
wxDbColDef
       

       
wxDbColInf
       

       
wxDbColDataPtr
       

       
wxDbColFor
       

       
wxDbConnectInf
       

       
wxDbIdxDef
       

       


其它

wxApp
       
应用程序类
       
wxCaret
       
一个光标对象
       
wxCmdLineParser
       
命令行分析器类
       
wxConfig
       
/写配置的类(使用INI文件或注册表)
       
wxDllLoader
       
操作共享库的类
       
wxGLCanvas
       
可由OpenGL调用来着色的画布
       
wxGLContext
       
简单共享OpenGL数据资源的类
       
wxLayoutAlgorithm
       
一个可选的窗口布局设施
       
wxProcess
       
进程类
       
wxTimer
       
定时器类
       
wxStopWatch
       
秒表类
       
wxMimeTypesManager
       
MIME类型管理器类
       
wxSystemSettings
       
获取多种全局参数的系统设置类
       
wxSystemOptions
       
运行时配置的系统选项类
       
wxAcceleratorTable
       
加速表
       
wxAutomationObject
       
OLE自动化类
       
wxFontManager
       
字体映射,查找适合给定编码的字体
       
wxEncodingConverter
       
编码转换
       
wxCalendarDateAttr
       
wxCalendarCtrl使用
       
wxQuantize
       
完成量化或颜色还原的类
       
wxSingleInstanceChecker
       
检查仅有单个程序实例运行