摘要:
stdafx.h、stdafx.cpp是干什么用的?为什么我的每一个cpp文件都必须包含stdafx.h? Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。 为避免这种浪费,AppWizard和Visual C++编译程序一起进行工作,如下所示: ◎AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要的MFC include文件。且这一文件可以随被选择的选项而变化。 ◎AppWizard然后就建立s 阅读全文
posted @ 2011-04-10 14:50
super119
阅读(300)
评论(0)
推荐(0)
摘要:
STL container classes thread safe(Microsoft C++ implementation)? Answer from MSDN: The container classes are vector, deque, list, queue, stack, priority_queue, valarray, map, hash_map, multimap, hash_multimap, set, hash_set, multiset, hash_multiset, basic_string, and bitset. A single object is threa 阅读全文
posted @ 2011-04-10 14:49
super119
阅读(1087)
评论(0)
推荐(0)
摘要:
也就是如何在UNICODE编程下的控制台显示中文字符,使用wcout,_tprintf输出中文的时候,屏幕上什么都没输出-空白。很郁闷。后来在网上搜了一下原来是要设置一下本地属性。 Code: Select all#include <locale.h >int _tmain(int argc, _TCHAR* argv[]){ //****** 设置本地属性********* setlocale(LC_ALL,"CHS"); _tprintf( _T("中文\n"); wcout<< _T(“中文")<<en 阅读全文
posted @ 2011-04-10 14:49
super119
阅读(364)
评论(0)
推荐(0)
摘要:
通过windows via C/C++,知道了kernel object,也知道了用完了kernel object之后,要调用CloseHandle。这个函数的作用就是将该kernel object的usage count - 1,当这个count为0的时候,该kernel object会变成signal状态/销毁。 kernel object是不属于process的,是属于windows内核的。process只有一个kernel object handle table,用来存放所有的kernel object handle。所以,多个process可以同时使用一个kernel object 阅读全文
posted @ 2011-04-10 14:49
super119
阅读(335)
评论(0)
推荐(0)
摘要:
strsafe.h不能在windows.h, tchar.h, 包括很多C++的头文件,比如<map>,之前被include。否则编译的时候就会报windows.h, tchar.h, winbase.h...这些头文件中定义错误,或是重复定义。 所以,安全的做法是: 1. 在cpp文件中include <strsafe.h>,因为一般要include这个文件,都是要使用StringCch*函数,这些函数的使用一般都是在cpp中。 2. 在include的时候,要让strsafe.h在上述那些头文件之后被include在网上搜到的资料显示,strsafe.h头文件中会把 阅读全文
posted @ 2011-04-10 14:48
super119
阅读(976)
评论(0)
推荐(0)
摘要:
这个是FAT32文件系统分区的缘故,一般有如下症状; 第一次Build 的时候从不出问题,在以后重新Build 的时候,可能随机地出现问题。可能你Build间隔的时间足够长,也不会出问题。 微软也知道这个bug,但是看来没有打算完全解决它的意向,倒是在项目属性中有个选项,让你在FAT32 下也能正常工作。具体如何解决,是这样做的: 如果是把项目放在FAT32分区,那么这样操作: 英文版roject Properties -> Manifest Tool-> Use FAT32 Work-around -->Yes 中文版:项目-->项目属性-->配置属性--> 阅读全文
posted @ 2011-04-10 14:48
super119
阅读(409)
评论(0)
推荐(0)
摘要:
MSDN中说,__FILE__宏展开后是表示源文件的名字。如果在编译选项中加入/FC,那么,出来的源文件的名字就包含全路径,否则,名字就包含相对路径。很显然,我们希望名字包含相对路径,全路径太长,看起来太累。所以,在visual studio中,项目属性设置中,最后的编译命令行中我check了一下,没有发现/FC。但是奇怪的是程序运行的时候,发现__FILE__出来的源文件照样包含全路径。google 一下,发现了原因:/ZI option如果被指定,那么,/FC就会被隐式的指定。/ZI表示生成program database(pdb文件),这个文件在Debug的时候有用,包含了程序的symb 阅读全文
posted @ 2011-04-10 14:47
super119
阅读(840)
评论(0)
推荐(0)
摘要:
比如有这么一个map:map<TCHAR *, TCHAR *> map1;这样当往map1中插入数据的时候,key是一个指针。在SDClient中,我们将文本资源读入一个map,然后将来使用literal的文本key字符串来将value取出,从而达到国际化的目的。但是这里有一个问题就是,由于key是一个指针,所以当我们尝试用literal的TCHAR *来取出value时,发现value取不出来。这是因为插入数据时候的TCHAR *和我们取的时候的TCHAR *,两个指针的地址不一样。那 应该怎么办呢?我们的目的其实是比较key指向的字符串,而不是key本身。但是查看了map的定 阅读全文
posted @ 2011-04-10 14:47
super119
阅读(3987)
评论(0)
推荐(0)
摘要:
SDClient中,使用HeapAlloc分配了一块内存,用来存放从text resource file中读出的内容。然后接着会使用_tcstok_s来使用\n作为token来split这个大字符串。那 为什么在分配内存的时候,要多分配一个字符的内存呢?很简单,这个字符要存放一个\0。因为text resource file文件的最后没有\0,所以,当把text resource file的内容全部读出来之后,要手动设置最后一个字符为\0,这样,_tcstok_s来split到最后的时候才能正确工作。否则,由于最后一个 token后面既没有\n,也没有\0,那么,_tcstok_s就会读到bu 阅读全文
posted @ 2011-04-10 14:47
super119
阅读(241)
评论(0)
推荐(0)
摘要:
Windows中内存page的copy on write属性非常有用。他保证了如果一个应用程序的多个实例被启动,或是一个dll被多个启动的应用程序同时使用时,全局和静态变量不会受到污染。大致原理就是:应 用程序启动多个实例,这多个进程的地址空间中,应用程序部分地址空间对应到physical storage上,都是一份(memory map的)。所以,如果一个实例尝试修改一个全局或静态变量时,如果没有copy-on-write,这个变量就会被污染。所以windows在使用 memory map装载应用程序时,对全局和静态变量识别,然后给存放这些变量的page设上copy-on-write属性,这 阅读全文
posted @ 2011-04-10 14:46
super119
阅读(558)
评论(0)
推荐(0)
摘要:
windows下的Unicode是UTF-16,每个字都用两个字节来表示。编程的时候,通过TEXT宏,以及在项目中定义Unicode, _Unicode变量,就可以保证整个项目都是在Unicode下工作。现在在将字符串写入文件的时候,发生了一些问题。写文件用的是WriteFile函数,字符串本身都是UTF-16的,写入文件后发现用vim和记事本打开都无法正确显示。用16进制的方式查看,每个字都是对的,都是2个字节,如果是英文字母,第二个字节就是00。google 了一下,发现了答案。要在文件开头写入0xfffe,这是Unicode file的identifier,windows下的记事本和写字 阅读全文
posted @ 2011-04-10 14:46
super119
阅读(1491)
评论(0)
推荐(0)
摘要:
SDService和SDClient的通信,一开始想到的就是使用socket的方式。但后来想了一下,windows下进程间通信的方法很多,其他方法是否可以呢?socket的通信方式开销比较大阿。于是:1. 用Mutex+Memory map file(unnamed). 一开始SDService创建一个mutex,然后wait直到SDClient signal这个mutex。然后SDService就从memory map file中读取command,将结果数据填写入memory map file,再signal另外一个mutex通知SDClient。SDClient最终从memory map 阅读全文
posted @ 2011-04-10 14:45
super119
阅读(546)
评论(0)
推荐(0)
摘要:
在看windows via C/C++的时候,经常看到module, instance, image这样的字眼。其实这是windows中的一些术语,module就相当于exe, dll文件。在进程的地址空间中,exe, dll都当作module被load。所 以windows中的数据结构HMODULE和HINSTANCE是一样一样的,他们的值都是一个地址,就是该module的base address。这也就是为什么像LoadIcon/LoadImage这些函数都需要一个HMODULE的参数一样,他们需要这个参数去这个 module的地址开始去将资源读取出来。exe和dll一般都是通过memor 阅读全文
posted @ 2011-04-10 14:45
super119
阅读(341)
评论(0)
推荐(0)
摘要:
代码都在下面了,目前这个版本实现的功能还非常的少,能实现的有:1. GET方法。给定一个URL(可以带中文),返回http的响应数据,包括文本和二进制数据2. 支持代理服务器,需要用户预先设定好proxy server ip, port, username, password.不支持的有:1. POST2. 查询http响应的header。3. 将返回的文本数据重新编码,变成UTF-16。这需要首先从header取出http server响应的数据是什么编码的,然后就可以使用windows的MultiByteToWideChar来进行转换。这里总结几点开发过程中的注意点:1. MSDN上的资料 阅读全文
posted @ 2011-04-10 14:44
super119
阅读(3653)
评论(0)
推荐(0)
摘要:
最后面有完整的源代码,在Schedule Download项目中使用。这里描述几个关键点:1. 不能参考网上的文章,说的都很片面而且版本过老。请参考MSDN:Win32 and COM development -> Networking -> Network communication -> Routing and Remove Access Service -> SDK Document -> Routing and Remote Access Service下的内容。事实上,对于win32的编程开发,第一参考资料始终是MSDN,如果MSDN上的内容有些过于浅显 阅读全文
posted @ 2011-04-10 14:44
super119
阅读(782)
评论(0)
推荐(0)
摘要:
1. 创建windows console应用程序。vs自带的windows service模板创建出来的项目看不懂。2. _tmain函数这样写:Code: Select all/* Main routine that starts the service control dispatcher */VOID _tmain (int argc, LPTSTR argv[]){ SERVICE_TABLE_ENTRY DispatchTable[] = { { ServiceName, ServiceMain }, { NULL, NULL } }; StartServiceCtrlDispatc 阅读全文
posted @ 2011-04-10 14:43
super119
阅读(651)
评论(0)
推荐(0)
摘要:
做ScheduleDownload,要做一个logger,这个logger的大致结构如下:Code: Select all#ifdef _DEBUG#define LOGGER(log_level, filename, line, format, ...) \ logger_action(log_level, filename, line, format, __VA_ARGS__);#else#define LOGGER#endif/* * Log the strings. filename should be __FILE__ and line should be __LINE__ */vo 阅读全文
posted @ 2011-04-10 14:43
super119
阅读(2167)
评论(0)
推荐(0)
摘要:
关于new、delete和堆的一些理解 先看以下的两个简单的程序: 第一: //////////Visula C++ 6.0环境 #include<iostream.h> void main() { int a=3; int *p=new int; p=&a; cout<<*p<<endl; delete p; /////////有错误 } 第二: //////////Visual C++ 6.0环境 #include<iostream.h> void main() { int a=3; int *p=new int; *p=a; cou 阅读全文
posted @ 2011-04-10 14:36
super119
阅读(192)
评论(0)
推荐(0)
摘要:
1、首先需要include一个文件,如下: #include <tlhelp32.h> 2、参看以下代码: Code: Select all //遍历系统所有进程,杀死联众世界HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);PROCESSENTRY32 *info = new PROCESSENTRY32;info->dwSize = sizeof(PROCESSENTRY32); if(Process32First(handle,info)){ if(GetLastError()==ERROR_ 阅读全文
posted @ 2011-04-10 14:35
super119
阅读(202)
评论(0)
推荐(0)
摘要:
判断一个字符串是否是一个整型数或浮点数 两个函数:isNum-判断是否是一个整型数 isFloat-判断是否是一个浮点数 代码: Code: Select allbool CUtility::isNum(CString csInput){//将字符串一个一个字符拆出来判断是否是数字char cTemp;int nStringLength = csInput.GetLength();bool bReturnValue = true;for (int nLoopindex = 0; nLoopindex < nStringLength; nLoopindex++){ //将字符一个一个取出来 阅读全文
posted @ 2011-04-10 14:35
super119
阅读(1276)
评论(0)
推荐(0)
摘要:
透明位图的显示 包含透明色的位图的绘制方法有多种,最简单的方法是调用现成的函数: TransparentBlt,也可以通过自己的代码实现类似TransparentBlt的功能,实现过程也有两种形式,一种是事先做一张掩码位图,另 一种是动态生成掩码位图。本文将介绍动态生成掩码位图绘制具有透明区域位图的方法。 一、TransparentBlt 函数的使用 TransparentBlt 函数在Windows98/Windows2000以上版本运行,系统中需要包含 Msimg32.dll,使用时可以链接 Msimg32.lib。 Windows98下的TransparentBlt会产生资源泄漏,所以不 阅读全文
posted @ 2011-04-10 14:34
super119
阅读(312)
评论(0)
推荐(0)
摘要:
对话框中屏蔽回车键和ESC键 基于对话框的应用程序中,对于回车键和ESC键,在工程建立的时候就已经有了响应函数,分别是: void CXXXDialog::OnOK();和void CXXXDialog::OnCancel() 这两个函数中,都只有一句代码,分别是CDialog::OnOK();和CDialog::OnCancel 这会导致一个问题:按下回车键和ESC键之后会令对话框析构并消失,所不同的是按下回车键后DoModal 返回的是IDOK,按下ESC键盘之后DoModal返回的是IDCANCEL 但是大部分时候我们并不希望按下回车键和ESC键之后使对话框退出,所以应该屏蔽掉这两种情况 阅读全文
posted @ 2011-04-10 14:34
super119
阅读(572)
评论(0)
推荐(0)
摘要:
要实现对Excel文件的读写,非常简单。按照如下步骤操作: 1、将Excel9.h和Excel9.cpp两个文件放入到工程中。 2、使用其中的对象就可以对其进行控制了,示例代码如下: //申明使用EXCEL的变量 _Application ExcelApp; Workbooks wbsMyBooks; _Workbook wbMyBook; Worksheets wssMysheets; _Worksheet wsMysheet; Range rgMyRge; //创建Excel 2000服务器(启动Excel) if (!ExcelApp.CreateDispatch("Excel 阅读全文
posted @ 2011-04-10 14:33
super119
阅读(524)
评论(0)
推荐(0)
摘要:
/Files/super119/20048722200696_103.rar 阅读全文
posted @ 2011-04-10 14:32
super119
阅读(209)
评论(0)
推荐(0)
摘要:
1、在command line下开发。一些简单的C++程序,没必要启动整个IDE,使用VC7.1的编译器在命令行下即可顺利的工作。要在command line下工作,必须做以下这些事情:(1)打开cmd之后,运行vsvars32.bat(位于$prefix/common7/tools目录下) (2)运行cl <sourcefilename>即可。在cl编译的过程中,会有一些warning出现,如C++ Exception的问题,默认情况下,cl打开了exception使用的开关,如果代码中没用的话,会出warning,这次可以按照cl输出信息的 提示,加上/EHsc开关,即cl / 阅读全文
posted @ 2011-04-10 14:31
super119
阅读(264)
评论(0)
推荐(0)
摘要:
无论是SDI、MDI还是基于Dialog的程序,主类都是继承自CWinApp的。在CWinApp中,有命令行参数的成员变量 - m_lpCmdLine m_lpCmdLine 是一个LPTSTR,也就是一个32位的字符串,也就是整个命令行参数(不带应用程序可执行文件的名字)。举例来说,如果应用程序是Hello,那么运行 Hello I am John,此时的m_lpCmdLine就是I am John,得到了这个命令行参数之后,应用程序就可以自己再展开分析了。 最后附上一段MSDN中有关LPTSTR的解说: CWinApp::m_lpCmdLine Remarks Corresponds to 阅读全文
posted @ 2011-04-10 14:31
super119
阅读(2267)
评论(0)
推荐(0)
摘要:
chapter 1: 1、目前对ISO98标准的C++支持的较好的编译器有gcc和VC7.1(Visual Studio .NET 2003) 2、由于各平台和编译器的不同实现,导致了C++头文件的扩展名(suffix)不统一,所以目前的C++标准中,头文件不带任何后缀,如#include <iostream>,不再是#include <iostream.h>等类似的写法 3、目前的C++标准,要调用任何库,必须使用namespace,如using namespace std就是使用C++的标准库,不带namespace的任何库调用(包括第三方的库),编译器将报告不认识 阅读全文
posted @ 2011-04-10 14:30
super119
阅读(253)
评论(0)
推荐(0)
摘要:
windows的文档工作还是非常不错的,所有的信息都可以从windows DDK主页和DDK自带的帮助文档中获得,本文只是一个总结。 今天开始正式接触DDK,首先来到DDK主页,有如下信息有用: 1. 选择安装什么版本的DDK。目前DDK的推荐版本是Windows 2003 Server SP1 DDK,这个版本的DDK,windows xp,windows xp sp1,win2000,windows 2003都可以使用。至于windows xp sp2,也可以用。具体内容看微软DDK主页上的"Which DDK and Test Kit to use"一文。 2. DD 阅读全文
posted @ 2011-04-10 14:29
super119
阅读(4019)
评论(0)
推荐(0)
摘要:
Programming windows 5th Edition Chapter 2 Unicode Introduction 1. 首先要在这里说明的是,可能是本书成文的较早(1998年成文),所以,本章中对Unicode的讲解可能有点错误,因为之前我看过的Joel写的 Unicode的文章和这里的说法就不一样。比如本文说Unicode就是使用2个字节来表示一个字符的字符集,用2个字节表示一个字符,最多就只可能表 示65536个字符,这显然是有问题的。有可能,本文所讲的Unicode的东西在Windows里面就是这样的(比如至少在winnt中是这样的),但 是应该不能放之四海皆准。从我JAVA 阅读全文
posted @ 2011-04-10 14:28
super119
阅读(256)
评论(0)
推荐(0)
摘要:
Programming Windows 5th Edition - Chapter 1 Getting Started 1. 第一个windows程序,如下: Code: Select all/*------------------------------------------------------------ HelloMsg.cpp -- Display "Hello, Windows!" in a message box Eric Zhang 2007--------------------------------------------------------- 阅读全文
posted @ 2011-04-10 14:28
super119
阅读(302)
评论(0)
推荐(0)
摘要:
Programming Windows 5th Edition Chapter 4 输出文字 1. 本章更进一步的阐述显示文字的注意点,包括如何根据字体的大小来计算输出坐标,在不同的情况下如何取得设备句柄并开始绘图,如何在程序中加入滚动条等。 2. 首先需要介绍的很重要,那就是什么情况下windows会发送WM_PAINT消息给我们的程序,如下: (1) 以下情况发生一种就一定会发送WM_PAINT消息:在使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。使用者改变窗口的大小(如果窗口类别样式有着CS_HREDRAW和CS_VREDRAW位旗标的设定)。程序使用ScrollWindo 阅读全文
posted @ 2011-04-10 14:27
super119
阅读(266)
评论(0)
推荐(0)
摘要:
Programming windows 5th Edition Chapter 3 窗口和消息 1. 本章讲述了一个最简单的带窗口的windows程序HelloWin。 2. 窗口类别。在创建窗口(调用CreateWindow)之前,需要先注册窗口类别(RegisterClass)。所谓窗口类别表示的是窗口大体应该遵循 的共性,比如按钮窗口,他们的类别是一样的,比如光标,背景,最关键的是消息处理函数,这些东西都应该是一样的,至于每个按钮窗口不同的地方,比如大小, 位置等,放在CreateWindow中由我们来定义。所以窗口类别就是抽象了窗口的一些共性的东西,多个窗口在CreateWindow的 阅读全文
posted @ 2011-04-10 14:27
super119
阅读(209)
评论(0)
推荐(0)
摘要:
Network Programming for Microsoft Windows, 2nd Edition Chapter 1 Winsock介绍 1. Winsock是微软做的网络通讯库,以前winsock是1.1版本,现在winsock有了winsock 2.2版本,winsock2版本变动比较大,做了很多工作。Winsock的接口设计在很大程度上参考了UNIX平台上的BSD的socket实现,在 Winsock 2里面接口做了一些变动,目的是做到winsock真正和协议无关,是一个通用的开发平台。 2. 本章介绍了TCP和UPD的两个最简单的winsock例子,实际上,这样的例子对于一 阅读全文
posted @ 2011-04-10 14:26
super119
阅读(1086)
评论(0)
推荐(0)
摘要:
该程序分成Client和Server两部分,在一个solution中,两个Project client会给server分别发送一个ASCII的字符串,一个含有中文字符的Unicode字符串,最后发一个让server终结的字符串 在该例子中应用了winsock 1的函数,此外在Unicode处理上,得益于看了Programming windows的Unicode一章。特别是Unicode的处理上,通过这个例子,对windows中对Unicode的处理有了实战认识。 /Files/super119/UDPTest.rar 阅读全文
posted @ 2011-04-10 14:21
super119
阅读(252)
评论(0)
推荐(0)
摘要:
Windows网络编程 2nd Edition 第二章 Winsock的设计 Notes 1. System Architecture. 首先看附件1中的架构图。在ws2_32.dll下,分成了很多层,各自管各自的事情。在Winsock中,所谓的Provider指的是针对不同的协议 实现的包装,比如TCP有TCP的Provider,根据我们的winsock代码在创建socket的时候指定需要的协议来选择不同的Provider 为我们的程序提供服务。在图中可以看到,Provider又分成base和layered两种。我的理解是base provider就是最基本的针对协议的实现,如上面所说;la 阅读全文
posted @ 2011-04-10 14:14
super119
阅读(368)
评论(0)
推荐(0)
摘要:
1. 本章主要讲述IP方面的东西,解释了IPv4, IPv6。在后面的两个章节中,讲述了地址和名字的解析(Address and Name Resolution),以及如何书写一个IPv4, IPv6自适应的程序。 2. 简单摘录一下IPv4一节的内容: (1) 可以拿来做私有地址的IP有: 10.0.0.0?10.255.255.255 (10.0.0.0/8) 172.16.0.0?172.31.255.255 (172.16.0.0/12) 192.168.0.0?192.168.255.255 (192.168.0.0/16) 在书写IP段的时候,经常有/16, /24这样的写法。这表 阅读全文
posted @ 2011-04-10 14:13
super119
阅读(758)
评论(0)
推荐(0)
摘要:
之前在linux下做过一个测试:写一个so,该so中有一个全局变量。so中的代码在运行时会修改该全局变量的值。然后,有多个程序都需要该so,而且这些应用程序都启动了。此时,很显然so只被加载了一份,那么,当这么多程序在运行调用该so时,该so中的全局变量的值会被覆盖来覆盖去么?答案是不会。这是测试的答案。现在知道原理了,尽管这是windows via C/C++中解释的windows的做法,但是我想linux也是这么类似处理的。windows 使用memory map来加载exe和dll。当一个exe/dll有多个instance要启动时,实际在windows paging file(包括RA 阅读全文
posted @ 2011-04-10 14:12
super119
阅读(8420)
评论(1)
推荐(0)
摘要:
1. 本文讲述WIN32下的calling convention,也就是__cdecl, __stdcall, __fastcall这些编译器指示代码。本文所有的内容都是针对WIN32的,准确点说,是针对windows的C/C++编译器的。UNIX /Linux下基于GNU编译器的,就没有这个东西(可能是就一种calling convention吧),不过GNU编译器也有一个有趣的编译指令-__attribute__,有兴趣的可以参考Linux版中的“Using GNU C __attribute__”一文。 2. 所谓calling convention(呼叫约定)其实是我们代码中对编译器行 阅读全文
posted @ 2011-04-10 14:10
super119
阅读(2311)
评论(0)
推荐(1)
摘要:
Ubuntu 10.10安装了就OK,但是10.04不行,只找到这个解决办法:sudo modprobe -r psmouse接上鼠标之后,执行上面的命令,disable touchpad 阅读全文
posted @ 2011-04-10 13:54
super119
阅读(429)
评论(0)
推荐(0)

浙公网安备 33010602011771号