`
phinecos
  • 浏览: 343865 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

《windows核心编程》笔记(一)

 
阅读更多

1,windows对程序错误的处理,

intAPIENTRY_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow)
{
LPVOIDlpMsgBuf;
HANDLEhFile
=::CreateFile(_T("C://12.txt"),0,0,NULL,OPEN_EXISTING,0,NULL);//打开文件
if(INVALID_HANDLE_VALUE==hFile)
{//文件不存在
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),0,(LPTSTR)&lpMsgBuf,0,NULL);
MessageBox(NULL,(LPCWSTR)lpMsgBuf,_T(
"错误信息"),MB_OK|MB_ICONINFORMATION);
LocalFree(lpMsgBuf);
}

return0;
}

调试时,在Watch窗口输入“@err,hr”,就可以显示线程的最后错误代码的号码和该错误的描述信息。
2008060701.jpg

VC6.0还带了一个实用小程序,可以用来将错误代码转换为相应的文本描述信息。
2008060702.jpg
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

书中给出了一个模仿VC6自带的那个Error Lookup实用程序的示例:

#defineESM_POKECODEANDLOOKUP(WM_USER+100)//用户自定义消息
constTCHARg_szAppName[]=TEXT("ErrorShow");

BOOLDlg_OnInitDialog(HWNDhwnd,HWNDhwndFocus,LPARAMlParam)
{

chSETDLGICONS(hwnd,IDI_ERRORSHOW);
//设置图标

//Don'taccepterrorcodesmorethan5digitslong
Edit_LimitText(GetDlgItem(hwnd,IDC_ERRORCODE),5);//限制输入字符长度最大为

//Lookupthecommand-linepassederrornumber
SendMessage(hwnd,ESM_POKECODEANDLOOKUP,lParam,0);//发送初始错误代码消息
return(TRUE);
}


voidDlg_OnCommand(HWNDhwnd,intid,HWNDhwndCtl,UINTcodeNotify){

switch(id)
{

caseIDCANCEL:
EndDialog(hwnd,id);
//关闭对话框窗口
break;

caseIDC_ALWAYSONTOP://始终在最前
SetWindowPos(hwnd,IsDlgButtonChecked(hwnd,IDC_ALWAYSONTOP)?HWND_TOPMOST:HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
break;

caseIDC_ERRORCODE:
EnableWindow(GetDlgItem(hwnd,IDOK),Edit_GetTextLength(hwndCtl)
>0);//设置“lookup"按钮是否enable
break;

caseIDOK:
//Gettheerrorcode
DWORDdwError=GetDlgItemInt(hwnd,IDC_ERRORCODE,NULL,FALSE);//获取错误代码号码

HLOCALhlocal
=NULL;//Bufferthatgetstheerrormessagestring

//UsethedefaultsystemlocalesincewelookforWindowsmessages.
//Note:thisMAKELANGIDcombinationhas0asvalue
DWORDsystemLocale=MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL);//本地语言

//Gettheerrorcode'stextualdescription
BOOLfOk=FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM
|FORMAT_MESSAGE_IGNORE_INSERTS|
FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,dwError,systemLocale,
(PTSTR)
&hlocal,0,NULL);

if(!fOk)
{
//Isitanetwork-relatederror?
HMODULEhDll=LoadLibraryEx(TEXT("netmsg.dll"),NULL,
DONT_RESOLVE_DLL_REFERENCES);

if(hDll!=NULL)
{
fOk
=FormatMessage(
FORMAT_MESSAGE_FROM_HMODULE
|FORMAT_MESSAGE_IGNORE_INSERTS|
FORMAT_MESSAGE_ALLOCATE_BUFFER,
hDll,dwError,systemLocale,
(PTSTR)
&hlocal,0,NULL);
FreeLibrary(hDll);
}

}


if(fOk&&(hlocal!=NULL))
{
SetDlgItemText(hwnd,IDC_ERRORTEXT,(PCTSTR)LocalLock(hlocal));
LocalFree(hlocal);
}

else
{
SetDlgItemText(hwnd,IDC_ERRORTEXT,TEXT(
"Notextfoundforthiserrornumber."));
}

break;
}

}


INT_PTRWINAPIDlg_Proc(HWNDhwnd,UINTuMsg,WPARAMwParam,LPARAMlParam)
{

switch(uMsg)
{
chHANDLE_DLGMSG(hwnd,WM_INITDIALOG,Dlg_OnInitDialog);
//初始化处理
chHANDLE_DLGMSG(hwnd,WM_COMMAND,Dlg_OnCommand);//命令处理

caseESM_POKECODEANDLOOKUP:
SetDlgItemInt(hwnd,IDC_ERRORCODE,(UINT)wParam,FALSE);
//控件上设置错误代码
FORWARD_WM_COMMAND(hwnd,IDOK,GetDlgItem(hwnd,IDOK),BN_CLICKED,PostMessage);//模拟按钮点击事件
SetForegroundWindow(hwnd);//设置为最前的窗口
break;
}


return(FALSE);
}


intWINAPI_tWinMain(HINSTANCEhinstExe,HINSTANCE,PTSTRpszCmdLine,int)
{

HWNDhwnd
=FindWindow(TEXT("#32770"),TEXT("ErrorShow"));//寻址窗口
if(IsWindow(hwnd))
{//已经存在
//Aninstanceisalreadyrunning,activateitandsenditthenew#
SendMessage(hwnd,ESM_POKECODEANDLOOKUP,_ttoi(pszCmdLine),0);
}

else
{//新窗口
DialogBoxParam(hinstExe,MAKEINTRESOURCE(IDD_ERRORSHOW),NULL,Dlg_Proc,_ttoi(pszCmdLine));
}

return(0);
}

这里用到了几个宏定义,下面这个是用来指定消息处理函数的

//ThenormalHANDLE_MSGmacroinWindowsX.hdoesnotworkproperlyfordialog
//boxesbecauseDlgProcreturnsaBOOLinsteadofanLRESULT(like
//WndProcs).ThischHANDLE_DLGMSGmacrocorrectstheproblem:
#definechHANDLE_DLGMSG(hWnd,message,fn)/
case(message):return(SetDlgMsgResult(hWnd,uMsg,/
HANDLE_##message((hWnd),(wParam),(lParam),(fn))))

下面这个是用来为窗口设置大/小图标

//Setsthedialogboxicons
inlinevoidchSETDLGICONS(HWNDhWnd,intidi)
{
SendMessage(hWnd,WM_SETICON,ICON_BIG,(LPARAM)
LoadIcon((HINSTANCE)GetWindowLongPtr(hWnd,GWLP_HINSTANCE),
MAKEINTRESOURCE(idi)));
SendMessage(hWnd,WM_SETICON,ICON_SMALL,(LPARAM)
LoadIcon((HINSTANCE)GetWindowLongPtr(hWnd,GWLP_HINSTANCE),
MAKEINTRESOURCE(idi)));
}

分享到:
评论

相关推荐

    WINDOWS核心编程_笔记合集.zip

    WINDOWS核心编程_笔记合集.zip

    windows核心编程读书笔记六.doc

    windows核心编程读书笔记六

    lindexi#lindexi#2020-04-21-Windows-核心编程笔记-Direct2D-比-GDI-快的一部分1

    但这不是说明 Direct2D 一定比 GDI 快,而是在应用程序消费在用户模式和内核模式切换的耗时这一部分是 Direct2D 更少对于一个用户线程来说,有一

    Windows程序设计笔记(1,2,3)

     Winows运转的核心是一个被称作“动态连接”的概念。通过“动态连接”功能可调用Windows提供的系统函数即API,这些函数主要包含在Kernel.dll(包含内存管理、文件I/O、任务处理API函数)、User.dll(包含用户界面...

    达内c++开发课程培训笔记代码4个月全套整理

    本人在达内培训,历经4个月整理的课程笔记1,和课程项目代码 。整理比较辛苦,分要的高,谅解下,都是全套 达内...Windows核心编程 MFC开发技术和数据库开发技术ADO DCOM/COM+分布式组件开发技术 WinSocket网络开发技术

    达内c++开发课程培训笔记3代码4个月全套整理

    本人在达内培训,历经4个月整理的课程笔记1,和课程项目代码 。整理比较辛苦,分要的高,谅解下,都是全套 达内...Windows核心编程 MFC开发技术和数据库开发技术ADO DCOM/COM+分布式组件开发技术 WinSocket网络开发技术

    达内c++开发课程培训笔记2代码4个月全套整理

    本人在达内培训,历经4个月整理的课程笔记1,和课程项目代码 。整理比较辛苦,分要的高,谅解下,都是全套 达内...Windows核心编程 MFC开发技术和数据库开发技术ADO DCOM/COM+分布式组件开发技术 WinSocket网络开发技术

    c#学习笔记.txt

    Sun就从来没有将它的Java交给过ECMA,以至于正当Microsoft尽力在Visual J++基础上拓展Java功能,并使之与Windows操作系统紧密结合在一起的时候,Sun公司对Microsoft提出了法律诉讼,控告Microsoft违反了许可证协议中...

    达内c++开发课程培训笔记5代码4个月全套整理

    本人在达内培训,历经4个月整理的课程笔记1,和课程项目代码 。整理比较辛苦,分要的高,谅解下,都是全套 达内...Windows核心编程 MFC开发技术和数据库开发技术ADO DCOM/COM+分布式组件开发技术 WinSocket网络开发技术

    Visual C#学习笔记光盘

    简介:本书由浅入深地讲解Visual C# 2005编程知识,全书内容分为6篇,共27章,第一篇介绍Visual Studio 2005开发环境和C#基础,其中包括Visual C# 2005简介,C#语言基础,面向对象编程基础,数组类和集合类,...

    Windows驱动开发技术详解

    本书是作者结合教学和科研实践经验编写而成的,不仅详细介绍了Windows内核原理,而且介绍了编程技巧和应用实例,兼顾了在校研究生和工程技术人员的实际需求,对教学、生产和科研有现实的指导意义,是一本值得推荐的...

    达内c++开发课程培训笔5代码4个月全

    本人在达内培训,历经4个月整理的课程笔记1,和课程项目代码 ,都是全套 达内 C++国际软件工程师...Windows核心编程 MFC开发技术和数据库开发技术ADO DCOM/COM+分布式组件开发技术 WinSocket网络开发技术 绝对全套

    linux学习笔记(包含Linux系统和shell编程).zip

    Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化...

    Go+学习笔记 超清版

    很难得的GO语言知识点分析文档,超级详细,本人是在走路的过程中读完第一遍的,吸引力堪比C++中的《windows核心编程》。 从基本类型到高级特性到源码分析,值得反复阅读借鉴。 只能说 it's professional, really ...

    Heynote :专为开发者设计的分块记事本,作为一个大型持久性文本缓冲区,可以用来随意书写任何内容 windows x64

    Heynote 的核心是一个大型的持久文本缓冲区,分为多个块。 创建一个新块就像按 Ctrl-Enter 一样简单, 并按 Ctrl-A 组合键 块仅选择该块的内容。 非常适合您不想意外发送的 Slack 消息,即 JSON 响应 来自您正在...

    teaching-programming-for-gis:Jupyter笔记本讲授GIS编程入门,包括Python核心概念和可用于矢量,栅格和网络数据的软件包

    该存储库包含一组Juypter笔记本,向学生介绍Python的编程核心概念以及要加载,处理,可视化和分析地理空间数据的软件包。 这些示例包括来自资源库的“。conda环境此存储库中的所有笔记本都在condaenv_geoprogv1.yml...

    Marmalade学习笔记

    Marmalade SDK是一个功能强大的跨平台工具,让开发人员可以从一个代码库中横跨多平台和设备来部署代码,Marmalade会为你解决平台之间差异问题从而减低跨平台开发的痛苦。其核心是C++ SDK,旨在为开发者提供最大的...

    学习Linux运维的个人笔记:Linux基本介绍(一)

    和Windows一样,也是一个操作系统,只不过Windows用来听歌,看东西,办公。 Linux通常服务企业与企业环境。作用:将开发好的代码运行在这个Linux的操作系统上(Linux通常使用的人群是企业,而不是个人)。 Linux运维...

    JMETER组件介绍笔记

    Windows 启动方式 bat 批量执行的脚本的方式,jmeter.bat Linux 启动方式是通过shell 脚本,linux 下面有很多后缀.sh 文件,shell 编程 jmeter.sh Jmeter.bat 在bin 目录下面 JMETER目录结构 将来性能测试过程...

    集合 - chm开发文档合一

    开发文档合一:C C++ API.chm、C函数一览.chm、MySQL5.1参考手册.chm、Qt4 学习笔记(简体).chm、Qt参考文档.chm、QT中文帮助文档.chm、Windows核心编程.chm。

Global site tag (gtag.js) - Google Analytics