PostWnd市盈率是什么意思么

C++MFC学习心得(三)——PostNcDestroy,~MainWnd(),OnDestroy(),~CWinApp()的区别。。。 - CSDN博客
今天,继续学习中,不过遇到若干内存泄漏的问题。
先说说程序构成吧,一个自制的继承自CListBox的类COwnerDrawListBox。
BOOL COwnerDrawListBox::PreCreateWindow(CREATESTRUCT& cs)
if(!CListBox::PreCreateWindow(cs))
return FALSE;
cs.style &= -(LBS_OWNERDRAWVARIABLE|LBS_SORT);
cs.style |= LBS_OWNERDRAWFIXED;
return TRUE;
void COwnerDrawListBox::MeasureItem(LPMEASUREITEMSTRUCT lpmis)
lpmis-&itemHeight = 32;
void COwnerDrawListBox::DrawItem(LPDRAWITEMSTRUCT lpdis)
dc.Attach(lpdis-&hDC);
CRect rect = lpdis-&rcI
UINT nIndex = lpdis-&itemID;
CBrush* pBrush = new CBrush(
::GetSysColor((lpdis-&itemState&ODS_SELECTED)?COLOR_HIGHLIGHT:COLOR_WINDOW)
dc.FillRect(rect,pBrush);
dc.SelectObject(&FontGlob);
if(nIndex!=(UINT)-1)
dc.SetBkMode(TRANSPARENT);
GetItemData(nIndex);
dc.TextOut(rect.left,rect.top,*((CString*)GetItemData(nIndex)));
dc.Detach();
int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
FontGlob.CreatePointFont(240,&Arial&);
CClientDC dc(this);
TEXTMETRIC
dc.GetTextMetrics(&tm);
m_cxChar = tm.tmAveCharW
m_cyChar = tm.tmHeight + tm.tmExternalL
CRect rect(
m_cxChar*2,
m_cyChar*1,
m_cxChar*40,
m_cyChar*10);
在此添加您专用的创建代码
m_wndCNumEdit.Create(WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_MULTILINE|ES_AUTOVSCROLL|WS_BORDER|ES_WANTRETURN,rect,this,IDC_CNUMEDIT);
rect.SetRect(m_cxChar*2,
m_cyChar*11,
m_cxChar*40,
m_cyChar*20);
m_wndCODL.Create(WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_BORDER,rect,this,IDC_CODLB);
for(int i = 0;i&10;i++)
CString* pStr = new CS
pStr-&Format(_T(&%d&),i);
m_wndCODL.AddString(_T(&&));
m_wndCODL.SetItemData(i,(DWORD)pStr);
直接先贴代码。。。
下面是析构的东西。。。
void CMainWnd::PostNcDestroy()
// TODO: 在此添加专用代码和/或调用基类
CMainWnd::~CMainWnd()
CWnd::~CWnd();
void CMainWnd::OnDestroy()
for(int i = 0;i&m_wndCODL.GetCount();i++)
delete (CString*)m_wndCODL.GetItemData(i);
CWnd::OnDestroy();
// TODO: 在此处添加消息处理程序代码
好了,代码贴完,开始分析。。。
因为是手写,刚开始自己写的OnPaint(){},里面没有任何东西的时候,CPU直接满载,刚开始以为是控件重画导致的,可是,直到注释掉所有的代码,才发现是OnPaint的问题,最后查了一下,是OnPaint里必须至少要有一个CPaintDC的操作,原因很简单,就是没有这样的操作,系统默认没画过,ON_WM_PAINT消息一直存在,无限循环跟while(1)差不多,以后必须注意。
后来,想用这个自制列表框来存储文字,比如现实你存进去的文字啦什么的。这次,当然失败了。。。
原来用的以下代码:
m_wndCODL.AddString(_T(&Hello&));
然后在OnDrawItem中加入如下代码:
m_wndCODL.GetText(nIndex,str);
dc.TextOut(rect.left,rect.top,str);
这时候输出乱码,我以为是数据形式的问题,就各种换,但是不行,于是只好单步。
但不之后发现,AddString之后,AddString,对于不同的数值敏感,但是,数值一样,输出也一样。。
这时已经出现了Cwnd Object泄漏了。。。
这时我就想到可能是重画的原因了,去掉重画,直接Pass,这说明,开启重画之后,AddString加入的值并不是字符串了。查了一下,然后看了一下CListBox里的类函数,看到了SetItemData,稍微测试了一下证明了我的猜想。。。
好吧,接下来,SetItemData的参数为DWORD_PTR类型,即_w64 unsigned long,大小四字节,为什么是4字节?代码如下:
#if defined(_WIN64)
typedef __int64 INT_PTR, *PINT_PTR;
typedef unsigned __int64 UINT_PTR, *PUINT_PTR;
typedef __int64 LONG_PTR, *PLONG_PTR;
typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;
#define __int3264
typedef _W64 int INT_PTR, *PINT_PTR;
typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;
typedef _W64 long LONG_PTR, *PLONG_PTR;
typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;
#define __int3264
这时候,我就明白这个DWORD_PTR的意思了,就是让你存指针用的。。。果断申请内存,CString* pStr = new CS然后,显示,可以了。。。
泄漏问题正式开始,前文已经提到,在错误结果的时候,出现了CWnd Object泄漏,我就知道是MainWnd没有析构。。。可是怎么会出现这个呢?首先想到的是,CWinApp,因为只有CWinApp中又new CMainWnd这一句。。。然后析构,delete m_MainW果断失败,不明白为什么。。。于是看了之前的例程一下,哦~~应该加个PostNcDestroy();
加上delete this,成功。。。
肯定还有失败的,那就是自己申请的那一部分内存,习惯性的加入到PostNcDestroy()中,失败,而且又出现了,CWnd Object泄漏。这下单步,看到根本没有运行delete this。。。出问题了。。。而是在删除我自己申请的内存的时候直接跳出循环的。。。感觉PostNcDestroy()只能删除一次?事实不是如此,而是,在OnDestroy之后,就已经没有控件在内存中了,所以delete出错了。。。返回值为3。。
这次,想到还有个OnDestroy 没用,在这里删除,成功了。。。这下我就想知道这几个函数之间的关系了。。。
void CMainWnd::PostNcDestroy()
// TODO: 在此添加专用代码和/或调用基类
CMainWnd::~CMainWnd()
CWnd::~CWnd();
void CMainWnd::OnDestroy()
for(int i = 0;i&m_wndCODL.GetCount();i++)
delete (CString*)m_wndCODL.GetItemData(i);
CWnd::OnDestroy();
// TODO: 在此处添加消息处理程序代码
CMyApp::~CMyApp()
delete m_pMainW
全加断点,然后运行,可以看出时间顺序。。。
首先,OnDestroy,最开始的,接受到ON_WN_DESTROY,调用这里,所以,这里释放一些用户内存是很好的。在这里,给用户释放的时间。
然后PostNcDestroy,释放用户视图,然后把自己析构掉。。。释放视图对象,因为这时候视图已经关掉了。
再就是,PostNcDestroy中的delete this,调用的~CMainWnd(),为什么不在这里释放用户内存?因为在窗口消失的那一瞬间(不是隐藏窗口),视图句柄都已经为0了,这个过程是在OnDestroy之前,但是一些全局内存仍然可以释放。
最后,就是~CMyApp(),释放掉进程,彻底关闭。CFrameWnd_百度百科
关闭特色百科用户权威合作手机百科
收藏 查看&CFrameWnd本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来吧!
CFrameWnd类往往用于创建的主窗口,因为它能很好地支持和(、状态条等),为此定义了大量的成员函数和。在编写文档/视图结构的时,CFrameWnd作为主窗口管理视图和文档对象。视图对象和都成为CFrameWnd的子窗口,它们分享客户区,其位置被CFrameWnd有效地排列。 CFrameWnd直接支持单文档界面(SDI),对于多文档界面(MDI),使用其CMDIFrameWnd和CMDIChildWnd。用&&&&途创建的主窗口支&&&&持单文档界面(SDI)
该类定义了两个成员函数用于创建主窗口,即Create()和LoadFrame()。前者主要通过CWnd::CreateEx()创建窗口;而后者首先组织参数,再调用前者。它们的定义如下:
BOOL CFrameWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, LPCTSTR lpszMenuName, DWORD dwExStyle, CCreateContext* pContext)
/*可见,与CWnd::Create()稍有不同。因为目的是创建主窗口,所以第6个参数要求菜单资源名*/
HMENU hMenu = NULL;
if (lpszMenuName != NULL)
//搜索包含该菜单资源的实例(当前进程或者按进行装入的DLL)
HINSTANCE hInst = AfxFindResourceHandl(lpszMenuName, RT_MENU);
//装入菜单资源
if ((hMenu = ::LoadMenu(hInst, lpszMenuName)) == NULL)
TRACE0(“Warning: failed to load menu for CFrameWnd.\n”);
PostNcDestroy(); //perhaps delete to C++ object
return FALSE;
m_strTitle = lpszWindowN //窗口标题,以备后用(如刷新显示)
// 调用CWnd::CreateEx()
if (!CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle, rect.left, rect.top, rect.right – rect.left, rect,bottom – rect.top, pParentWnd-&GetSafeHwnd(), hMenu, (LPVOID)pContext))
if (hMenu != NULL)
DestroyMenu(hMenu); //如果创建失败,释放菜单资源
return FALSE;
return TRUE;
BOOL CFrameWnd::LoadFrame(UNIT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext)
/*主窗口的菜单、图标、、及标题都以nIDResource标识。除创建窗口外,还要做许多工作,如设置帮助上下文ID、装入、初始化子窗口。所以在文档/视图框架程序中,总是使用LoadFrame()创建主窗口。*/
ASSERT_VALID_IDR(nIDResource);
ASSERT(m_nIDHelp == 0 || m_nIDHelp == nIDResource);
m_nIDHelp = nIDR // ID for help context (+HID_BASE_RESOURCE)
CString strFullS
if (strFullString.LoadString(nIDResource))
AfxEXtractSubString(m_strTitle, strFullString, 0); //取得窗口标题
VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG));
//装入图标,注册
LPCTSTR lpszClass = GetIconWndClass(dwDefaultStyle, nIDResource);
LPCTSTR lpszTitle = m_strT
//调用CFrameWnd::Create()
if (!Create(lpszClass, lpszTitle, dwDefaultStyle, rectDefault, pParentWnd, MAKEINTRESOURCE(nIDResource), 0L, pContext))
return FALSE;
//存储菜单句柄
ASSERT(m_hWnd != NULL);
m_hMenuDefault = ::GetMenu(m_hWnd);
LoadAccelTable(MAKEINTRESOURCE(nIDResource));
if (pContext == NULL) //初始化子窗口
SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE);
return TRUE;
由于LoadFrame()的形能简洁,在创建窗口的同时,完成许多主的初始化工作。所以,如果以CFrameWnd为程序主,一般通过LoadFrame()创建。如果要使用CFrameWnd 创建简单化的主或子窗体,可调用Create()。
在文档视图支持的SDI程序中,主框架窗是在文档模板中应用CDocTemplate::CreateNewFrame()创建的。在该函数中,首先动态创建CFrameWnd对象,再调用对象的LoadFrame()成员。由于在CFrameWnd::PostNcDestroy()中清除了当前对象,所以尽管CFrameWnd对象惯于在堆中构造,却不必关心它的释放。例如:
void CFrameWnd::PostNcDestroy()
另外,因为CFrameWnd创建了主窗口,所以在窗口销毁时,要向发送WM_QUIT消息,这个处理已封装在CWnd中。视图是主框架窗口的一个ID为AFX_IDW_PANE_FIRST,带有边框的子窗口,这个主框架窗口是由CFrameWnd类封装并创建的。显然,视图作为其子窗口,也是由CFrameWnd创建的。成员函数CFrameWnd::OnCreateClient()用于创建视图窗口,它是该类的消息处理函数中被调用的。代码如下:
BOOL CFrameWnd::OnCreateClient(LPCREATESTRUCT, CCreateContext* pContext)
/*pContext-&m_pNewViewClass存储视图的运动时类信息的指针(CRuntimeClass*),可用于动态创建视图*/
if (pContext != NULL && pContext-&m_pNewViewClass != NULL)
//调用CFrameWnd::CreateView()创建视图
if (CreateView(pContext, AFX_IDW_PANE_FIRST) == NULL)
return FALSE;
return TRUE;
CWnd* CFrameWnd::CreateView(CCreateContext* pContext, UINT nID)
ASSERT(m_hWnd != NULL);
ASSERT(::IsWindow(m_hWnd));
ASSERT(pContext != NULL);
ASSERT(pContext-&m_pNewViewClass != NULL);
//应用运行类信息,动态创建视图对象
CWnd* pView = (CWnd*)pContext-&m_pNewViewClass-&CreateObject();
if (pView == NULL)
TRACE1(“Warning: Dynamicof view type %hs failed.\n”, pContext-&m_pNewViewClass-&m_lpszClassName);
return NULL;
ASSERT_KINDOF(CWnd, pView);
//使用已经创建的视图对象创建视图窗口
if (!pView-&Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, nID, pContext))
TRACE0(“Warning: could notview for frame.\n”);
return NULL; //can’t continue without a view
//根据视图窗口的边界风格调整框架窗口风格
if (afxData.bWin4 && (pView-&GetExStyle() & WS_EX_CLIENTEDGE))
//如果视图已经设置了凹陷边框,去除主窗口的凹陷边框
ModifyStyleEx(WS_EX_CLIENTEDGE, 0, SWP_FRAMECHANGED);
一个主窗口可能包含多个视图,它们或者是通过CSpliterWnd在客户区拆分创建的,或者是直接在客户区以子窗口形式创建。框架规定只能有一个活动视图,如果不使用拆分,同时只能显示一个视图。在主框架窗口创建后(视图也已创建),一般要调用CFrameWnd::InitialUpdateFrame()进行初始化,该函数首先设置第一视图(ID为AFX_IDW_PANE_FIRST)为活动视图,然后向所有视图发送初始化消息,确保每个视图CView::()被调用。
可以调用CFrameWnd::SetActiveView()及CFrameWnd::GetActiveView()设置或取得活动视图。在设置活动视图后,应该将活动视的ID切换为AFX_IDW_PANE_FIRST,因为有些操作是只针对第一视图的。例如,只有第一视图才能与争夺主窗口客户区的空间,所以其他视图无法在主框架窗口中正常显示(如果不使用拆分)。主框架窗口的直观特点是被丰富的装饰的,如工具条、状态条等,它们都派生于CControlBar。当鼠标移到工具条或某菜单项区域时,相应的提示信息会在状态栏显示或以Tip形式弹出;没有建立消息映射的命令会自动禁止;客户区发生变化时视图和会自动排列。这一切都是CFrameWnd封装的功能。下面列举几个重要的操作函数。
EnableDocking(): 允许在自己的客户区依靠。
DockControlBar(): 将控制条依靠在客户区周边。
FloatControlBar(): 将控制条浮动在上,而不是依靠在客户区。
ShowControlBar(): 显示或隐藏控制条。
SaveBarState(): 将所有控制条的状态存入初始化文件或注册表。
LoadBarState(): 从初始化文件或注册表中恢复所有状态。
GetDockState(): 将控制条状态信息存入一个对象。
SetDockState(): 从一个对象中恢复控制条状态。
SetMessageText(): 在状态栏的第一个面板区域显示一个信息串。
ReclcLayout():,当位置变化或客户区尺寸变化时被调用,重新设置视图及控制条在客户区的位置。可根据需要它或主动调用它。命令消息是指菜单、、及向其所在窗口发送的消息。主框架窗口通常包含的系统主菜单和,而往往在LoadFrame()中装入主窗口,它们都要向主窗口发送命令消息。
命令消息与窗口消息(除WM_COMMAND之外,前缀是WM_的消息)不同,窗口消息与某一窗口(句柄)紧密相关,应该由接收消息的窗口来处理;而命令消息往往与具体的窗口无关,只是为本程序完成一个功能操作。主框架窗口的系统菜单(工具按钮)尤其如此,某一个主菜单命令在其他窗口中(如视图)或在其他模块中(如文档)处理也许更合理。为了解决这个矛盾,CFrameWnd实现了分发命令消息的机制,它能够将本窗口收到的命令消息分发给视图、文档和应用类。
CCmdTarget类定义了一个OnCmdMsg(),用于处理命令消息,可以它,实现自己的命令消息处理方式。是的,CFrameWnd的命令消息分发机制就是通过这个函数实现的。该函数的代码如下:
BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
CPushRoutingFrame push(this);
//首先将命令消息传给活动视图
CView* pView = GetActiveView();
//如果袖图没有处理,它将传送命令消息给关联的文档对象
if (pView != NULL && pView-&OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE; //视图或文档已经处理该命令,返回
//视图或文档没有处理该消息,即没有建立该命令的消息映射,下面由主窗口本身处理
if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE; //主窗口已处理
//主窗口没有处理,最后尝试应用类
CWinApp* pApp = AfxGetApp();
if (pApp != NULL && pApp-&OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
return FALSE; //最终没有处理该命令消息,返回false,该消息由默认过程处理
最后,读者要注意这样一个事实:主窗口直接调用视图(间接调用文档)、应用类的OnCmdMsg()处理命令消息,并没有通过SendMessage()或PostMessage()将命令消息转发。而OnCmdMsg()仅在类中搜索消息映射表,查找该命令的处理函数,找不到则返回false。所以视图类只有通过消息映射,才能处理主窗口转发的命令消息,如果使用CView::WindowProc()捕捉该类消息,会一无所获。为了管理和视图,CFrameWnd为几个窗口消息建立了消息映射,专门进行处理。
OnInitMenuPopup(): 处理WM_INITMENUPOPUP消息,设置弹出菜单的各项目的启用/禁止状态。
OnEnterIdle(): 处理WM_ENTERIDLE消息,设置状态条的空闲时提示信息。
OnMenuSelect(): 处理WM_MENUSELECT消息,当某菜单项被选择时更新状态条提示。
OnToolTipText(): 处理TTN_NEEDTEXT通知消息,显示工具条的工具提示。
OnUpdateKeyIndicator(): 更新状态条的键盘状态指示器信息。
OnUpdateControlBarMenu(): 更新控制条的启用/禁止状态,如工具条按钮。
OnSize(): 处理消息,调用RecalcLayout()排列客户区控件及视图。
OnHScroll(): 处理WM_HSCROLL消息,滚动视图。
OnVScroll(): 处理WM_VSCROLL消息,滚动视图。
OnClose(): 处理WM_CLOSE消息,存储并关闭文档。
m_bAutoMenuEnable
自动控制使菜单项目可用或无效
rectDefault
当构造一个CFrameWnd对象时传递此静态CRect作为参数,使Windows选择窗体的初始大小和位置
构造一个CFrameWnd对象
调用以构造和初始化一个与CFrameWnd对象有关的Windows框架窗口
调用以从资源信息中动态构造一个框架窗口
LoadAccelTable
装入一个加速器表格
复位控件条设置
存储控件条设置
显示控件条
在主窗口中停靠框架窗口
GetDockState
获取框架窗口的停靠状态
ActivateFrame
使框架对用户可视并可用
InitialUpdateFrame在
调用的框架窗中使OnInitialUpdate成员函数属于所有视图
返回活动CFrameWnd对象
SetActiveView
设置活动CView对象
返回活动CView对象
CreateView
在框架中构造一个非CView派生的视图
返回活动CDowment对象
GetControlBar
返回控件条
GetMessageString
获得与命令ID相符的消息
IsTracking
确定分隔条是否正在移动
SetMessageText
设置标准状态条的文本
允许一个控件条停靠
DockControlBar
停靠一个控件条
FloatControlBar
浮动一个控件条
将框架窗口设置为模态
EndModalState
结束框架窗口的模态状态,用BeginModalState使无效的窗口可用
返回一个表明框架窗口是否处于模态状态
ShowOwnedWindows
显示所有CFrameWnd对象的后代窗口
RecalcLayout
重新设置CFrameWnd对象的控件条的位置
可重载函数
OnCreateClient
为框架构造一个用户窗口
OnSetPreviewMode
设置应用的主框架成为或退出预打印模式
GetMessageBar
返回一个属于框架窗口的状态条指针
NegotiateBorderSpace
调整框架窗口中的边框空白
OnContextHelp
处理相应项的SHIFT+F1帮助
新手上路我有疑问投诉建议参考资料 查看下次自动登录
现在的位置:
& 综合 & 正文
lwip1.4.0 http server实现及POST 实现
lwip1.4.0之实现及实现
一、的实现
lwip默认的在 主要核心文件为 读取相关相关资源为协议核心文件
首先在协议栈正常运行后 需要在函数中调用初始化正常情况下般还需要实现和回调函数的初始工作 本人写在一个函数中 如下
void http_start(void)
http_set_ssi_handler(SSIHandler, g_pcConfigSSITags, sizeof(g_pcConfigSSITags)/sizeof (char *));
http_set_cgi_handlers(g_psConfigCGIURIs, sizeof(g_psConfigCGIURIs)/sizeof(tCGI));
然在下调用完成初始化和的工作。
其次 要使用对网页进行编译 这个小工具可以从网上下载一个本人将编译命令写在一个批处理文件中 每次编译只要运行一下具体命令如下
makefsfile -i web_pages -o ../lwip-1.4.0/src/apps/httpserver_raw/fsdata.h -r -h
其中 为所包含的网页文件夹 产生的网页数据放在中 用于跟工程文件一起编译表示每次编译网页时重写表示产生的网页数据中不包含协议头部 因为本人在中使用的是动态产生协议头。
至此 网页完成 在浏览器中敲入板子的地址 便可以看到网页了
二、方案实现
LWIP HTTP 协议中默认只支持方法 但是一般提交表单时都用方法 而方案需要自己实现 不过已经需要实现的函数申明在中了
首先将宏 设置成表示支持方法需要实现的函数分别为当接收到一个请求时会调用此函数接收数据接收完成后 调用此函数
具体实现如下
err_t httpd_post_begin(void *connection, const char *uri, const char *http_request,
u16_t http_request_len, int content_len, char *response_uri,
u16_t response_uri_len, u8_t *post_auto_wnd)
#if LWIP_HTTPD_CGI
int i = 0;
struct http_state *hs = (struct http_state *)
if(!uri || (uri[0] == '\0')) {
return ERR_ARG;
hs-&cgi_handler_index = -1;
// 此变量为本人自己在添加 用于保存索引 为表示无索引
hs-&response_file = NULL; // 此变量为本人自己在添加 用于保存 处理完后返回的响应
#if LWIP_HTTPD_CGI
if (g_iNumCGIs && g_pCGIs) {
for (i = 0; i & g_iNumCGIs; i++) {
if (strcmp(uri, g_pCGIs[i].pcCGIName) == 0) {
hs-&cgi_handler_index = // 找到响应的 将其保存在以便在中使用
if(i == g_iNumCGIs) {
return ERR_ARG; // 未找到
return ERR_OK;
#define LWIP_HTTPD_POST_MAX_PAYLOAD_LEN
static char http_post_payload[LWIP_HTTPD_POST_MAX_PAYLOAD_LEN];
static u16_t http_post_payload_len = 0;
err_t httpd_post_receive_data(void *connection, struct pbuf *p)
struct http_state *hs = (struct http_state *)
struct pbuf *q =
u32_t http_post_payload_full_flag = 0;
while(q != NULL)
// 缓存接收的数据至
if(http_post_payload_len + q-&len &= LWIP_HTTPD_POST_MAX_PAYLOAD_LEN) {
MEMCPY(http_post_payload+http_post_payload_len, q-&payload, q-&len);
http_post_payload_len += q-&
// 缓存溢出 置溢出标志位
http_post_payload_full_flag = 1;
pbuf_free(p); // 释放
if(http_post_payload_full_flag) // 缓存溢出 则丢弃数据
http_post_payload_full_flag = 0;
http_post_payload_len = 0;
hs-&cgi_handler_index = -1;
hs-&response_file = NULL;
else if(hs-&post_content_len_left == 0) {
// POST数据已经接收完毕 则处理
if(hs-&cgi_handler_index != -1) {
count = extract_uri_parameters(hs, http_post_payload);
hs-&response_file = g_pCGIs[hs-&cgi_handler_index].pfnCGIHandler(hs-&cgi_handler_index, count, hs-&params,
hs-&param_vals); // 调用解析函数
http_post_payload_len = 0;
hs-&response_file = NULL;
http_post_payload_len = 0;
return ERR_OK;
void httpd_post_finished(void *connection, char *response_uri, u16_t response_uri_len)
struct http_state *hs = (struct http_state *)
if(hs-&response_file != NULL) {
strncpy(response_uri, hs-&response_file,response_uri_len); // 拷贝用于给浏览器响应相应的请求
至此 和 方法实现完成
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 除权除息是什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信