博文
一些资源(2008-05-09 15:55:00)
摘要:BOOST库的使用文档
http://www.boost.org/doc/libs/1_35_0/libs/bimap/doc/html/index.html......
VC操作Excel 删除里面sheet的方法(2008-03-30 23:14:00)
摘要:VC里可以用Excel提供的类型库来编程操作Excel表格,最近有人问及怎么删除一个sheet,
该提问者说他的代码只能删除一个空的sheet,非空的总是删不了,我以前也没操作过Excel 试了一下 ,发现是可以的,Excel提供的类型库还是瞒好用的,只要去挖掘.......
代码如下,我就不解析了,看看就懂
void COptExcelDlg::OnOK()
{
_Application app;
if(!app.CreateDispatch(_T("Excel.Application"),NULL))
{
AfxMessageBox(_T( "fail2 "));
return;
}
app.SetVisible(FALSE);
app.SetUserControl(FALSE);
app.SetDisplayAlerts(FALSE);
Workbooks books;
books.AttachDispatch(app.GetWorkbooks());
LPDISPATCH lpDisp;
COleVariant vResult;
COleVariant covTrue((short)......
欣赏几个VC做的漂亮时钟控件Demo(非帖图)(2008-01-19 01:28:00)
摘要:
并非贴图,全是画出来的,玻璃罩效果做的不是很好,等有时间完善了,就做得更漂亮啦^_^......
中英文url解码vc++源程序(2008-01-06 00:43:00)
摘要:其实本文是改进网络上的一篇题为“中文url解码vc++源程序”的文章,最近在做个WEB服务器,少不了处理URL,但如果IE请求的文件名是中文的或者中英混合的,那么WEB得到的URL是经过编码来的,所以要解码才能把URL还原成原文,一般都是采用UTF-8编码方式,下面是原著作者写的文章,但笔者对原著作者的程序进行了改造,纠正了原著作者的一些错误,特发此文,以飨读者,如尚发现程序尚有什么漏洞,各位网友加以纠正,我的联系方式是:liqisong611@yahoo.com.cn
原文章:
本文主要讨论中文url解码实现问题,没有详细讲解url编码,utf-8编码.想对编解码问题有更加详细的了解,请查阅相关资料
url编码:实质字符ascii码的十六进制。只是稍微有些变动,需要在前面加上"%"。比如"\",它的ascii码是92,92的十六进制是5c,所以"\"的url编码就是%5c。
UTF-8 编码是UNICODE的一种变长字符编码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。
这里我们只需要知道utf-8对一个英文字符采用一个字节进行编码,对一个中文字符采用三个字节进行编码。现在对如下url编码进行解码实现。
url编码:MFC%E8%8B%B1%E6%96%87%E6%89%8B%E5%86%8C.chm
源代码在windows xp sp2 + vc++6.0测试通过(改进过的代码)。
#include <afx.h>
#include <iostream>
void UTF8ToGB(CString& str);
void ANSIToGB(char* str,int n)
{
ASSERT(str!=NULL); // 保证传进来的参数不能为NULL
wchar_t szwchar = 0;
CString szResult,szhead = "", szend = "";
一个可以防止直线走样的画线函数(2007-11-03 21:57:00)
摘要:我们知道,在VC里画直线时,如果该直线具有一定的倾斜度,那么直线会产生走样(锯齿),这要关系到光栅显示器的显示原理,具体怎么会发生走样我就不具体论述了,每本计算机图形学的书都有描述。下面提供一个画直线的算法函数,该算法具体作者不记得是谁了,我作了一些小的修改,在此提供,希望能对各位带来方便(你无须苦苦的另去研究一个算法啦^_^),直接拿去用即可。
void CSdiView::WuLine(CDC *pDC,CPoint &pt1, CPoint &pt2,int color)
{
int deltax, deltay, start, finish;
double dx, dy, dydx; // fractional parts
BYTE LR, LG, LB;
int x1, x2, y1, y2;
double d1, d2;
x1 = pt1.x; y1 = pt1.y;
x2 = pt2.x; y2 = pt2.y;
deltax = abs(x2 - x1); // Calculate deltax ......
用socket实现自己的HTTP代理服务器(2007-11-03 21:38:00)
摘要:下面是一个先前我用socket实现HTTP代理服务器的例子,代码很简单我就不一一解析了,要注意的是:当该代理服务器收到IE发来的请求时,要将IE请求行中的webserver的域名(或者IP)剥去,再将请求转发给webserver,如果不注意这点而是直接毫无处理的把IE请求信息直接发给webserver某些网站会显示不了网页,比如新浪,pfan,这是测试时发现的,其他就没什么可以说的了。实际上能否完成这个简单的HTTP proxy server可以看出对HTTP协议的熟悉程度,只要有一定的sock编程基础并熟悉了HTTP协议的工作流程,那我想就没什么障碍了。著此文章以供初学者参考,能从里面得到一点点的帮助那我已经心满意足了,高人指点改进意见邮箱联系,下面是源代码:
#include <stdio.h>
#include <iostream>
#include <string>
#include <fstream>
#include <winsock2.h>
#include <process.h>
#include "SockInit.h"
using namespace std;
#define MAX_REQUEST_LEN 2048 // IE请求长度
char szFileName[] ="2004041155.txt"; // 日志文件
CSockInit initSock; // initalize winsock
CRITICAL_SECTION CriticalSection; // 临界区对象(global variable)
void __cdecl ServerThreadProc(void *param);
/************************************************
调试环境:Visual C++6.0 SP6+platform SDK 2003 R2
程序名称:HTTP proxy Server(HttpProxySvr.cpp)
功能 &......
VC中使用系统提供的线程池(Thread Pooling)(2007-10-02 19:19:00)
摘要:在项目里经常用到多线程,大量的客户向服务器提出请求,这时需要开辟线程来响应客户请求,由于客户量是不可预知的,难道来一个客户请求就新开个线程来响应吗?答案是否定的,要知道开辟和撤消线程是需要耗费相当多时间和资源的,于是前辈们弄出了很多模型出来解决这种问题,其中使用线程池(Thread Pooling)是个很好的主意。线程池在Windows2000及其以后版本得到了很好的支持。使用系统提供的线程池机制相当方便而且很有效率。我们仅需要关注于我们的回调函数即可。我们可以自己来实现线程池机制,但是与我们的简单模拟来比,系统提供的线程池有着更多的优点。首先,线程池中线程的数目是动态调整的,其次,线程池利用IO完成端口的特性,它可以限制并发运行的线程数目,默认情况下,将会限制为CPU的数目,这可以减少线程切换。它挑选最近执行过的线程再次投入执行,从而避免了不必要的线程切换。系统提供的线程池背后的隐藏着巨大的策略。
下面是一个使用系统线程池的例子,这个例子的工作函数(workitem function)是这样工作的,它首先检测传进来的参数,如果是true则延时1秒,假则用compute函数循环产生一堆随机数(这里并没用到这些随机数,只是为了拖延时间^_^),使用系统提供的线程池需要用到QueueUserWorkItem这个API函数,这个函数的作用是将你自己的工作函数添加进系统线程池里面,让系统创建好的线程来执行你的工作函数,这些创建线程和撤消线程的烦琐任务根本不需要你来做,你只需维护好你自己的工作函数就OK了。
#include <windows.h>
#include <iostream>
using namespace std;
/***********************
使用系统线程池
Test in VC6.0
***********************/
DWORD BeginTime;
LONG ItemCount;
HANDLE CompleteEvent;
int compute()
......
Win32控制台程序的定时器实现(2007-10-02 19:05:00)
摘要:在论坛上常有问及在console下能否像在MFC一样用SetTimer设置定时器,他们往往得到的回答是“不能”,或者顶多给个多媒体定时器例子你,其实win32 console程序跟一般的win 32程序并没有什么多大的区别,只是它更擅长于文本命令输入输出,一般win32程序能做的事win32 console程序也可以做到的,然而似乎初学者甚至是做了多年VC开发的的”老鸟“总是感到一阵”恐慌“,他们就开始发问了:“哪个黑黑的控制台程序也能有消息循环吗?我们能给它投递消息吗?”.........
在控制台中使用定时器不能简单的SetTimer了事,这在控制台里这种SetTimer的方式是有点麻烦的,需要自己写消息循环投递WM_TIMER消息。其实在控制台里可以使用多媒体时钟来计时:
example:
//启动计时器
MMRESULT nIDTimerEvent = timeSetEvent(
1000,//延时1秒
0,
TimeProc,
0,
(UINT)TIME_PERIODIC);
if( nIDTimerEvent == 0 )
cout<<"启动计时器失败"<<endl;
//回调过程(时钟到来,回调函数被系统自动调用)
void CALLBACK TimeProc(
UINT uID,
UINT uMsg,
DWORD dwUser,
