摘要: 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 阅读(281) 评论(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 阅读(1075) 评论(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 阅读(351) 评论(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 阅读(328) 评论(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 阅读(934) 评论(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 阅读(391) 评论(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 阅读(765) 评论(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 阅读(3899) 评论(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 阅读(230) 评论(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 阅读(535) 评论(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 阅读(1370) 评论(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 阅读(506) 评论(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 阅读(316) 评论(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 阅读(3535) 评论(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 阅读(765) 评论(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 阅读(638) 评论(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 阅读(2069) 评论(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 阅读(177) 评论(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 阅读(1164) 评论(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 阅读(190) 评论(0) 推荐(0) 编辑