reading 2012.01

string替换所有指定字符串(C++)

Hex Workshop v6.01 + License File

中国奶业现状的背后

HTML5游戏:Cut the Rope 花了半个小时过关,挺有趣的,其实设计关卡比过关难度大多了。

VS2008编译iconv静态链接库

谈谈易语言程序的结构、封装原理及安全性

多线程编程之四——线程的同步

多线程编程之三——线程间通讯

多线程编程之二——MFC中的多线程开发

多线程编程之一——问题提出
该系列的源代码

UpdateData() –MFC函数

locoy火车头采集用法

www.joygames.com/mini/main/login.aspx?uid=4393838&pwd=85750E3FA2D1BA236BDA394F1E5DC12E
如果uid是1到最大,然后pwd是最新爆出来的常用密码……………

CMD环境恢复中文

SQLite入门与分析(一)—简介

SQLite3 C/C++ 开发接口简介(API函数) 三

SQLite3 C/C++ 开发接口简介(API函数) 二

SQLite3 C/C++ 开发接口简介(API函数) 一

靠假话神话支撑的“血燕”产业

Tagged | Leave a comment

sqlite命令入门

(1)创建数据库

   在命令行中切换到sqlite.exe所在的文件夹
   在命令中键入sqlite3 test.db;即可创建了一个名为test.db的数据库
   由于此时的数据库中没有任何表及数据存在,这时候是看不到test.db的,必须往里面插入一张表即可看到数据库

(2)创建表
   create table Test(Id Integer primary key, value text);
   此时即可完成表的创建,当把主键设为Integer时,则该主键为自动增长,插入数据时,可直接使用如下语句:
   insert into Test values(null,’Acuzio’);

(3)获取最后一次插入的主键: select last_insert_rowid();

(4)sqlite>.mode col
   sqlite>.headers on
   在数据库查询的时候,显示行数和头!

(5)在DOS中,键入Ctrl+C,退出数据库,Unix中,使用Ctrl+D

(6)SQLite Master Table Schema
—————————————————————–
Name                       Description
—————————————————————–
type          The object’s type (table, index, view, trigger)
name          The object’s name
tbl_name      The table the object is associated with
rootpage      The object’s root page index in the database (where it begins)
sql           The object’s SQL definition (DDL)

eg.
sqlite> .mode col
sqlite> .headers on
sqlite> select type, name, tbl_name, sql from sqlite_master order by type;
这样就能看到所有数据库中的信息,表、索引、视图等等

(7)导出数据
.output [filename],导出到文件中,如果该文件不存在,则自动创建
.dump 导出数据命令
.output stdout 返回输出到屏幕(进行其他操作)

eg.
sqlite>.output Acuzio.sql
sqlite>.dump
sqlite>.output stdout
这样就可以把数据导入到Acuzio.sql中

(8)导入数据
导入数据使用.read命令
eg.
如导入(7)中的数据
sqlite>.read Acuio.sql

(9)备份数据库
在切换到Sqlite文件夹
sqlite3 test.db .dump > test.sql
如果在数据库中
sqlite> .output file.sql
sqlite> .dump
sqlite> .exit

(10)导入数据库
在切换到Sqlite文件夹
sqlite3 test.db < test.sql

(11)备份二进制格式数据库,vacuum:释放掉已经被删除的空间(数据和表等被删除,不会被清空空间)
sqlite3 test.db VACUUM
cp test.db test.backup

(12)获取数据库信息
如果想获得物理数据库结构的信息,可以去SQLite网站上下载SQLite Analyzer工具
使用: sqlite3_analyzer test.db

