随笔分类 -  Windows SDK

与Windows SDK相关的内容,包括WIN32 API的相关内容
摘要:捕获数学函数异常假如我们要用一个数学函数,比如反正弦函数asin(x),如果变元x的值是由用户提供或某个中间结果,则在调用时必须判断其取值范围是合理,是否满|x|<=1?即if(fabs(x)<=1) y=asin(x);else y=…对数函数也可作类似的处理。但是如果遇到幂函数pow(x,y)时,问题就不那么简单了。仔细分析将发现: YX负小数负整数0整数小数负小数无意义有意义有意义有意义无意义负整数无意义有意义有意义有意义无意义0无意义无意义有意义有意义有意义整数有意义有意义有意义有意义有意义小数有意义有意义有意义有意义有意义例如:pow(-1.2,-1.2)=-1.#IND 阅读全文
posted @ 2012-03-24 21:42 Atypiape 阅读(407) 评论(0) 推荐(0) 编辑
摘要:今天编译了一段程序,运行的时候崩溃了,下断点查看了下崩溃的地方,发现问题出在使用传指针方式向线程传递局部变量。问题代码大致如下:void CStrLenCheckDlg::OnOK(){ THREADINFO info; // 局部变量 info.pDlg = this; info.strFileName = m_strFileName; // 以传指针方式传递局部变量 info 给线程函数 AfxBeginThread(ThreadFunc, &info);}UINT ThreadFunc(LPVOID lpParam){ THREADINFO* p... 阅读全文
posted @ 2012-02-03 11:28 Atypiape 阅读(4564) 评论(0) 推荐(2) 编辑
摘要:用vc++写console程序时,整天对着黑纸白字的屏幕,感觉很郁闷吧?很多人想用CONIO.H/GRAPHICS.H中的一些函数来实现,却发现VC++根本没有这些头文件。当然了CONIO.H/GRAPHICS.H是BORLAND TC/BC专有的头文件,所以vc++中根本没有这些文件。把这两个头文件COPY过来,然后用??答案当然是否定的。其实VC++中也有相关的函数来实现console彩色文本及背景的显示。下面我们就看看VC++如何实现彩色文本。 在vc++用API函数GetStdHandle()和SetConsoleTextAttribute()来实现彩色背景及彩色文本。下面说一下... 阅读全文
posted @ 2012-01-19 14:11 Atypiape 阅读(595) 评论(0) 推荐(0) 编辑
摘要:问题:mfcs90d.lib(xxx.obj) : error LNK2005: DllMain@12 already defined in MSVCRTD.lib(xxx.obj)原因:mfcs90d.lib和MSVCRTD.lib的链接顺序不正确。解决方法:项目属性->配置属性->连接器->输入1.在忽略特定库里加入 mfcs90d.lib;MSVCRTD.lib2.在附加依赖库项里加入 mfcs90d.lib MSVCRTD.lib 3.OK 阅读全文
posted @ 2012-01-11 16:39 Atypiape 阅读(2278) 评论(0) 推荐(0) 编辑
摘要:问题:从某DLL中导出一个接口函数GetDirFileIdSet用于获取目录下所有文件的ID集合。函数声明如下,该函数传入一个std::set<UINT>类对象:void GetDirFileIdSet(std::set<UINT>& rFileIdSet);当在VS2008中编译的“数据文件编辑器”加载了在VC6中编译的DLL,并调用到GetDirFileIdSet时发生了崩溃。原因:在不同的DLL或EXE中通过指针或引用操作另一个DLL或EXE中的STL类对象时,会遇到严重的程序错误,包括数据错乱或丢失。标准C++库的多数类直接或间接的使用了静态数据成员。由 阅读全文
posted @ 2012-01-10 09:43 Atypiape 阅读(1848) 评论(0) 推荐(0) 编辑
摘要:方法一,使用ConvertBSTRToString。例如: #include #pragma comment(lib, "comsupp.lib") int _tmain(int argc, _TCHAR* argv[]){ BSTR bstrText = ::SysAllocString(L"Test"); char* lpszText2 = _com_util::ConvertBSTRToString(bstrText); SysFreeString(bstrText); // 用完释放 delete[] lpszText2; return 0; } 阅读全文
posted @ 2012-01-09 18:49 Atypiape 阅读(598) 评论(3) 推荐(0) 编辑
摘要:FireFox采用Gecko内核,不同于IE内核,不能直接通过HWND像处理IE内核那样获取IHTMLDocument2。幸好Mozilla为Gecko做了一层映射,使得Gecko支持MSAA接口,可以通过HWND间接获得IHTMLDocument2(实际上是ISimpleDOMDocument,和IHTMLDocument2同样继承自IUnknown)。网上有篇文章《基于IE和Gecko内核的网页内容获取与分析研究》,可惜这篇文章中提到的方法只对旧版的FireFox有效。搜了好久都没发现有关新版本的中文资料,许多文章都是针对FireFox3.x,并且不太靠谱。无耐之下只得研究Mozilla官 阅读全文
posted @ 2012-01-09 18:18 Atypiape 阅读(7015) 评论(3) 推荐(0) 编辑
摘要:本博文的内容基本取自“微软帮助和支持”上的一篇文章:《How to get IHTMLDocument2 from HWND》,但是里面的代码有个小错误会使获得的IHTMLDocument2无法使用,可能是版本问题,这里先提出修改方法:把代码中的IID_IHTMLDocument改为IID_IHTMLDocument2。注意:该方法只对采用IE内核(Trident)的浏览器有效,包括360安全浏览器、腾讯TT、世界之窗、绿色浏览器等。下面先给出示例代码,对《How to get IHTMLDocument2 from HWND》中的代码除了前面提到的修改,就不再做其他改动了。#include 阅读全文
posted @ 2012-01-09 11:46 Atypiape 阅读(2679) 评论(0) 推荐(0) 编辑
摘要:D3D设备初始化以后,双精度浮点运算的结果出现了不同。 在FPU中,存在着三种运算精度:single precision(24bits),double precision(53bits),double extended precision(64bits)。而默认精度是53bits的double precision,也就是双精度浮点。D3D出于性能考虑,会将fpu的计算精度改为单精度。因为fpu线程相关的特性,渲染线程中所有的浮点运算都会保持与D3D一致。这种转变体现在fpu的控制寄存器(CTRL)的变化上,CTRL寄存器的值从007F变成027F。 RC字段,这个字段控制浮点转整型的转换方式, 阅读全文
posted @ 2011-12-13 09:11 Atypiape 阅读(4448) 评论(0) 推荐(0) 编辑
摘要:用VS2010建了一个默认的C++应用程序,编译后出现如下错误。1>------ 已启动生成: 项目: Test, 配置: Debug Win32 ------1> stdafx.cpp1>c:/program files/microsoft sdks/windows/v7.0a/include/objidl.h(11280): error C2061: 语法错误: 标识符“__RPC__out_xcount_part”1>c:/program files/microsoft sdks/windows/v7.0a/include/objidl.h(11281): err 阅读全文
posted @ 2011-11-16 14:55 Atypiape 阅读(2200) 评论(0) 推荐(0) 编辑
摘要:虽然是大公司的产品,QQ它还是会在我们的折腾下崩溃的,但是它总是崩溃的很优雅,还要弹出自己的对话框来结束。并且发送报告,去掉了系统默认的发送报告的对话框。所以一拍脑袋,想让自己的程序崩溃的体面一点。自己想了大概的思路,觉得可以用一个进程来监控目标程序。的确也可以拿到了目标程序崩溃的信息,知道它什么时候崩溃的,也可以做额外的操作,但是这样是没办法把默认的发送错误的对话框去掉的。然后又有人说是不是采用了类似钩子的方法把这个东西在哪里勾掉了。最后网上查了一番,发现SetUnhandledExceptionFilter这个函数解决了一切。总结了下搜到的资料,这个函数的返回值有三种情况:EXCEPTIO 阅读全文
posted @ 2011-10-09 12:14 Atypiape 阅读(22185) 评论(4) 推荐(0) 编辑
摘要:1 案例描述作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭。请与您的供应商联系。呵呵,这句微软的“名言”,恐怕是程序员最怕见也最常见的东西了。在一个大型软件的测试过程中,初期出现程序崩溃似乎成了不可避免的事。其实测试中出现程序崩溃并不可怕,反而是测试的成功。作为开发的我们更需要关心的是程序中的哪个函数或哪一行导致了系统崩溃,这样才能有针对性的进行改正。本文描述了自己总结的几种定位崩溃的办法。2 案例分析以下是几种常见的崩溃现象及对应的处理办法:1. 对于Release版本必现的崩溃且在Debug版本上也崩溃的 阅读全文
posted @ 2011-08-19 10:44 Atypiape 阅读(6284) 评论(1) 推荐(0) 编辑
摘要:一般我们在全局作用域定义全局变量来进行模块间(函数之间、类之间)的数据交互。可是在Lib里干这种事情得当心了,如果这个Lib被两个或两个以上的DLL(包括EXE)链接,并且他们都调用了Lib中同一个全局变量,那么灾难很可能发生了。因为对于DLL而言,链接Lib只是得到了Lib的一份拷贝,也就是说,每个DLL中得到的Lib的拷贝都是独立的,相互之间无联系的。因此,这个“同一个”全局变量,其实在每个DLL中都已经单独存在了,已经不是唯一的“同一个”,而是每个DLL各有一个。所以,这些DLL是不能通过Lib中的全局变量进行数据交互的,他们各不相干。 阅读全文
posted @ 2011-08-15 16:33 Atypiape 阅读(1159) 评论(0) 推荐(0) 编辑
摘要:编辑器加载中...编译时出现如下问题:c:\program files\microsoft\v6.0\include\winnt.h(236) : error C2146: syntax error : missing ';' before identifier 'PVOID64'c:\program files\microsoft\v6.0\include\winnt.h(236) : error C2146: syntax error : missing ';' before identifier 'Buffer'问题起因分析 阅读全文
posted @ 2011-07-20 12:16 Atypiape 阅读(4601) 评论(0) 推荐(0) 编辑
摘要:直接贴代码,这段代码很好用,记录下来. PVOID lpMsgBuf; if (FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | // 自动分配缓存 FORMAT_MESSAGE_FROM_SYSTEM | // 系统消息 FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), // 错误代码 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 默认语言 (LPTSTR)&lpMsgBuf, 0, NULL)) { // TODO: 添加你的处理代码. 阅读全文
posted @ 2011-06-30 16:02 Atypiape 阅读(868) 评论(0) 推荐(0) 编辑
摘要:本文译自codeproject.com,原文链接与工具及其源代码下载点击这里。----------------------------------- 导引:WINDOWSX.H头文件简化Win32 SDK编程许多的新手或者调试程序员在编写C/C++的Windows API程序时都要面对像意大利面一样的switch...case代码块。当你需要加入一个消息处理到你的窗口处理过程中时,在些代码块中查找例如:WM_COMMAND或WM_CHAR,是相当让人恐惧的事情。早在Windows 3.1时代的Windows软件开发工具包和C/C++7.0编译器就附带一个包含一千多行Windows处理代码的头文 阅读全文
posted @ 2011-06-29 15:26 Atypiape 阅读(462) 评论(0) 推荐(0) 编辑
摘要:Win32应用中的回调函数 WndProc 用于接收 Windows 向应用程序直接发送的消息,以及响应消息。大多情况下,我们这样编写代码:LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { int cxClient, cyClient; PAINTSTRUCT ps; HDC hdc; switch( message ) { case WM_SIZE: cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); break; cas 阅读全文
posted @ 2011-06-29 15:21 Atypiape 阅读(703) 评论(0) 推荐(0) 编辑
摘要:下面是对话框程序框架代码://// resource.h//// 控件 ID.//#define IDD_MAIN 100#define IDC_OK 101#define IDC_CANCEL 102//// main.h//#ifndef _MAIN_H#define _MAIN_H#include <windows.h>//// 自定义函数前置声明.//BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);BOOL Main_OnInitDialog(HWND hwnd, HWND 阅读全文
posted @ 2011-06-28 17:34 Atypiape 阅读(2467) 评论(0) 推荐(1) 编辑
摘要:int wsprintf( LPTSTR lpOut, // 输出缓冲区,最大为1024字节 LPCTSTR lpFmt, // 格式字符串 ...); // 需输出的参数,多少个参数都可以的,最起码前两个必须有.函数作用: 函数 wsprintf() 将一系列的字符和数值输入到缓冲区。 输出缓冲区里的的值取决于格式说明符(即"%")。 如果写入的是文字,此函数给写入的文字的末尾追加一个 '\0'。 函数的返回值是写入的长度,但不包括最后的 '\0'。我们在接触C语言的时候还接触过一个 sprintf() 的函数,用法和 wsprintf() 阅读全文
posted @ 2011-06-28 17:04 Atypiape 阅读(1487) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示