首页 › Category Archives › Visual Studio

简单方法解决Vista/Win7/Win10无法接收WM_DROPFILES问题

今天真给这WM_DROPFILES郁闷了下,程序本来运行的好好的,后来改为以管理员身份运行后愣是没反应。没办法,程序必须要有一定的权限才能正常工作,偶菜鸟只能问人找资料了。

在MSDN上翻到了“Understanding and Working in Protected Mode Internet Explorer”,知道了Vista(当然包括Win7)introduced the UIPI which does not allow low right process to send message to the high right processes, 就不让你低权限的给高权限的发消息,~
里面有“Allowing Drag and Drop Operations in your Application”,可是,我按照去做了,往注册表加了那些东西,还是没反应,那个郁闷,囧~
再后来,Google到了CSDN,哈,还是那的答案给我解决了!简单~
加上
ChangeWindowMessageFilter(0x0049, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
其中#define WM_COPYGLOBALDATA 0x0049,说是DDK里面的头文件有~
继续阅读 »

内存中常见异常值的解释(比如0xcccccccc、0xcdcdcdcd和 0xfeeefeee 异常值)

* 0xcccccccc : Used by Microsoft’s C++ debugging runtime library to mark uninitialised stack memory
* 0xcdcdcdcd : Used by Microsoft’s C++ debugging runtime library to mark uninitialised heap memory
* 0xfeeefeee : Used by Microsoft’s HeapFree() to mark freed heap memory
* 0xabababab : Used by Microsoft’s HeapAlloc() to mark “no man’s land” guard bytes after allocated heap memory
* 0xabadcafe : A startup to this value to initialize all free memory to catch errant pointers
* 0xbaadf00d : Used by Microsoft’s LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory
* 0xbadcab1e : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger
* 0xbeefcace : Used by Microsoft .NET as a magic number in resource files
继续阅读 »

最简单的TCP网络封包解包

TCP为什么需要进行封包解包?
        TCP采用字节流的方式,即以字节为单位传输字节序列。那么,我们recv到的就是一串毫无规则的字节流。如果要让这无规则的字节流有规则,那么,就需要我们去定义一个规则。那便是所谓的“封包规则”。

封包结构是怎么样的?
        封包就像是信,信是由:信封、信内容。两部分组成。而网络封包也是由两部分组成:包头、数据。包头域是定长的,数据域是不定长的。包头必然包含两个信息:操作码、包长度。包头可能还包含别的信息,这个呢就要视乎情况去定了。操作码是该网络数据包的标识符,这就和UI里面的事件ID什么的差不多。其中,操作码有的只有一级,有的则有两级甚至多级操作码,这个的设计也要看情况去了,不过,这些底层的东西,定好了,基本就不能动了,就像房子都砌起来了,再去动地基,那就欧也了。 继续阅读 »

cmake管理visual studio无法显示头文件解决方法

原因

我们的跨平台项目使用cmake来管理的,但是windows下的小伙伴发现在visual studio上头文件没有加载进来,于是手工加载,事情过去了。然后,有一天我修改了CMakeLists.txt文件,visual studio居然自动去重新生成了项目,然后头文件就没有了。哭吧~~~~

解决方法

source_group可以将文件分目录来显示在IDE中。
所以,修改了一下base.cmake文件让所有的项目都能检索出头文件并显示在include文件夹中。

重新生成windows项目,头文件自动出现了,win下的小伙伴们幸福了。

vim、emacs党徒直接无视~~~

c++ 动态判断基类指针指向的子类类型(typeid)

我们在程序中定义了一个基类,该基类有n个子类,为了方便,我们经常定义一个基类的指针数组,数组中的每一项指向都指向一个子类,那么在程序中我们如何判断这些基类指针是指向哪个子类呢?

CryptoPP使用介绍

Crypto++是个免费的C++加解密类库,由于资格太老、持续更新,最新版本到了CryptoPP 5.6,对天缘而言,第一眼看到CryptoPP就感觉头大,根目录下放置大量单源文件、编译文件、项目文件,再加上多平台和多编译器支持,文件几乎又多了一倍,而且还是都混到一起,直接就让人望而却步。毕竟Crypto是个功能完整,且经过大量用户使用考验的开源库。所以,皱眉学习汇总一下,遂成此文。

官方网址:http://www.cryptopp.com/

本文测试环境:Windows7 SP1+VC6,测试工程名为Test。用VC打开CryptoPP工程文件,会发现有四个子工程:

  • cryptdll – 生成cryptopp.dll动态库
  • dlltest – 用来测试cryptopp.dll,依赖cryptdll工程
  • cryptlib – 生成cryptlib.lib静态库
  • cryptest – 用来测试cryptopp,依赖cryptlib工程

所以,我们有两种使用CryptoPP方法,一种是静态链接,还有一种是动态链接,使用对应的工程编译即可,区别就不说了,我们下文以静态链接为例,介绍几种常用加解密算法使用。

一、编译cryptlib

首先需要编译cryptlib,最后得到cryptlib.lib文件。
继续阅读 »

vs2008编译zlib库32位及64位

这里以1.2.8为例,当前最新的版本1.2.8,方法应该都是通用的。

32位版本

1、下载并解压缩zlib-1.2.8.tar.gz
2、进入vs2008命令提示,执行批处理:zlib-1.2.8\contrib\masmx86\bld_ml32.bat
3、进入zlib-1.2.8\contrib\vstudio\vc9\目录,用vs2008打开zlibvc.sln方案文件
4、看到方案下有很多项目,其中zlibstat是zlib静态库,zlibvc是动态库
5、在工具栏中将“解决方案平台”改为“Win32”,编译即可
继续阅读 »

C++接口实现总结

网上的例子,稍微有点错误。我给更改一下,附件上有源码!如有错误,请指正。

总结一下C++实现接口的技巧。
面向对象的语言诸如JAVA提供了Interface来实现接口,但C++却没有这样一个东西,尽管C++ 通过纯虚基类实现接口,譬如COM的C++实现就是通过纯虚基类实现的(当然MFC的COM实现用了嵌套类),但我们更愿意看到一个诸如 Interface的东西。下面就介绍一种解决办法。
继续阅读 »

C++“隐藏实现,开放接口”的实现方案

为什么要有接口?

接口就是一个程序与其它程序交流的窗口。就比如有一个电视机,我并不需要知道它是怎样工作的,我只要知道按电源键就可以开启电视,按节目加(+)减(-)可以切换电视频道就可以了。

Java程序员都知道Java中有interface可以实现对外的接口,但C++并没有接口这样的语法,那它要好怎样实现对外提供接口呢?我们可以通过纯虚函数定义一个抽象类,专门用来声明一个类的功能。
继续阅读 »

让用VS2012/VS2013编写的程序在XP中顺利运行

微软为了推销自家平台,默认配置下VS2012和VS2013编写的应用程序只能在Vista/Win7/Win8上运行。但幸好还保留了生成XP程序的设置项。XP和Win2003的用户还是大量存在的,我们程序软件的发布不能不考虑他们。

1. 项目菜单->项目属性->配置属性->常规->平台工具集,选择“VS2013WindowsXP(v120_xp)”;

2. 项目菜单->项目属性->配置属性->常规->MFC的使用,选择在静态库中使用MFC;

3. 项目菜单->项目属性->链接器->系统->子系统->控制台或窗口windows(根据你的项目类型选择),第二项版本号设成5.01。

4. C/C++->代码生成->运行库,选择“多线程调试(/MTd)”;

5. 还需要至少带有Update3(或4),这一点我没有验证,因为我直接安装的就是带有Update3的VS2013。
继续阅读 »