博文

目前显示的是 十二月, 2004的博文

利用libcurl访问网页

#include <tchar.h>#include <curl/curl.h>int _tmain(int argc, _TCHAR* argv[]) { CURL* curl; CURLcode res; curl = curl_easy_init(); if(curl){ curl_easy_setopt(curl,CURLOPT_URL,"http://localhost/snnn/index.html"); res = curl_easy_perform(curl); curl_easy_cleanup(curl); } return0; }

开发手记

学了一年半的c++,整天吼着说什么这不是面向对象,那不符合c++ standard,真正准备写一个类出来的时候,才明白自己是多么的无知。
我早就准备尝试做做符号运算,苦于不知道用来存储表达式的树该怎么来写,一直搁浅。
从小事做起,我想先从多项式做起,这个很简单。
于是,今晚开始动工!
嗯,先设计第一个类,MonomialExpr,单项式表达式。
首先,最核心的两个数据成员,次数和幂数,想了想,还是设为了private.但愿我有能力把它完全封装在内。
什么类型呢?double?为了以后扩展需要,还是不要声明类型了。我想等我再学会点Blitz++后试试那些huge 的浮点型。我可不想告诉我的用户:“对不起,c++的内置数据类型最大只为double,所以此程序在您的32位x86 PC机上最大只能处理64位的数据!”
private:
COEFFICIENT_TYPE coefficient_;
EXPONENT_TYPE exponent_;
Ok,下来怎么处理这两个类型?按我以前的方式,都是放在一个config.h中,用宏来定义
#define COEFFICIENT_TYPE double
呵呵,不是说c++中的模板除了有点像类外就是宏吗?好吧!试试,复杂的类型我不会写type_traits,这些简单的double,float我还是会处理的。
好,加上默认构造函数,拷贝构造函数,析构函数,它大致就是这样了/*! \class MonomialExpr * */ template class MonomialExpr{ public: /// Default constructor;MonomialExpr(){ }; /// construct by a given coefficient and exponent; MonomialExpr(COEFFICIENT_TYPE coefficient,EXPONENT_TYPE exponent): coefficient_(coefficient), exponent_(exponent) { };/// Default destructor; ~MonomialExpr(){ }; /// Copy constructor MonomialExpr(const MonomialExpr&){ …

NTDLL.dll

打开NTDLL.dll,惊奇的发现原来CRT的许多基本函数居然都是在这里实现的!甚至包括qsort,ceil这样的函数,还有臭名昭著的strcpy(严格来讲,这只能怪使用者不当心)。堆的释放,进城管理,似乎都是在这。于是,我决定,仔细察看以下它,这1410个函数是做什么的用户模式的代码在调用系统内核函数的时候,首先把一个叫做system call number的数放在EAX中,把参数放在其它的寄存器中了。然后调用INT 2E中断。但是大部分应用程序并不需要直接这么做。通常都是在调用kernel32.dll等时由他们来调用INT 2E.内核模式的代码,做法稍微有点不同。他们通常调用由NTOSKRNL.EXE导出的NTDLL.dll中Zw开头的那一系列函数,比如ZwWaitForSingleObject, 反之,如果是用户级代码需要调用内核,就会利用INT 2E调用WaitForSingleObject.对于许多函数的批量调用,你会明显发现 Zw族要比Rtl族效率高很多。可惜ntdll.dll中的大部分函数都是undocumented.
对于一部分得知其定义形式的函数,可以这样调用:
1.先将NTDLL.DLL读入 LoadLibrary(TEXT("NTDLL.dll"))
2.利用GetProcAddress 获取其函数入口地址
3.利用得到的函数指针调用但是可以大致的分为几类吧
1 PropertyLengthAsVariant 它被排在了第一号,但是我就是不明白它是做什么的
2 Csr(configuration status register? Command and Status Register?)系列
CsrAllocateCaptureBuffer CsrAllocateMessagePointer CsrCaptureMessageBuffer CsrCaptureMessageMultiUnicodeStringsInPlace CsrCaptureMessageString CsrCaptureTimeout CsrClientCallServer CsrClientConnectToServer CsrFreeCaptureBuffer CsrGetProcessId CsrIdentifyAlertableThread CsrNewT…

刚刚对ie的一点新体会

首先,很多人一看见explorer出错,就以为是ie挂掉了,这是不正确的。因为它们完全是两个东西,explorer是windows的shell
而ie的全称是internet explorer,是windows的一个组件。
这两个东西应该是毫不相干的,因为当你关闭shell进程的时候,ie依旧可以正常工作.
之前我是这样认为的,但是,刚刚感觉又有点不对.于是准备细心探查下ie的究竟. 好吧,我们来看看ie由哪几部分组成 首先我们得明白,ie是windows的一个组件,而不只是一个简单的exe.
最上层是IEXPLORE.exe,它在ie被装载的时候初始化。(有人可能就会问了,什么时候ie会被装载呢?不就是点击IEXPLORE.exe的时候吗?不只是!其他的情况后面再说。)这个可执行程序,使用其他的组件来实现导航,历史记录管理,收藏夹,html的解析和呈现,等等。它自身只是提供一个windows窗体和它的工具栏。Iiexplore直接调用下层的shdocvw.dll. Shdocvw.dll,你可以把它看成就是一个dll宿主,它操控着下面的mshtml.dll(用来进行html的解析和呈现)以及其他的活动文档组件(Active Document component ),比如MS office,acrobat reader,这就是你为什么能在ie中直接打开doc和pdf文件.而Shdocvw.dll自身只提供浏览器的一些很基本功能,导航,链接置换,历史记录管理,收藏夹,等等.Shdocvw.dll其实也就是我们通常所说的浏览器控件.上面所说的链接置换(In-place linking)是指如果你点击一个链接,它会在当前窗口实例中打开该文档,而不是新建一个新的浏览器实例(如果我们只有mshtml控件,而没有它的话). 最后剩下Mshtml.dll,我想我不用说,大家也都知道它是做什么的了吧. 好,我们再来打开注册表来看下
来看下这个项
HKEY_CLASSES_ROOT\CLSID{871C5380-42A0-1069-A2EA-08002B30309D}
{871C5380-42A0-1069-A2EA-08002B30309D}是shell的一个命名空间(namespace),默认的打开方式是"C:\Program Files\Internet Explo…

用yacc做的一个简单的计算器

很简单,就是你输入
3+ 5 * 4 + (345 +2348) * (34 ^ 4)
它会告诉你
3598752871
用yacc做的
代码写的还是不够规范,中间有10个歧义是yacc帮我转换的
编译后整个发布包大小是65k,有需要的把你的邮箱留下%{ #define YYSTYPE double #include <math.h>#include <ctype.h>#include <stdio.h>intyylex(void); voidyyerror(charconst*); %} %token NUM %left '+''-' %left '*''/' %left UMINUS %% input: /* empty */ | input line ; line: '\n' | exp'\n' {printf ("\t%.10g\n",1);} ; exp: NUM { = 1; } | '('exp')' { = 2;} | exp'+'exp { = 1 + 3; } | exp'-'exp { = 1 - 3; } | exp'*'exp { = 1 * 3; } | exp'/'exp { = 1 / 3; } /* Exponentiation */ | exp'^'exp { = pow (1,3);} /* Unary minus */ | '-'exp %prec UMINUS { = -2;} ; %% /* The lexical analyzer returns a double floating point number on the stack and the token NUM, or the numeric code of the character read if not a number. It skips all blanks and tabs, and returns 0 f…

数组的安全复制

如果你要制作一个数组clone,你该怎么做?template <class T> T* NewCopy( const T* src,size_t srcsize, size_t destsize ) { assert( destsize >= srcsize ); T* dest = new T[destsize]; //可能会抛出bad_alloc异常 try { std::copy( src, src+srcsize, dest ); } catch(...) { delete[] dest; // delete 语句永远都不会抛出异常 throw; // 重新抛出异常 } return dest; }

汉化cygwin

默认情况下,cygwin的大部分命令是不支持中文的,比如ls,显示出来的都是问号
但是我们可以通过修改一些设置使它支持中文
首先,进入到用户主目录下
cd ~
然后找到.inputrc,没有的话就新建
在后面加上
set meta-flag on
set convert-meta off
set output-meta on
然后是.bashrc 或.bashprofile
export LESSCHARSET=latin1
alias ls=''ls --show-control-chars --color=auto''