Archive for 十月 2012

实现窗口最大化最小化消息事件

有如下两种方法实现:
第一种:
给Dlg类添加WM_SIZE事件,会自动生成OnSize()方法

void CTrayDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialog::OnSize(nType, cx, cy);
 
	// TODO: 在此处添加消息处理程序代码
 
	//最小化 SIZE_MINIMIZED
	//最大化 SIZE_MAXIMIZED
	//还原 SIZE_RESTORED
	if   (nType== SIZE_MINIMIZED)      //响应最小化
	{   
		//在这里添加最小化需要处理的事件 
		ShowWindow(SW_HIDE);
	}
}

第二种:
Continue reading ‘实现窗口最大化最小化消息事件’ »

线程中调用PostMessage()出现内存访问错误

为什么在线程中调用AfxGetMainWnd()->PostMessage(WM_DISPLAY,0,0);会出现内存访问错误?

解决办法如下:

在创建线程的时候,用AfxGetMainWnd()->GetSafeHwnd()得到主窗口的HWND值,并作为创建线程的参数,传给线程。在线程中,使用这个HWND,比如:
主程序中:

 HWND hMainWnd = AfxGetMainWnd()->GetSafeHwnd();
 AfxBeginThread(YourThreadFunc, (LPVOID)hMainWnd);

线程函数:

 UINT YourThreadFunc(LPVOID pParam)
 {
 ......
 HWND hMainWnd = (HWND)pParam;
 ::PostMessage(hMainWnd, WM_DISPLAY,0,0);
 ......
 }

SOCKET检测TCP是否断线的三种方法

目前主要有三种方法来实现用户掉线检测:SO_KEEPALIVE ,SIO_KEEPALIVE_VALS 和Heart-Beat线程。
下面我就上面的三种方法来做一下介绍。

一、SO_KEEPALIVE机制

这是socket库提供的功能,设置接口是setsockopt API:


BOOL bSet=TRUE;
setsockopt(hSocket,SOL_SOCKET,SO_KEEPALIVE,(const char*)&bSet,sizeof(BOOL));

根据MSDN的文档,如果为socket设置了KEEPALIVE选项,TCP/IP栈在检测到对方掉线后,任何在该socket上进行的调用(发送/接受调用)就会立刻返回,错误号是WSAENETRESET,同时,此后的任何在该socket句柄的调用会立刻失败,并返回WSAENOTCONN错误。

Continue reading ‘SOCKET检测TCP是否断线的三种方法’ »

使用gsoap生成客户端代码

网络上提供一些免费的接口资源,比如天气预报、列车时刻表以及股票信息等服务,而这些接口使用的是Web Service规范,若要自己编写协议进行通信比较费劲,我们可以使用gsoap工具来生成Web Service客户端协议组装及发送代码,而我们只需要填充查询数据就能得到我们想要的内容。

gsoap可以在http://gsoap2.sourceforge.net/上下载到,使用步骤:

1.下载gsoap文件后解压,在gsoap/bin/win32目录下有soapcpp2.exe和wsdl2h.exe两个文件。

2.将这两个文件复制到gsoap目录中,然后使用wsdl2h命令生成.h文件,例如下面的命令是生成天气预报客户端代码


wsdl2h -o weather.h http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl

3.扫行完上面的命令后,会在gsoap目录中生成相应的.h文件,再使用soapcpp2命令生成.cpp文件,-C的意思是生成客户端代码,生成服务端代码是使用-S,例如将上面的weahter.h生成.cpp文件:


soapcpp2 -C -x -i -I "./import" -L?weather.h

5.然后将生成的.cpp文件及.h文件都复制到工程目录中进行编译

注意:在上面使用soapcpp2命令的时候,默认是生成第一版的协议,如果加上-2则生成第二版协议,若发现协议执行错误,不妨试试加上-2生成代码。

天气预报工具,支持代理访问

现在Web Service比较流行,主要是它的接口通用性好,跨平台,跨语言,使用HTTP协议进行数据交互,本工具就是使用Web Service方式实现天气预报功能。

软件打开界面如下图所示

天气预报工具图片1
Continue reading ‘天气预报工具,支持代理访问’ »

安乐业房产源码环境搭建

安乐业房产源码环境配置