(13)其他的SQLite工具
SQLite Database Browser (http://sqlitebrowser.sourceforge.net)
SQLite Control Center (http://bobmanc.home.comcast.net/sqlitecc.html)
SQLiteManager (www.sqlabs.net/sqlitemanager.php)

(13)SQLite 与其他数据库不同,它是以(;)来执行语句,而不是(go).

(14)SQLite注释(–)或(/* */)
eg.
– This is a comment on one line
/* This is a comment spanning
two lines */

(15)创建表结构

CREATE [TEMP|TEMPORARY] TABLE table_name (column_definitions [, constraints]);

关键字TEMP、TEMPORARY表示创建的是临时表

(16)在SQLite中有5种基本类型:
Integer/Real/Text/Blob/Null

(17)确保唯一性可以用关键字UNIQUE
eg.
CREATE TABLE contacts ( id INTEGER PRIMARY KEY,
name TEXT NOT NULL COLLATE NOCASE,
phone TEXT NOT NULL DEFAULT ‘UNKNOWN’,
UNIQUE (name,phone) );

(18)修改表
ALTER TABLE table { RENAME TO name | ADD COLUMN column_def }
eg.
sqlite> ALTER TABLE contacts
ADD COLUMN email TEXT NOT NULL DEFAULT ” COLLATE NOCASE;
sqlite> .schema contacts
CREATE TABLE contacts ( id INTEGER PRIMARY KEY,
name TEXT NOT NULL COLLATE NOCASE,
phone TEXT NOT NULL DEFAULT ‘UNKNOWN’,
email TEXT NOT NULL DEFAULT ” COLLATE NOCASE,
UNIQUE (name,phone) );

(19)查询
SELECT DISTINCT heading FROM tables WHERE predicate
GROUP BY columns HAVING predicate
ORDER BY columns LIMIT count,offset;

(20)Limit和Offset关键字
Limit 指返回记录的最大行数
Offset 指跳过多少行数据

via http://www.cnblogs.com/Acuzio/archive/2008/09/09/1287958.html

Tagged | Leave a comment

sqlite3 cmd命令输出乱码

1. 在CMD窗口下输下:chcp 65001 确定

2. 在命令行标题栏上点击右键,选择【属性】 -【字体】,将字体修改为【Lucida Console】 确定

解释一下,因为sqlite3数据存储采用UTF-8。中文windows xp的cmd默认code page是1521

C:\Documents and Settings\Administrator>chcp
Active code page: 1251

通过chcp 65001修改为UTF-8。code page(代码页)是字符集的另外一个术语(term)。

具体各种Code page参考:http://en.wikipedia.org/wiki/Code_page

Tagged | Leave a comment

CEdit子类化限制输入合法QQ号(MFC)

一般CEdit控件默认是可以输入任何的内容,包括数字、字符、符号等。

有时候我们有特殊的需求,限制用户输入合法的QQ号(数字,5<=位数<=10)。

在Dialog的设计器里面右击Edit控件有个Number属性,作用是限制只能输入数字。默认是False,设置为True之后就只能输入数字了。

但是我们还有一个限制位数的需求(5<=位数<=10),这个我们可以通过DDV数据验证机制来完成。在CTestDlg::DoDataExchange()加入:

DDV_MinMaxLongLong(pDX,IDC_QQNUM,10000,9999999999);

当用户输入的范围超出了10000到9999999999这个范围,然后点击确定之后弹出:

以上就是不需要子类化就能完成这个需求。我感觉这并不是一个友好的解决方法,如果有比这个更复杂一点的需求,DDV就没什么作用了。

下来来说说子类化的方法是怎么做的。

假设Edit控件ID是IDC_QQNUM

新建一个QQNumEdit类,基类是CEdit。

QQNumEdit.h:

#pragma once
#include "afxwin.h"

class CQQNumEdit :
	public CEdit
{
public:
	CQQNumEdit(void);
	~CQQNumEdit(void);
protected:
	afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
	DECLARE_MESSAGE_MAP()
};

QQNumEdit.cpp:

#include "stdafx.h"
#include "QQNumEdit.h"

CQQNumEdit::CQQNumEdit()
{

}
CQQNumEdit::~CQQNumEdit()
{

}
BEGIN_MESSAGE_MAP(CQQNumEdit,CEdit)
	ON_WM_CHAR()
END_MESSAGE_MAP()

void CQQNumEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{	
	if(nChar>='0' && nChar<='9' )
	{
		CEdit::OnChar(nChar, nRepCnt, nFlags);
	}
	else
	{
		return;
	}
}

添加了一个OnChar事件。判断输入的范围是否在’0′到’9′,不是就直接return返回。

接下来还需要在父对话框中定义一个CQQNumEdit类型的变量:

class CAddUserDlg : public CDialog
{
	//other code.........
public:
	CQQNumEdit m_qqNumEdit;
};

接下来在InitDialog中子类化:

BOOL CAddUserDlg::OnInitDialog()
{
	m_qqNumEdit.SubclassDlgItem(IDC_QQNUM,this);
	//m_qqNumEdit.SetLimitText(10);
	//m_qqNumEdit.UnsubclassWindow();
	return TRUE;
}

子类化使用SubclassDlgItem。不子类化了,使用UnsubclassWindow。设置字符长度SetLimitText,参数就是字符长度。

在这种情况下子类化的方法无需点“确定”,用户输入错误的数据Edit控件是没显示的。感觉要直接一点。

Tagged | Leave a comment

vs2010的mfc项目转vs2005修改的3个地方

首先去掉stdafx.h里面的:

#include <afxcontrolbars.h>     // MFC support for ribbons and control bars

ribbons界面库vs2005版本木有啊。

将CWndEx类都修改为CWnd。vs2005木有CWndEx。

将真彩色的图标换成256色的。

Tagged , | Leave a comment

不用AppWizard创建MFC程序

十个月以前写过“不用MFC AppWizard创建MFC项目”,不过是转载别人的,今天自己来写一次。

首先我们用AppWizard创建一个程序mfc1,然后查看mfc1程序属性里面的C/C++命令行和链接器命令行:

C/C++命令行:

/Od /D “WIN32″ /D “_WINDOWS” /D “_DEBUG” /D “_AFXDLL” /D “_UNICODE” /D “UNICODE” /Gm /EHsc /RTC1 /MDd /Yu”stdafx.h” /Fp”Debug\mfc1.pch” /Fo”Debug\\” /Fd”Debug\vc80.pdb” /W3 /nologo /c /Wp64 /ZI /TP /errorReport:prompt

链接器命令行:

/OUT:”d:\dev\Debug\mfc1.exe” /INCREMENTAL /NOLOGO /MANIFEST /MANIFESTFILE:”Debug\mfc1.exe.intermediate.manifest” /DEBUG /PDB:”d:\dev\debug\mfc1.pdb” /SUBSYSTEM:WINDOWS /ENTRY:”wWinMainCRTStartup” /MACHINE:X86 /ERRORREPORT:PROMPT

接下来我们根据以上命令行来创建一个hardcode程序,添加新项目里面选择“空项目”,然后创建一个头文件hello.h和一个cpp文件hello.cpp(代码来自MFC Windows程序设计(第二版)):

hello.h

class CMyApp : public CWinApp
{
public:
    virtual BOOL InitInstance ();
};

class CMainWindow : public CFrameWnd
{
public:
    CMainWindow ();

protected:
    afx_msg void OnPaint ();
    DECLARE_MESSAGE_MAP ()
};

hello.cpp

#include 
#include "Hello.h"

CMyApp myApp;

/////////////////////////////////////////////////////////////////////////
// CMyApp member functions

BOOL CMyApp::InitInstance ()
{
    m_pMainWnd = new CMainWindow;
    m_pMainWnd->ShowWindow (m_nCmdShow);
    m_pMainWnd->UpdateWindow ();
    return TRUE;
}

/////////////////////////////////////////////////////////////////////////
// CMainWindow message map and member functions

BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
    ON_WM_PAINT ()
END_MESSAGE_MAP ()

CMainWindow::CMainWindow ()
{
    Create (NULL, _T ("The Hello Application"));
}

void CMainWindow::OnPaint ()
{
    CPaintDC dc (this);
    
    CRect rect;
    GetClientRect (&rect);

    dc.DrawText (_T ("Hello, MFC"), -1, &rect,
        DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}

以上代码的功能是建立一个最简单的窗口,中心位置用CPaintDC显示一些文字。

点击生成,报错:

d:\vs8\vc\atlmfc\include\afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]

提示如果代码生成->运行时库选择了/MD[d]必须定义_AFXDLL,否则不要使用/MD[d]。我们在C/C++->预处理器->预处理器定义加上:WIN32;_WINDOWS;_DEBUG;_AFXDLL;_UNICODE;UNICODE;保持和mfc1程序的一致性。

点击生成,报了另外的错误:

1>正在编译...
1>Hello.cpp
1> WINVER not defined. Defaulting to 0x0502 (Windows Server 2003)
1>正在链接...
1>LINK : 没有找到 d:\dev\Debug\hardcode.exe 或上一个增量链接没有生成它;正在执行完全链接
1>LINK : fatal error LNK1561: 必须定义入口点

新建一个stdafx.h作预编译头,内容是一些定义版本的信息:

#ifndef WINVER				// 允许使用特定于 Windows XP 或更高版本的功能。
#define WINVER 0x0501		// 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif

#ifndef _WIN32_WINNT		// 允许使用特定于 Windows XP 或更高版本的功能。
#define _WIN32_WINNT 0x0501	// 将此值更改为相应的值,以适用于 Windows 的其他版本。
#endif						

#ifndef _WIN32_WINDOWS		// 允许使用特定于 Windows 98 或更高版本的功能。
#define _WIN32_WINDOWS 0x0410 // 将它更改为适合 Windows Me 或更高版本的相应值。
#endif

#ifndef _WIN32_IE			// 允许使用特定于 IE 6.0 或更高版本的功能。
#define _WIN32_IE 0x0600	// 将此值更改为相应的值,以适用于 IE 的其他版本。值。
#endif

然后设置 C/C++ -> 预编译头 -> 创建/使用预编译头 -> 创建预编译头(/Yu)。

在hello.cpp文件中的最顶部加入

#include "stdafx.h"

然后设置 链接器 -> 系统 -> 子系统 -> Windows (/SUBSYSTEM:WINDOWS)

设置 链接器 -> 高级 -> 入口点 -> wWinMainCRTStartup

点击生成,OK了。


Tagged , | Leave a comment

reading 2011.12

子类化:增强Edit控件为日期输入控件源代码

全民喝奶,没必要_发现者第179期

解说Win32的窗口子类化(源代码需要库币,点这里直接下载)

MFC/C++ Helper Class for Window Resizing(WndResizer) 一个封装得不错的MFC窗口控件大小自适应工具,仿winform思想。

EasySize – Dialog resizing in no time!(MFC空间自适应大小,这个EasySize还算不错,用宏来实现,不过自定义性差了点,哥的需求无法满足啊)

《看客》第126期:战场“合同工”

揭秘!为什么朝鲜女性只能穿裙子

中国海无鱼可捕?_发现者第176期_网易探索

《看客》第120期:菲律宾反腐战

《看客》第121期:讨薪者的“表演”

《看客》第122期:内比都的幻想

语文教育到了最危险的时刻

免费发菜看似惠民实则害民

朝鲜领导人金正日生平(不要高兴、金正恩即将登场)

网易一周图片精选【第105期】2011.12.3—12.9

香烟能降焦减害不可信

普京虽胜尤败

宇文泰与苏绰论“用贪官,反贪官”

中国普通护照难以自由行

《看客》第123期:告别“雾都”

善待幸存者才能传递历史记忆

上官鹏飞之死,罪不在散打

《看客》第124期:最成功的“失败者”

http://zh.wikipedia.org/wiki/戈尔巴乔夫 (SyntaxHighter作者也姓Gorbatchev,不过貌似是美国人)

海警殉职,韩国人为何愤怒 小偷杀人了,主人怒了。

Tagged | Leave a comment

一些电影截图。。。







Tagged | Leave a comment

(c语言)webqq登录

http://tunps.com/lab/c/ConsoleQ.c

代码太多,直接传文件。

用libcurl做http request。

用yajl解析json。

哥将md5算法的javascript实现转为了C语言。转换中发现了一些有趣的东西:>>>(无符号的右移运算符,JS特有,C没有这个运算符,但是C可以通过>>的逻辑右移来实现此运算)

WebQQ的登录过程分一下几个步骤,网上已经有详细的讲解,我就不详讲了。

  1. 取得验证码check,如果是以!开头的四位字符就无需输入验证码,当然console下面无法显示验证码。
  2. 本地md5_3加密完之后login。
  3. cookie中取得ptwebqq之后以json格式login2发送数据。
  4. login2返回json格式的vfwebqq和psessionid。保存起来。
  5. 登录后的每次操作(包括重新登录)都需要vfwebqq和psessionid作为token发送。

后续的获取好友列表,接受、发送消息没做。都是用json做交互。哥发现了yajl一处不好用的地方[1,2]就没有继续写下去了。暂时到这里吧。


Tagged | Leave a comment

str2binl和binl2str

function str2binl(D) {
    var C = Array();
    var A = (1 << chrsz) - 1;
    for (var B = 0; B < D.length * chrsz; B += chrsz) {
        C[B >> 5] |= (D.charCodeAt(B / chrsz) & A) << (B % 32)
    }
    return C
}
function binl2str(C) {
    var D = "";
    var A = (1 << chrsz) - 1;
    for (var B = 0; B < C.length * 32; B += chrsz) {
        D += String.fromCharCode((C[B >> 5] >>> (B % 32)) & A)
    }
    return D
}
两个来自:http://imgcache.qq.com/ptlogin/ac/v9/js/comm.js?v=1.2.35 的JS函数。 字符串和数字之间转换。值得研究。
Tagged | Leave a comment