近段时间研究了下安乐业房产源码,前提是要先把网站部署起来,下面就是安装过程。

一、由于安乐业房产源码需要服务器支持伪静态,数据库为MYSQL,所以在网上找了一个完整服务器 Apache + PHP + MySQL环境套件包phpnow,下载地址是http://www.phpnow.org/download.php,安装过程参考他们网站的文档,然后直接启动服务器就行了。

二、把安乐业房产源码放到phpnow/htdocs目录下,然后修改源码数据库配置等信息,即以下四个文件:

/config.cfg.php

/uc/data/config.inc.php

/admin/inc/db.php

/admin/data/path.inc.php

凡是涉及到数据库地方都需要修改

三、详细修改说明。
Continue reading ‘安乐业房产源码环境搭建’ »

安乐业房产源码地图key无效不能使用

安乐业房产源码使用的是google地图API

在本地测试安乐业房产源码,发现地图搜房等地图相关页面都能正常显示地图,但把源码放到外网PHP空间后,地图不能使用了,并且报key无效,需要重新申请google地图key,但目前google已经停止地图key的申请了,而且不在使用key了,其实只要在后台管理页面中将google地图key删掉就可以解决这个问题。

首先进入安乐业房产管理后台,打开首页->网站配置,找到googleKEY,把后面一长串东西删了,然后点保存,即可。

VC提示IDC_HAND未声明的标识符

我在MFC中设置鼠标图标的时候,用到:

HCURSOR hCursor;
hCursor = AfxGetApp()->LoadCursor(IDC_HAND);

然后编译,编译器报错,提示IDC_HAND未声明的标识符,但是可以在代码中查看到已经定义了。

感觉到莫名其妙,解决办法是:

打开stdafx.h找到#include ,在这之前,记住一定要在这段代码之前(否则没有效果)加上:

#ifndef WINVER // 允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。
#define WINVER 0x0500 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif

这样就可以了。这是由于宏没有定义导致标识符无法识别的问题。

各大搜索引擎网站收录提交入口及收录查询

以下是各大搜索引擎网站收录提交的入口:

百度网站收录提交入口http://www.baidu.com/search/url_submit.html

Google网站收录提交入口http://www.google.com/addurl/

Yahoo网站收录提交入口http://search.help.cn.yahoo.com/h4_4.html

Bing网站收录提交入口http://www.bing.com/webmaster/SubmitSitePage.aspx

Dmoz网站收录提交入口http://www.dmoz.com/World/Chinese_Simplified

Coodir网站目录收录提交入口http://www.coodir.com/accounts/addsite.asp

Alexa网站收录提交入口http://www.alexa.com/help/webmasters

搜狗网站收录提交入口http://www.sogou.com/feedback/urlfeedback.php

Soso网站收录提交入口http://www.soso.com/help/usb/urlsubmit.shtml

有道搜索网站收录提交入口http://tellbot.youdao.com/report

中国搜索网站收录提交入口http://ads.zhongsou.com/register/page.jsp

Freewebsubmission.com搜索引擎批量提交http://www.freewebsubmission.com/

搜索引擎收录查询入口:
http://indexed.webmasterhome.cn/

用TCP协议传送文件可防止粘包

有时候TCP传输会出现粘包情况,网上流行几种说法,一种是在发送的时候加个sleep,让发送不至于过快引起粘包,但这种会影响发送效率,这个sleep并且微秒级的,也就是说sleep(1)与sleep(40)差别不大,废话不多说,下面这段代码经测试可预防粘包。


//以下是测试结构
typedef struct tagRequest
{
    UINT nMagic;
    UINT ncbSize;
    //
    // 这中间可以写点别的
    //
    //
    //数据长度
    UINT nContentLength;

}REQUEST,*PREQUEST,*LPREQUEST;

#define     REQUEST_MAGIC        0x12345678
#define  REQUEST_SIZE            (sizeof(tagRequest))

typedef struct tagResponse
{
    UINT nMagic;
    UINT ncbSize;
    //
    // 这中间可以写点别的
    //
    //
    //数据长度
    UINT nContentLength;
}RESPONSE,*PRESPONSE,*LPRESPONSE;

Continue reading ‘用TCP协议传送文件可防止粘包’ »