??xml version="1.0" encoding="utf-8" standalone="yes"?> 64位指的是cpu通用寄存器的数据宽度?4位的?/p> 1 static_cast 用法Qstatic_cast < type-id > ( expression ) 该运符把expression转换为type-idcdQ但没有q行时类型检查来保证转换的安全性。它主要有如下几U用法: ①用于类层次l构中基cd子类之间指针或引用的转换?/p>
q行上行转换Q把子类的指针或引用转换成基c表C)是安全的Q?/p>
q行下行转换Q把基类指针或引用{换成子类表示Q时Q由于没有动态类型检查,所以是不安全的?/p>
②用于基本数据类型之间的转换Q如把int转换成charQ把int转换成enum。这U{换的安全性也要开发h员来保证?/p>
③把I指针{换成目标cd的空指针?/p>
④把Mcd的表辑ּ转换成voidcd?/p>
注意Qstatic_cast不能转换掉expression的const、volitale、或者__unaligned属性?/p>
2 dynamic_cast 用法Qdynamic_cast < type-id > ( expression ) 该运符把expression转换成type-idcd的对象。Type-id必须是类的指针、类的引用或者void *Q?/p>
如果type-id是类指针cdQ那么expression也必L一个指针,如果type-id是一个引用,那么expression也必L一个引用?/p>
dynamic_cast主要用于cdơ间的上行{换和下行转换Q还可以用于cM间的交叉转换?/p>
在类层次间进行上行{换时Qdynamic_cast和static_cast的效果是一LQ?/p>
在进行下行{换时Qdynamic_casthcd查的功能Q比static_cast更安全?/p>
class B{ public: int m_iNum; virtual void foo(); }; class D:public B{ public: char *m_szName[100]; }; void func(B *pb){ D *pd1 = static_cast<D *>(pb); D *pd2 = dynamic_cast<D *>(pb); } 在上面的代码D中Q如果pb指向一个Dcd的对象,pd1和pd2是一LQƈ且对q两个指针执行Dcd的Q何操作都是安全的Q?/p>
但是Q如果pb指向的是一个Bcd的对象,那么pd1是一个指向该对象的指针,对它q行Dcd的操作将是不安全的(如访问m_szNameQ, 而pd2是一个空指针?/p>
另外要注意:B要有虚函敎ͼ否则会编译出错;static_cast则没有这个限制?/p>
q是׃q行时类型检查需要运行时cd信息Q而这个信息存储在cȝ虚函数表Q?/p>
关于虚函数表的概念,详细可见<Inside c++ object model>Q中Q只有定义了虚函数的cL有虚函数表, 没有定义虚函数的cL没有虚函数表的?/p>
另外Qdynamic_castq支持交叉{换(cross castQ。如下代码所C?/p>
class A{ public: int m_iNum; virtual void f(){} }; class B:public A{ }; class D:public A{ }; void foo(){ B *pb = new B; pb->m_iNum = 100; D *pd1 = static_cast<D *>(pb); //compile error D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULL delete pb; } 在函数foo中,使用static_castq行转换是不被允许的Q将在编译时出错Q而?dynamic_cast的{换则是允许的Q结果是I指针?/p>
3 reinterpret_cast 用法Qreinterpret_cast<type-id> (expression) type-id必须是一个指针、引用、算术类型、函数指针或者成员指针?/p>
它可以把一个指针{换成一个整敎ͼ也可以把一个整数{换成一个指针(先把一个指针{换成一个整敎ͼ 在把该整数{换成原类型的指针Q还可以得到原先的指针|?/p>
该运符的用法比较多?/p>
(static_cast .? reinterpret_cast比较Q见下面 ) 4 const_cast 用法Qconst_cast<type_id> (expression) 该运符用来修改cd的const或volatile属性。除了const 或volatile修饰之外Q?type_id和expression的类型是一L?/p>
帔R指针被{化成非常量指针,q且仍然指向原来的对象; 帔R引用被{换成非常量引用,q且仍然指向原来的对象;帔R对象被{换成非常量对象?/p>
Voiatile和constc试。D如下一例: class B{ public: int m_iNum; } void foo(){ const B b1; b1.m_iNum = 100; //comile error B b2 = const_cast<B>(b1); b2. m_iNum = 200; //fine } 上面的代码编译时会报错,因ؓb1是一个常量对象,不能对它q行改变Q?/p>
使用const_cast把它转换成一个常量对象,可以对它的数据成员L改变。注意:b1和b2是两个不同的对象?/p>
== =========================================== == dynamic_cast .vs. static_cast == =========================================== class B { ... }; class D : public B { ... }; void f(B* pb) { D* pd1 = dynamic_cast<D*>(pb); D* pd2 = static_cast<D*>(pb); } If pb really points to an object of type D, then pd1 and pd2 will get the same value. They will also get the same value if pb == 0. If pb points to an object of type B and not to the complete D class, then dynamic_cast will know enough to return zero. However, static_cast relies on the programmer’s assertion that pb points to an object of type D and simply returns a pointer to that supposed D object. 即dynamic_cast可用于承体pM的向下{型,卛_基类指针转换为派生类指针Q比static_cast更严格更安全。dynamic_cast在执行效率上比static_cast要差一些,但static_cast在更宽上范围内可以完成映,q种不加限制的映伴随着不安全性。static_cast覆盖的变换类型除cdơ的静态导航以外,q包括无映射变换、窄化变?q种变换会导致对象切?丢失信息)、用VOID*的强制变换、隐式类型变换等... == =========================================== == static_cast .vs. reinterpret_cast == ================================================ reinterpret_cast是ؓ了映到一个完全不同类型的意思,q个关键词在我们需要把cd映射回原有类型时用到它。我们映到的类型仅仅是Z故弄玄虚和其他目的,q是所有映中最危险的?q句话是C++~程思想中的原话) static_cast ?reinterpret_cast 操作W修改了操作数类型。它们不是互逆的Q?static_cast 在编译时使用cd信息执行转换Q在转换执行必要的检?诸如指针界计算, cd?. 其操作数相对是安全的。另一斚wQreinterpret_cast 仅仅是重新解释了l出的对象的比特模型而没有进行二q制转换Q?例子如下Q?/p>
int n=9; double d=static_cast < double > (n); 上面的例子中, 我们一个变量从 int 转换?double?q些cd的二q制表达式是不同的?要将整数 9 转换?双精度整?9Qstatic_cast 需要正地为双_ֺ整数 d 补比特位。其l果?9.0。而reinterpret_cast 的行为却不同: int n=9; double d=reinterpret_cast<double & > (n); q次, l果有所不同. 在进行计以? d 包含无用? q是因ؓ reinterpret_cast 仅仅是复?n 的比特位?d, 没有q行必要的分? 因此, 你需要}慎?reinterpret_cast. Wt(韛_'witty')是一个C++库,用以开发交互性Web应用?/p>
Wt的API以widgetZ?/b>Q将桌面GUI APIs的良好测试模式引入Web开发?Wt为开发者提供了几乎所有Web实现l节的抽象,其中包括事g处理、图像支持、优雅降U(或渐q增强)、及良好的URL处理?/p>
与其他诸多基于页面的开发框架相比,Wt可以创徏状态化的应用,同时实现了高度的交互性和可访问性;其交互性体现在Wt可以l合使用各种技术,如Ajax{;其可讉K性体现在Wt可以使应用在必要的时候支持纯HTML览器;q些Ҏ的获得充分利用了自动的优雅降或渐q增?/b>?/p>
Wt库还自带了应用服务器E序Q可配置为独立的Web服务器,当然也允讔R过FastCGIq同其他Web服务器进行整合?/p>
Z面的开发框Ӟ如PHP、JSP/JSF、Ruby on Rails{)没有实现底层基础技术的抽象Q这些技术包括HTML/XHTML、JavaScript、CSS、Ajax、Forms、DHTML 、SVG/VML/Canvas{。显ӞZ面的开发框架必要求开发者随时熟悉和掌握q些基本技术,同时当浏览器不支持时Q还要ؓ应用的优雅降U负责。另外,如果应用采取早期HTML面Z心的设计模式Q开发者不仅要实现控制器以告诉用户如何从一个页面蟩转到另一个页面,而且q要在采用一些高UAjax技术时手工设计和维护客L与服务器端的通讯?/p>
另一斚wQ就是Ua的Ajax框架Q也要求开发者通过J杂的JavaScript~程来处理浏览器的怪异行ؓ和客L与服务器端间的安全通讯Q这些处理Q何h都不能蟩q去不与理会。同Ӟq些应用通常不能W合可访问性的原则Q也不能很好被搜索机器h索引到?/p>
安全斚wQ生成HTML或填充HTML模版很容易导致安全问题,?a >跨站脚本QXSSQ??a > 跨站h伪造(CSRFQ?/a>QXSS问题一般由Q疏忽)允许嵌入JavaScript代码引vQ?CSRF问题一般由Q相信)CookiesQ可Q作证手D引赗作为开发者,q些安全问题是很难避免的,因ؓ我们有时需要允许用h入自qJavaScript 代码来实现某些功能,但开发框架本w却没提供给我们qo机制?/p>
相反Q用Wt来部|Web应用可以完全用C++来开发,Wt自动产生所必须?HTML/XHTML、CSS、Javascript、CGI、SVG/VML/Canvas和Ajax代码Q与此同Ӟ代码的安全性和览器兼Ҏ等问题都将转交lWt。例如,在可能的情况下, Wt最大限度的使用JavaScript和AjaxQ但在Ajax功能受限ӞWt也能保证pȝ功能q行正常。其原理是Wt先启用UHTML/CGI应用Q随后在可能的情况下渐进增强至Ajax应用。另外,Wt提供了内|的安全性考虑?/p>
]]>
而对于非int行,目前为止Q所有的cd分配的字节数都是兼容的,即不同^台对于同一个类型分配相同的字节敎ͼQ?br />
Q在代码中尽量避免用intcdQ根据不同的需要可以用short,long,unsigned int {代ѝ?br />
下面是各个类型一览表【{?br />数据cd名称 字节?/strong> 别名 取D?/font> int * signed,signed int ?a target="_blank">操作pȝ军_Q即与操作系l的Q字长"有关 unsigned int * unsigned 由操作系l决定,即与操作pȝ的"字长Q有?/font> __int8 1 char,signed char ?28 ?127 __int16 2 short,short int,signed short int ?2,768 ?32,767 __int32 4 signed,signed int ?,147,483,648 ?2,147,483,647 __int64 8 ?/font> ?,223,372,036,854,775,808 ?9,223,372,036,854,775,807 bool 1 ?/font> false ?true char 1 signed char ?28 ?127 unsigned char 1 ?/font> 0 ?255 short 2 short int,signed short int ?2,768 ?32,767 unsigned short 2 unsigned short int 0 ?65,535 long 4 long int,signed long int ?,147,483,648 ?2,147,483,647 long long 8 none (but equivalent to __int64) ?,223,372,036,854,775,808 ?9,223,372,036,854,775,807 unsigned long 4 unsigned long int 0 ?4,294,967,295 enum * ?/font> 由操作系l决定,即与操作pȝ的"字长Q有?/font> float 4 ?/font> 3.4E +/- 38 (7 digits) double 8 ?/font> 1.7E +/- 308 (15 digits) long double 8 ?/font> 1.7E +/- 308 (15 digits) wchar_t 2 __wchar_t 0 ?65,535 cd标识W?/td> cd说明 长度
Q字节)范围 备注 char 字符?/td> 1 -128 ~ 127 -27 ~ (27 -1) unsigned char 无符字符?/td> 1 0 ~ 255 0 ~ (28 -1) short int 短整?/td> 2 -32768 ~ 32767 2-15 ~ (215 - 1) unsigned short int 无符短整?/td> 2 0 ~ 65535 0 ~ (216 - 1) int 整型 4 -2147483648 ~ 2147483647 -231 ~ (231 - 1) unsigned int 无符整型 4 0 ~ 4294967295 0 ~ (232-1) float 实型Q单_ֺQ?/td> 4 1.18*10-38 ~ 3.40*1038 7位有效位 double 实型Q双_ֺQ?/td> 8 2.23*10-308 ~ 1.79*10308 15位有效位 long double 实型Q长双精度) 10 3.37*10-4932 ~ 1.18*104932 19位有效位
]]>
]]>
]]>
]]>
/*++
TCP Header Format
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
attached:完整附g
]]>
/**/
/*
**********************************************************************
*/
//
int a2i(const char *s) 函数原Ş
//
功能: 把s所指向的字W串转换成intcd;
//
q回|字符串的转换倹{?br />
//
//
double a2f(const char *s) 函数原Ş
//
功能: 把s所指向的字W串转换成doublecd;
//
q回|字符串的转换倹{?/span>
/**/
/*
**********************************************************************
*/
int
a2i(
const
char
*
s)
{
int
sign
=
1
,num
=
0
;
if
(
*
s
==
'
-
'
)
sign
=-
1
;
else
if
(
*
s
==
'
+
'
)
sign
=
1
;
s
++
;
while
((
*
s)
!=
'
\0
'
)
{
num
=
num
*
10
+
(
*
s
-
'
0
'
);
s
++
;
}
return
num
*
sign;
}
double
a2f(
const
char
*
s)
{
bool
bDot
=
false
;
double
result
=
0
;
int
sign
=
1
;
if
(
*
s
==
'
-
'
)
{
sign
=-
1
;
}
else
if
(
*
s
==
'
+
'
)
{
sign
=
1
;
}
s
++
;
double
temp
=
1
;
while
((
*
s)
!=
'
\0
'
)
{
if
(
*
s
==
'
.
'
)
{bDot
=
true
;s
++
;}
if
(
!
bDot)
{
result
=
result
*
10
+
(
*
s
-
'
0
'
);
}
else
{
temp
*=
10
;
result
=
result
+
(
*
s
-
'
0
'
)
/
temp;
}
s
++
;
}
return
sign
*
result;
}
]]>交互性、安全性、可讉K?/h4>
典型应用NQ?/h4>
使用Wt的其他好?/h4>
]]>
最q学习PE文gQ《Y件加密技术内q》第一章有详细的讲?br />不过看了半天搞的头到晕了Q结构太多,最后自己查看WINNT.H头文?br />把PE头中的结构画了一张图Q在看书学习的时候边看书边看囑֭习理解较快!
有什么错误请高手指正Q谢谢!
其次强烈大家看《Y件加密技术内q》第一章配合本图,效果不错哦!
附上自己写的一个PE文g查看器,单。里面用了一些《Y件加密技术内q?br />光盘中的代码Q用MFC写的Q?br />错误在所隑օQ恳请大家指正!
PE文g查看器源?/a>
转自Q?a >http://bbs.pediy.com/showthread.php?t=62693&highlight=rar
]]>
下面的表格是我整理的 BMP 文g头的格式?/span>
方便大家查询?/span>
Bmp 的文件头?/span> 54 , 以下都是 24 bit,
如果 囑փ大小?/span> 720 * 480 , 那么文g大小?/span> : 54 + 720 * 480 *3 很好理解 ,
如果
囑փ大小?/span>
333 * 333
那么文g大小׃?/span>
: 54 + 333 * 333 *3
?/span>
,
奇怪么
?,
ȝ引出高h了,我就公布{案吧:
如果囑փ大小?/span> 1*7 那么文g大小是: 54 + 1*7*3 + 7*n ?/span>,
如果囑փ大小?/span> 3*5 那么文g大小是: 54 + 3*5*3 + 5*n ?/span>,
如果囑փ大小?/span> 11*77 那么文g大小是: 54 + 11*77*3 + 77*n ?/span>,
M是如果width * high * 3 + high * n Q= 4的倍数Q?那么文g大小是 54 + width * high * 3 + high*n 了?br />
n的取D围是 0 ~~3 直到下来,size?的倍数?br />
转自Q?a >http://www.cnitblog.com/dvb-dvb/archive/2009/07/06/59865.aspx
In Windows XP, Windows Server 2003, and earlier versions of the Windows operating system, all services run in the same session as the first user who logs on to the console. This session is called Session 0. Running services and user applications together in Session 0 poses a security risk because services run at elevated privilege and therefore are targets for malicious agents who are looking for a means to elevate their own privilege level.
The Microsoft Windows Vista operating system mitigates this security risk by isolating services in Session 0 and making Session 0 non-interactive. In Windows Vista (and Windows Longhorn Server), only system processes and services run in Session 0. The user logs on to Session 1. On Windows Longhorn Server, subsequent users log on to subsequent sessions (Session 2, Session 3 etc). This means that services never run in the same session as users' applications and are therefore protected from attacks that originate in application code.
Specific examples of affected driver classes include:
Application classes affected by this feature:
Sessions in Windows XP / 2003
OK - so we've already mentioned that Session 0 poses a security risk because services run at elevated privilege. The first user on the console also runs in Session 0 - which provides the most common attack vector used to target unsuspecting users.
Sessions in Windows Vista
In Windows Vista, Session 0 is created for services and user-mode drivers. Session 1 is created for the first user who logs in. Applications for this user run in Session 1.
OK - so what could this actually look like in a real world scenario? Consider the following example - if a service belonging to an application generates a UI element in Session 0 - for example a dialog box waiting for the user to click "OK" or "Cancel", the application is now waiting on the service, and the UI is not displayed in the user session. From the user perspective, the application appears to be hung, when in actual fact it is performing quite normally, and patiently waiting for a user response that the user cannot see!
As you can imagine - this presents a problem for users, administrators and developers. However, there are some quick mitigating factors to consider.
When testing applications for compatibility with Windows Vista, consider the following test scenarios:
Finally, you can leverage the following Windows Vista capability solutions:
And that will do it for a quick look at how Session 0 isolation affects Application Compatibility in Windows Vista. The links below contain more information on some of the concepts discussed above. Until next time ...
有个郁闷的问题,?003sp1下,不管是提升进E权限还是修改内存包含属性都成功Qdebug版本能成功!release׃娘的M成功Q郁hQ遍寻高手无着落,暂时{着先。。?/p>
1 q程与进E通信
q程是装入内存ƈ准备执行的程序,每个q程都有U有的虚拟地址I间Q由代码、数据以及它可利用的pȝ资源(如文件、管道等)l成。多q程/多线E是Windows操作pȝ的一个基本特征。Microsoft Win32应用~程接口(Application Programming Interface, API)提供了大量支持应用程序间数据׃n和交换的机制Q这些机制行使的zdUCؓq程间通信(InterProcess Communication, IPC)Q进E通信是指不同进E间q行数据׃n和数据交换?br /> 正因Z用Win32 APIq行q程通信方式有多U,如何选择恰当的通信方式成为应用开发中的一个重要问题,下面本文对Win32中进E通信的几U方法加以分析和比较?
2 q程通信Ҏ
2.1 文g映射
文g映射(Memory-Mapped Files)能ɘq程把文件内容当作进E地址区间一块内存那h对待。因此,q程不必使用文gI/O操作Q只需单的指针操作可d和修Ҏ件的内容?br /> Win32 API允许多个q程讉K同一文g映射对象Q各个进E在它自q地址I间里接收内存的指针。通过使用q些指针Q不同进E就可以L修改文g的内容,实现了对文g中数据的׃n?br /> 应用E序有三U方法来使多个进E共享一个文件映对象?br /> (1)l承Q第一个进E徏立文件映对象,它的子进E承该对象的句柄?br /> (2)命名文g映射Q第一个进E在建立文g映射对象时可以给该对象指定一个名?可与文g名不?。第二个q程可通过q个名字打开此文件映对象。另外,W一个进E也可以通过一些其它IPC机制(有名道、邮件槽{?把名字传l第二个q程?br /> (3)句柄复制Q第一个进E徏立文件映对象,然后通过其它IPC机制(有名道、邮件槽{?把对象句柄传递给W二个进E。第二个q程复制该句柄就取得对该文g映射对象的访问权限?br /> 文g映射是在多个q程间共享数据的非常有效ҎQ有较好的安全性。但文g映射只能用于本地机器的进E之_不能用于|络中,而开发者还必须控制q程间的同步?br />2.2 ׃n内存
Win32 API中共享内?Shared Memory)实际是文g映射的一U特D情c进E在创徏文g映射对象时用0xFFFFFFFF来代替文件句?HANDLE)Q就表示了对应的文g映射对象是从操作pȝ面文g讉K内存Q其它进E打开该文件映对象就可以讉K该内存块。由于共享内存是用文件映实现的Q所以它也有较好的安全性,也只能运行于同一计算Z的进E之间?br />2.3 匿名道
道(Pipe)是一U具有两个端点的通信通道Q有一端句柄的q程可以和有另一端句柄的q程通信。管道可以是单向Q一端是只读的,另一端点是只写的Q也可以是双向的一道的两端点既可M可写?br /> 匿名道(Anonymous Pipe)?在父q程和子q程之间Q或同一父进E的两个子进E之间传输数据的无名字的单向道。通常qq程创徏道Q然后由要通信的子q程l承通道的读端点句柄或写 端点句柄Q然后实现通信。父q程q可以徏立两个或更多个承匿名管道读和写句柄的子q程。这些子q程可以使用道直接通信Q不需要通过父进E?br /> 匿名道是单Z实现子进E标准I/O重定向的有效ҎQ它不能在网上用,也不能用于两个不相关的进E之间?br />2.4 命名道
命名道(Named Pipe)是服务器q程和一个或多个客户q程之间通信的单向或双向道。不同于匿名道的是命名道可以在不相关的进E之间和不同计算Z间用,服务器徏立命名管道时l它指定一个名字,Mq程都可以通过该名字打开道的另一端,Ҏl定的权限和服务器进E通信?br /> 命名道提供了相对简单的~程接口Q通过|络传输数据q不比同一计算Z两进E之间通信更困难,不过如果要同时和多个q程通信它就力不从心了?br />2.5 邮g?br /> 邮g?Mailslots)?供进E间单向通信能力QQ何进E都能徏立邮件槽成ؓ邮g槽服务器。其它进E,UCؓ邮g槽客P可以通过邮g槽的名字l邮件槽服务器进E发送消息。进来的?息一直放在邮件槽中,直到服务器进E读取它为止。一个进E既可以是邮件槽服务器也可以是邮件槽客户Q因此可建立多个邮g槽实现进E间的双向通信?br /> 通过邮g槽可以给本地计算Z的邮件槽、其它计机上的邮g槽或指定|络区域中所有计机上有同样名字的邮件槽发送消息。广播通信的消息长度不能超q?00字节Q非q播消息的长度则受邮件槽服务器指定的最大消息长度的限制?br /> 邮g槽与命名道怼Q不q它传输数据是通过不可靠的数据?如TCP/IP协议中的UDP?完成的,一旦网l发生错误则无法保证消息正确地接Ӟ而命名管道传输数据则是徏立在可靠q接基础上的。不q邮件槽有简化的~程接口和给指定|络区域内的所有计机q播消息的能力,所以邮件槽不失为应用程序发送和接收消息的另一U选择?br />2.6 剪脓?br /> 剪脓?Clipped Board)实质是Win32 API中一l用来传输数据的函数和消息,为Windows应用E序之间q行数据׃n提供了一个中介,Windows已徏立的剪切(复制)Q粘贴的机制Z同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时Q应用程序把选取的数据用一U或多种格式攑֜剪脓板上。然后Q何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式?br /> 剪脓板是一个非常松散的交换媒介Q可以支持Q何数据格式,每一格式׃无符h数标识,Ҏ?预定?剪脓板格式,该值是Win32 API定义的常量;寚w标准格式可以使用Register Clipboard Format函数注册为新的剪贴板格式。利用剪贴板q行交换的数据只需在数据格式上一致或都可以{化ؓ某种格式p。但剪脓板只能在ZWindows的程序中使用Q不能在|络上用?br />2.7 动态数据交?br /> 动态数据交?DDE)是用共享内存在应用E序之间q行数据交换的一U进E间通信形式。应用程序可以用DDEq行一ơ性数据传输,也可以当出现新数据时Q通过发送更新值在应用E序间动态交换数据?br /> DDE和剪贴板一h支持标准数据格式(如文本、位囄)Q又可以支持自己定义的数据格式。但它们的数据传输机制却不同Q一个明昑别是剪脓板操作几乎L用作对用h定操作的一ơ性应{-如从菜单中选择Paste命o。尽DDE也可以由用户启动Q但它l发挥作用一般不必用戯一步干预。DDE有三U数据交换方式:
(1) 冷链Q数据交换是一ơ性数据传输,与剪贴板相同?br /> (2) 温链Q当数据交换时服务器通知客户Q然后客户必请求新的数据?br /> (3) 热链Q当数据交换时服务器自动l客户发送数据?br /> DDE交换可以发生在单机或|络中不同计机的应用程序之间。开发者还可以定义定制的DDE数据格式q行应用E序之间特别目的IPCQ它们有更紧密耦合的通信要求。大多数ZWindows的应用程序都支持DDE?br />2.8 对象q接与嵌?br /> 应用E序利用对象q接与嵌?OLE)技术管理复合文?由多U数据格式组成的文档)QOLE提供使某应用E序更容易调用其它应用程序进行数据编辑的服务。例如,OLE支持的字处理器可以嵌套电子表|当用戯~辑电子表格时OLE库可自动启动电子表格~辑器。当用户退出电子表格编辑器Ӟ该表格已在原始字处理器文档中得到更新。在q里电子表格~辑器变成了字处理器的扩展,而如果用DDEQ用戯昑ּ地启动电子表格编辑器?br /> 同DDE技术相同,大多数基于Windows的应用程序都支持OLE技术?br />2.9 动态连接库
Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进E共享,q就又给q程间通信开辟了一条新的途径Q当然访问时要注意同步问题?br /> 虽然可以通过DLLq行q程间数据共享,但从数据安全的角度考虑Q我们ƈ不提倡这U方法,使用带有讉K权限控制的共享内存的Ҏ更好一些?br />2.10 q程q程调用
Win32 API提供的远E过E调?RPC)使应用程序可以用远E调用函敎ͼq在网l上用RPCq行q程通信像函数调用那样单。RPC既可以在单机不同q程间用也可以在网l中使用?br /> ׃Win32 API提供的RPC服从OSF-DCE(Open Software Foundation Distributed Computing Environment)标准。所以通过Win32 API~写的RPC应用E序能与其它操作pȝ上支持DEC的RPC应用E序通信。用RPC开发者可以徏立高性能、紧密耦合的分布式应用E序?br />2.11 NetBios函数
Win32 API提供NetBios函数用于处理低|络控制Q这主要是ؓIBM NetBiospȝ~写与Windows的接口。除非那些有Ҏ低|络功能要求的应用程序,其它应用E序最好不要用NetBios函数来进行进E间通信?br />2.12 Sockets
Windows Sockets规范是以U.C.Berkeley大学BSD UNIX中流行的Socket接口例定义的一套Windows下的|络~程接口。除了Berkeley Socket原有的库函数以外Q还扩展了一l针对Windows的函敎ͼ使程序员可以充分利用Windows的消息机制进行编E?br /> 现在通过Sockets实现q程通信的网l应用越来越多,q主要的原因是Sockets的跨q_性要比其它IPC机制好得多,另外WinSock 2.0不仅支持TCP/IP协议Q而且q支持其它协?如IPX)。Sockets的唯一~点是它支持的是底层通信操作Q这使得在单机的q程间进行简单数据传递不太方便,q时使用下面介l的WM_COPYDATA消息更合适些?br />2.13 WM_COPYDATA消息
WM_COPYDATA是一U非常强大却鲜ؓ人知的消息。当一个应用向另一个应用传送数据时Q发送方只需使用调用SendMessage函数Q参数是目的H口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息Q这h发双方就实现了数据共享?br /> WM_COPYDATA是一U非常简单的ҎQ它在底层实际上是通过文g映射来实现的。它的缺Ҏ灉|性不高,q且它只能用于Windowsq_的单机环境下?
在网上搜了几个序列号Q安装的时候能安装但是当你再次启动软g的时候,他就已经和adob官网q行了连接自动检,可想而知Q序列号无效了?/p>
破解Ҏ
序列P
1330-1082-3503-2270-3738-6738
1330-1776-8671-6289-7706-2916
1330-1567-6599-8775-4155-3745
l对能用Q!Q!
W一步:下蝲完YӞ要先解压出来?/p>
W二步:安装Q到了输入注册码界面Ӟ选试?0天的选项Q不要输入注册码。安装界面是全中文的Q安装完软g是英文的?/p>
W三步:打开软gQ会跛_输入注册码界面,使用上面的注册码Q输入,点下一步,qY件?/p>
W四步:先退YӞ扑ֈC:\WINDOWS\system32\drivers\etc里面的hosts文g,L其只ȝ属性,双击打开Q选用C本打开Q?/p>
输入127.0.0.1 activate.adobe.comQ中间有个空|Q保存,退? 屏蔽adobeȀzL务器?br />q不攑ֿQ将下面全部|址dq去.
下列网址加入HOSt
127.0.0.1 activate.adobe.com
127.0.0.1 practivate.adobe.com
127.0.0.1 ereg.adobe.com
127.0.0.1 activate.wip3.adobe.com
127.0.0.1 wip3.adobe.com
127.0.0.1 3dns-3.adobe.com
127.0.0.1 3dns-2.adobe.com
127.0.0.1 adobe-dns.adobe.com
127.0.0.1 adobe-dns-2.adobe.com
127.0.0.1 adobe-dns-3.adobe.com
127.0.0.1 ereg.wip3.adobe.com
127.0.0.1 activate-sea.adobe.com
127.0.0.1 wwis-dubc1-vip60.adobe.com
127.0.0.1 activate-sjc0.adobe.com
W五步:再打开软gQok。(若不q行W四步,再启动Y件时Q又会蟩出激zȝ面)?/p>
q个主要是ؓ了屏蔽Y件与官方服务器连接的啊,如果软g惌接的话就让它不要q接官方了,q接本机可以了。避免再ơ出现激zȝ面的啊?/p>
再依ơ打开 H口->扩展功能->q接->三角Ş q接及脱机选项讄不连接网l?/p>
一、什么是Unicode
先从ASCII说vQASCII是用来表C文字W的一U编码规范。每个ASCII字符占用1个字节,因此QASCII~码可以表示的最大字W数?55Q?0H—FFHQ。其实,英文字符q没有那么多Q一般只用前128个(00H?FHQ最高位?Q,其中包括了控制字W、数字、大写字母和其它一些符受而最高位?的另128个字W(80H—FFHQ被UCؓ“扩展ASCII”,一般用来存放英文的制表W、部分音标字W等{的一些其它符受?br /> q种字符~码规则昄用来处理英文没有什么问题。但是面对中文、阿拉伯文等复杂的文字,255个字W显然不够用?br />于是Q各个国家纷U制定了自己的文字编码规范,其中中文的文字编码规范叫做“GB2312?0”,它是和ASCII兼容的一U编码规范,其实是利用扩展ASCII没有真正标准化这一点,把一个中文字W用两个扩展ASCII字符来表C,以区分ASCII码部分?br /> 但是q个Ҏ有问题,最大的问题是中文的文字编码和扩展ASCII码有重叠。而很多Y件利用扩展ASCII码的英文制表W来画表|q样的Y件用C文系l中Q这些表格就会被误认作中文字W,出现q?br /> 另外Q由于各国和各地区都有自q文字~码规则Q它们互相冲H,q给各国和各地区交换信息带来了很大的ȝ?br />要真正解册个问题,不能从扩展ASCII的角度入手,而必L一个全新的~码pȝQ这个系l要可以中文、法文、d文……等{所有的文字l一h考虑Qؓ每一个文字都分配一个单独的~码?/p>
于是QUnicode诞生了?/p>
Unicode也是一U字W编码方法,它占用两个字节(0000H—FFFFHQ?容纳65536个字W,q完全可以容U_世界所有语a文字的编码?br />在Unicode里,所有的字符被一视同仁,汉字不再使用“两个扩展ASCII”,而是使用?个Unicode”,也就是说Q所有的文字都按一个字W来处理Q它们都有一个唯一的Unicode码?/p>
二、用Unicode~码的好?/p>
使用Unicode~码可以使您的工E同时支持多U语aQ您的工程国际化?br /> 另外QWindows NT是用Unicodeq行开发的Q整个系l都是基于Unicode的。如果调用一个API函数q给它传递一个ANSIQASCII字符集以及由此派生ƈ兼容的字W集Q如QGB2312Q通常UCؓANSI字符集)字符Ԍ那么pȝ首先要将字符串{换成UnicodeQ然后将Unicode字符串传递给操作pȝ。如果希望函数返回ANSI字符Ԍpȝ׃首先Unicode字符串{换成ANSI字符Ԍ然后结果返回给您的应用E序。进行这些字W串的{换需要占用系l的旉和内存。如果用Unicode来开发应用程序,p够您的应用E序更加有效地运行?br />
下面例D几个字符的编码以单演CANSI和Unicode的区别:
字符 | A | N | ?/td> |
ANSI?/td> | 41H | 4eH | cdbaH |
Unicode?/td> | 0041H | 004eH | 548cH |
三、用C++q行Unicode~程
对宽字符的支持其实是ANSI C标准的一部分Q用以支持多字节表示一个字W。宽字符和Unicodeq不完全{同QUnicode只是宽字W的一U编码方式?/p>
1、宽字符的定?/p>
在ANSI中,一个字W(charQ的长度Z个字节(ByteQ。用UnicodeӞ一个字W占据一个字QC++在wchar.h头文件中定义了最基本的宽字符cdwchar_tQ?/p>
typedef unsigned short wchar_t;
从这里我们可以清楚地看到Q所谓的宽字W就是无W号短整数?/p>
2、常量宽字符?/p>
对C++E序员而言Q构造字W串帔R是一经常性的工作。那么,如何构造宽字符字符串常量呢Q很单,只要在字W串帔R前加上一个大写的L可以了Q比如:
wchar_t *str1=L" Hello";
q个L非常重要Q只有带上它Q编译器才知道你要将字符串存成一个字W一个字。还要注意,在L和字W串之间不能有空根{?/p>
3、宽字符串库函数
Z操作宽字W串QC++专门定义了一套函敎ͼ比如求宽字符串长度的函数?/p>
size_t __cdel wchlen(const wchar_t*);
Z么要专门定义q些函数呢?最Ҏ的原因是QANSI下的字符串都是以’\0’来标识字符串尾的(Unicode字符串以“\0\0”结束)Q许多字W串函数的正操作均是以此ؓ基础q行。而我们知道,在宽字符的情况下Q一个字W在内存中要占据一个字的空_q就会操作ANSI字符的字W串函数无法正确操作。以”Hello”字W串ZQ在宽字W下Q它的五个字W是Q?br />0x0048 0x0065 0x006c 0x006c 0x006f
在内存中Q实际的排列是:
48 00 65 00 6c 00 6c 00 6f 00
于是QANSI字符串函敎ͼ如strlenQ在到W一?8后的00Ӟ׃认ؓ字符串到了Q用strlen对宽字符串求长度的结果就永远会是1Q?/p>
4、用宏实现对ANSI和Unicode通用的编E?/p>
可见QC++有一整套的数据类型和函数实现Unicode~程Q也是_您完全可以用C++实现Unicode~程?br />如果我们惌我们的程序有两个版本QANSI版本和Unicode版本。当Ӟ~写两套代码分别实现ANSI版本和Unicode版本完全是行得通的。但是,针对ANSI字符和Unicode字符l护两套代码是非帔R烦的事情。ؓ了减ȝE的负担QC++定义了一pd的宏Q帮助您实现对ANSI和Unicode的通用~程?br /> C++宏实现ANSI和Unicode的通用~程的本质是Ҏ”_UNICODE”(注意Q有下划U)定义与否Q这些宏展开为ANSI或Unicode字符Q字W串Q?/p>
如下是tchar.h头文件中部分代码摘抄Q?
#ifdef _UNICODE typedef wchar_t TCHAR; #define __T(x) L##x #define _T(x) __T(x) #else #define __T(x) x typedef char TCHAR; #endif可见Q这些宏Ҏ”_UNICODE?定义与否Q分别展开为ANSI或Unicode字符?tchar.h头文件中定义的宏可以分ؓ两类Q?
A、实现字W和帔R字符串定义的宏我们只列出两个最常用的宏Q?
? | 未定义_UNICODE(ANSI字符) | 定义了_UNICODE(Unicode字符) |
TCHAR | char | wchar_t |
_T(x) | x | L##x |
注意Q?br /> ?#”是ANSI C标准的预处理语法Q它叫做“粘贴符号”,表示前面的Ld到宏参数上。也是_如果我们写_T(“Hello?Q展开后即为L“Hello?/p>
B、实现字W串函数调用的宏
C++为字W串函数也定义了一pd宏,同样Q我们只例D几个常用的宏Q?/p>
? | 未定义_UNICODE(ANSI字符) | 定义了_UNICODE(Unicode字符) |
_tcschr | strchr | wcschr |
_tcscmp | strcmp | wcscmp |
_tcslen | strlen | wcslen |
四、用Win32 APIq行Unicode~程
Win32 API中定义了一些自q字符数据cd。这些数据类型的定义在winnt.h头文件中。例如:
typedef char CHAR; typedef unsigned short WCHAR; // wc, 16-bit UNICODE character typedef CONST CHAR *LPCSTR, *PCSTR;Win32 API在winnt.h头文件中定义了一些实现字W和帔R字符串的宏进行ANSI/Unicode通用~程。同P只例丑և个最常用的:
#ifdef UNICODE typedef WCHAR TCHAR, *PTCHAR; typedef LPWSTR LPTCH, PTCH; typedef LPWSTR PTSTR, LPTSTR; typedef LPCWSTR LPCTSTR; #define __TEXT(quote) L##quote // r_winnt #else /* UNICODE */ // r_winnt typedef char TCHAR, *PTCHAR; typedef LPSTR LPTCH, PTCH; typedef LPSTR PTSTR, LPTSTR; typedef LPCSTR LPCTSTR; #define __TEXT(quote) quote // r_winnt #endif /* UNICODE */ // r_winnt从以上头文g可以看出Qwinnt.hҎ是否定义了UNICODEQ没有下划线Q,q行条g~译?br /> Win32 API也定义了一套字W串函数Q它们根据是否定义了“UNICODE”分别展开为ANSI和Unicode字符串函数。如Qlstrlen。API的字W串操作函数和C++的操作函数可以实现相同的功能Q所以,如果需要的话,您尽可能使用C++的字W串函数Q没必要去花太多_֊再去学习API的这些东ѝ?br /> 也许您从来没有注意到QWin32 API实际上有两个版本。一个版本接受MBCS字符Ԍ另一个接受Unicode字符丌Ӏ例如:其实Ҏ没有SetWindowText()q个API函数Q相反,有SetWindowTextA()和SetWindowTextW()。后~A表明q是MBCS函数Q后~W表示q是Unicode版本的函数。这些API函数的头文g在winuser.h中声明,下面例Dwinuser.h中的SetWindowText()函数的声明部分:
#ifdef UNICODE #define SetWindowText SetWindowTextW #else #define SetWindowText SetWindowTextA #endif // !UNICODE可见QAPI函数Ҏ定义UNICODE与否军_指向Unicode版本q是MBCS版本?br /> l心的读者可能已l注意到了UNICODE和_UNICODE的区别,前者没有下划线Q专门用于Windows头文Ӟ后者有一个前~下划U,专门用于Cq行时头文g。换句话_也就是在ANSI C++语言里面Ҏ_UNICODEQ有下划U)定义与否Q各宏分别展开为Unicode或ANSI字符Q在Windows里面ҎUNICODEQ无下划U)定义与否Q各宏分别展开为Unicode或ANSI字符?br /> 在后面我们将会看刎ͼ实际使用中我们不加严格区分,同时定义_UNICODE和UNICODEQ以实现UNICODE版本~程?
五、VC++6.0中编写Unicode~码的应用程?
VC++ 6.0支持Unicode~程Q但默认的是ANSIQ所以开发h员只需要稍微改变一下编写代码的习惯便可以轻杄写支持UNICODE的应用程序?br /> 使用VC++ 6.0q行Unicode~程主要做以下几工作:
1、ؓ工程dUNICODE和_UNICODE预处理选项?
具体步骤Q打开[工程]->[讄…]对话框,如图1所C,在C/C++标签对话框的“预处理E序定义”中去除_MBCSQ加上_UNICODE,UNICODE。(注意中间用逗号隔开Q改动后如图2Q?/p>
图一
图二
在没有定义UNICODE和_UNICODEӞ所有函数和cd都默认用ANSI的版本;在定义了UNICODE和_UNICODE之后Q所有的MFCcdWindows API都变成了宽字节版本了?br />
2、设|程序入口点
因ؓMFC应用E序有针对Unicode专用的程序入口点Q我们要讄entry point。否则就会出现连接错误?br /> 讄entry point的方法是Q打开[工程]->[讄…]对话框,在Link늚Outputcd的Entry Point里填上wWinMainCRTStartup?/p>
图三
3、用ANSI/Unicode通用数据cd
微Y提供了一些ANSI和Unicode兼容的通用数据cdQ我们最常用的数据类型有_T QTCHARQLPTSTR,LPCTSTR?br /> Z说一下,LPCTSTR和const TCHAR*是完全等同的。其中L表示long指针Q这是ؓ了兼容Windows 3.1{?6位操作系l遗留下来的Q在Win32 中以及其它的32位操作系l中Qlong指针和near指针及far修饰W都是ؓ了兼容的作用Q没有实际意义。PQpointerQ表C是一个指针;CQconstQ表C是一个常量;T(_T?表示兼容ANSI和UnicodeQSTRQstringQ表C个变量是一个字W串。综上可以看出,LPCTSTR表示一个指向常固定地址的可以根据一些宏定义改变语义的字W串。比如:
TCHAR* szText=_T(“Hello!?; TCHAR szText[]=_T(“I Love You?; LPCTSTR lpszText=_T(“大家好Q?;使用函数中的参数最好也要有变化Q比如:
MessageBox(_T(“你好?);
其实Q在上面的语句中Q即使您不加_T宏,MessageBox函数也会自动把“你好”字W串q行强制转换。但我还是推荐您使用_T宏,以表C您有Unicode~码意识?
4、修改字W串q算问题
一些字W串操作函数需要获取字W串的字W数(sizeof(szBuffer)/sizeof(TCHAR))Q而另一些函数可能需要获取字W串的字节数sizeof(szBuffer)。您应该注意该问题ƈ仔细分析字符串操作函敎ͼ以确定能够得到正的l果?br />ANSI操作函数以str开_如strcpy()Qstrcat()Qstrlen()Q?br />Unicode操作函数以wcs开_如wcscpyQwcscpy()Qwcslen()Q?br />ANSI/Unicode操作函数以_tcs开?_tcscpy(Cq行期库)Q?br />ANSI/Unicode操作函数以lstr开?lstrcpy(Windows函数)Q?br />考虑ANSI和Unicode的兼容,我们需要用以_tcs开头或lstr开头的通用字符串操作函数?/p>
六、D个Unicode~程的例?/p>
W一步:
打开VC++6.0Q新建基于对话框的工EUnicodeQ主对话框IDD_UNICODE_DIALOG中加入一个按钮控Ӟ双击该控件ƈd该控件的响应函数Q?/p>
void CUnicodeDlg::OnButton1() { TCHAR* str1=_T("ANSI和UNICODE~码试验"); m_disp=str1; UpdateData(FALSE); }d静态文本框IDC_DISPQ用ClassWizardl该控gdCStringcd变量m_disp。用默认ANSI~码环境~译该工E,生成Unicode.exe?
W二步:
打开“控刉李쀝,单击“日期、时间、语a和区域设|”选项Q在“日期、时间、语a和区域设|”窗口中l箋单击“区域和语言选项”选项Q弹出“区域和语言选项”对话框。在该对话框中,单击“高U”标{,“非Unicode的程序的语言”选项改ؓ“日语”,单击“应用”按钮,如图四:
囑֛
弹出的对话框单击“是”,重新启动计算Z讄生效?br />q行Unicode.exeE序q单几ZButton1”按钮,看,静态文本框出现了ؕ码?/p>
W三步:
改ؓUnicode~码环境~译该工E,生成Unicode.exe。再ơ运行Unicode.exeE序q单几ZButton1”按钮。看到Unicode~码的优势了吧?/p>
pq些吧,您好运?/p>
ANSI/Unicode字符和字W串
TChar.h是String.h的修改,用于创徏ANSI/Unicode通用字符丌Ӏ?/p>
Unicode字符串的每个字符都是16位的?/p>
Win9x只支持ANSIQWin2000/XP/2003支持ANSI/UnicodeQWinCE只支持Unicode
附:有部分Unicode函数也可以在Win9X中用,但可能会出现意想不到错误?/p>
wchar_t是Unicode字符的数据类型?/p>
所有的Unicode函数均以wcs开_ANSI函数均以str开_ANSI C规定Cq行期库支持ANSI和Unicode
ANSI Unicode
char *strcat(char *, const char *) wchar_t *wcscat(wchar_t *, const wchar_t *)
char *strchr(const char * , int) wchar_t *wcschr(const wchar_t * , int)
int strcmp(const char *, const char *) int wcscmp(const wchar_t *, const wchar_t *)
char *strcpy(char *, const char *) wchar_t *wcscpy(wchar_t *, const wchar_t *)
size_t strlen(const char *) wchar_t wcslen(const wchar_t *)
L" wash " : 用于ANSI字符串{换ؓUnicode字符Ԍ
_TEXT(" wash ")Ҏ是否定义Unicode或_Unicodeq行转换?br /> 附:_Unicode用于Cq行库;Unicode用于Windows头文件?/p>
ANSI/Unicode通用数据cd
BothQANSI/UnicodeQ ?ANSI Unicode
LPCTSTR LPCSTR LPCWSTR
LPTSTR LPSTR LPWSTR
PCTSTR PCSTR PCWSTR
PTSTR PSTR PWSTR
TBYTE(TCHAR) CHAR WCHAR
在设计dll时最好提供ANSI和Unicode函数QANSI函数只用于分配内存,字W{换ؓUnicode字符Q然后调用Unicode函数?/p>
最好用操作系l函敎ͼ用或不实用Cq行期函?br /> egQ操作系l字W串函数QshlWApi.hQ?br /> StrCat(), StrChr(), StrCmp(), StrCpy(){?br /> 注意它们区分大小写,也区分ANSI和Unicode版本
附:ANSI版函数在原函数后加大写字母A
Unicode函数在原函数后加大写字母W
成ؓW合ANSI和Unicode的函?br /> ?文本串视ؓ字符数组Q而不是c h a r s数组或字节数l?br /> ?通用数据cdQ如T C H A R和P T S T RQ用于文本字W和字符丌Ӏ?br /> ?显式数据类型(如B Y T E和P B Y T EQ用于字节、字节指针和数据~存?br /> ?T E X T宏用于原义字W和字符丌Ӏ?br /> ?修改字符串运问??br /> 如:sizeof(szBuffer) -> sizeof(szBuffer) / sizeof(TCHAR)
malloc(charNum) -> malloc(charNum * sizeof(TCHAR))
对Unicode字符操作的函数还有:Q也有ANSI和Unicode版本Q?br /> lstrcat() , lstrcmp() / lstrcmpi()[ 它们在内部调用CompareString() ], lstrcpy(), lstrlen()
q些是作为宏实现的?/p>
Cq行期函敊W ?windows函数
tolower() PTSTR CharLower(PTSTR pszString)
toupper() PTSTR CharUpper(PTSTR pszString)
isalpha() BOOL IsCharAlpha(TCHAR ch)
BOOL ISCharAlphaNumeric(TCHAR ch)
islower() BOOL IsCharLower(TCHAR ch)
isupper() BOOL IsCharUpper(TCHAR ch)
print() wsprintf()
转换BufferQDWORD CharLowerBuffer(PTSTR pszString , DWORD cchString)
DWORD CharUpperBuffer(PTSTR pszString , DWORD cchString)
也可转换单个字符Q如QTCHAR cLowerCaseChar = CharLower((PTSTR)szString[0])
定字符是ANSI或Unicode
BOOL IsTextUnicode(
const VOID * pBuffer, //input buffer to be examined
int cb, //size of input buffer
LPINT lpi //options
)
附:此函数在Win9xpȝ中,没有实现代码Q始l返回FALSE
Unicode与ANSI之间的{?br /> char szA[40];
wchar szW[40];
// Normal sprintf : all string are ANSI
sprintf( szA , " %s " , " ANSI str ");
// Convert Unicode string to ANSI
sprintf( szA, " %S " , L" Unicode str ");
// Normal swprintf : all string are unicode
swprinf( szW , "%s" , L" Unicode str ");
// Convert ANSI String to Unicode
swprinf( szW, L"%S" , "ANSI str");
int MultiByteToWideChar(
UINT uCodePage, //code page, 0
DWORD dwFlags, //character-type options, 0
PCSTR pMultiByte, //source string Addr
int cchMultiByte, //source string byte length
PWSTR pWideCharStr, //Dest string Addr
int cchWideChar //Dest string char Nums
)
u C o d e P a g e参数用于标识一个与多字节字W串相关的代码页受d w F l a g s参数用于讑֮另一个控Ӟ它可以用重音W号之类的区分标记来影响字符。这些标志通常q不使用Q在d w F l a g s参数中传?。p M u l t i B y t e S t r参数用于讑֮要{换的字符Ԍ c c h M u l t i B y t e参数用于指明该字W串的长度(按字节计)。如果ؓc c h M u l t i B y t e参数传? 1Q那么该函数用于定源字W串的长度。{换后产生的U n i c o d e版本字符串将被写入内存中的缓存,其地址由p Wi d e C h a r S t r参数指定。必dc c h Wi d e C h a r参数中设定该~存的最大|以字Wؓ计量单位Q。如果调用M u l t i B y t e To Wi d e C h a rQ给c c h Wi d e C h a r参数传?Q那么该参数不执行字符串的转换Q而是q回Z转换取得成功所需要的~存的倹{?/p>
可以通过下列步骤多字节字符串{换成U n i c o d e{h字符Ԍ
1) 调用M u l t i B y t e To Wi d e C h a r函数Qؓp Wi d e C h a r S t r参数传递N U L LQؓc c h Wi d e C h a r参数传??br /> 2) 分配_的内存块Q用于存放{换后的U n i c o d e字符丌Ӏ该内存块的大小由前面对M u l t B y t e To Wi d e C h a r的调用返回?br /> 3) 再次调用M u l t i B y t e To Wi d e C h a rQ这ơ将~存的地址作ؓp Wi d e C h a r S t r参数来传递,q传递第一ơ调用M u l t i B y t e To Wi d e C h a r时返回的~存大小Q作为c c h Wi d e c h a r参数?br /> 4) 使用转换后的字符丌Ӏ?br /> 5) 释放U n i c o d e字符串占用的内存块?/p>
int WideCharToMultiByte(
UINT CodePage, // code page
DWORD dwFlags, // performance and mapping flags
LPCWSTR lpWideCharStr, // wide-character string
int cchWideChar, // number of chars in string
LPSTR lpMultiByteStr, // buffer for new string
int cbMultiByte, // size of buffer
LPCSTR lpDefaultChar, // default for unmappable chars
LPBOOL lpUsedDefaultChar // set when default char used
)
我们军_写这比较文章是因ؓ我们期望更多的h能正地询问我们Z他们要用Ice代替CORBA。对q个问题Q我们通常的回{是Qؓ什么不先自p试?Ice呢?我们敢肯定,一旦你使用了Ice有一D|_你就永远不会再想用回CORBA。请怿我们Q很Ҏ会喜Ƣ上IceQ因为它优雅、简单,它的l构一致性,而且最后一点:臛_它没有大量的Ҏ和工具?/p>
对于没有旉去试验Ice来了解它的hQ这里有一些原因让我们怿Ice优于CORBAQ?/p>
1、Completeness(完备?
当我们说到完备性时Q我们的意思是实际产品的完备性,而不是从来未被实现的标准的完备性。我们相信Ice比市ZM单个CORBA更完备。你可以自己做一个检查:市场上有哪个CORBA产品提供了跟Ice可比较的Ҏ?
2、Performance(性能)
׃hCORBA所没有的结构优点,IcehH出的性能。Ice高效的协议、请求批量化、高效的事g分发都意味着Ice比CORBA ORBq行得更快,同时消耗更的U\带宽?/p>
3、No "Design by Committee"(非“委员会设计?
Ice׃专业的资深专家所设计。Ice没有设计成适合所有h的“万金a”。而CORBA则充斥着被具有特权的制定者加q到标准里的众多不切实际的特性,却又没有真正考虑到这些特性是否会被真正地实现?/p>
通常Qؓ了就CORBA标准达成一致的唯一Ҏ是之前大量实现的Ҏ放在一P生硬地塞q标准里。这D了标准越来越大,也越来越复杂Q超Z实际的需要。这也意味着q_更大更慢Q也因ؓ复杂的APID了难以用。Ice提供的API集小得多Q也更高效,比CORBA的API易于学习使用Qƈ且功能ƈ不少?/p>
4、Slice
SliceQIce的规范定义语aQ比CORBA IDL更小、更z、更强大。Sliceh更少的语al构Q但却更灉|。例如,一个内建的字典cd提供直接快速访问数据结构,异常的承允许更清晰地媄到支持异常处理的语a。同ӞSlice抛弃了CORBA IDL不需要的复杂性,例如属性,inout参数Q上下文和传值对?Objects-by-Value)的复杂性?/p>
5、Language Mappings(语言影射)
Ice支持到C++、Java、Python、PHP、C#和Visual Basic的语a影射。我们知道Q何一个CORBA实现提供商都没有提供那么多的语言影射选择?/p>
实际上大多数的CORBA提供商只提供C++和Java的媄,如果你想使用其它语言影射Q你p切换C同的提供商的产品或用没有实验支持的CORBA实现?/p>
6、Persistence(持久?
Sliceq不单单是一个接口定义语a。它也可以用来描qIce对象q行持久的属性,使得很容易写出支持对象持久的服务器端E序?/p>
7、Metadata(元数?
Slice支持可扩展的元数据设施,它允许Slice为实现应用程序相关的某些目的而用元数据的标记。例如元数据可以用于定制不同于标准Java影射方式的媄来满某些特定E序的要求?/p>
8、No any Type(没有any数据cd)
Ice 没有CORBA里Anycd的等h据类型。这对于CORBA用户来说可能感到很惊Ӟ因ؓAny数据cd在CORBA标准里被q泛C用。但是,Any 数据cd是多余的Q程序语a象Java和C++q没有Any数据cdQ而且Any数据cd对分布式pȝ来说也不是属于一个良好的设计。Any数据cd通常用在两种情况下:一U是需要在pȝ的中介部分对接收到的数据直接q行传递,而不用关心数据的真实cdQ例如CORBA的Event服务Q另一U是用来作ؓ union(联合l构?的一个等L?/p>
Ice可以通过发送和接收"blobs"的请求来满W一U情况,Slice的类l承可以满W二U情cQ何一U情况,Ice的程序都更高效,更加hcd安全Q更加容易设计和实现Q而不会遇C用CORBA Any数据cd时所h的复杂性?/p>
9、Ice Core(Ice的核?
虽着旉的演化,CORBA的核心变得异常的复杂。一个初U的例子要在POA(CORBA的对象适配?里面正确使用都需要很专业的知识,即你只x持一部分的技术特性。Ice的对象适配器,在另一斚w来说Q更加简单、直观、也跟POA一L功能强大Q定义良好的API使得比POA开发一个可扩展的程序项目需要更的工作?/p>
10、Ice Protocol(Ice协议)
IIOP是CORBA的弱点之一Q具有太多的设计~陷。例如,没有~少h的封装来防止消息的分发。低效的寚w规则D了多余的数据拯。数据的~码规则复杂Q却没有带来相应的性能的提高,对象引用的编码异常复杂,妨碍了有效的的编码和在内存共享的执行。代码集的协商是在标准下达成Q会遭遇到很多冲H。所有这些复杂性意味着IIOP很难实现Q带来了互操作性和性能上的问题。Ice的协议是单ƈ且更加有效,它提供了一些IIOP没有提供的特性,例如数据压羃和批h扚w化?/p>
11、Security(安全?
安全性是CORBA的最大的一个难题。OMG已经通过了多个标准,但很多都没有被广泛地实现QCORBA的客户依然没有一个可工作的安全的ORBs。当设计 IceӞ和CORBA相比Q安全性被认ؓ是基本的Ҏ。这是Ice提供一个真正能q作的SSL实现的安全的防火墙的原因?/p>
12、C++ Mapping(C++映射)
?C++来用CORBA非常困难。即使你是很有经验的C++开发者。CORBA的C++映射在内存管理和异常安全斚w有很多的陷阱和缺陗相较之下,Ice的C++映射非常单和直观。它不会有因为错误而导致内存的泄漏。要C的映规则的数目比CORBA的C++映射得多,而且Ice的C++ 映射是基于工业标准的STL?/p>
14、Scalability(可~?
当你是一个专家时QCORBA是一U可伸羃性很好的技术。但采用IceQQ何h都可以写出高可~性的应用。例如,Ice实现了一个持久化的逐出器,你可以用它来很Ҏ地处理上百万的对象,你所做的仅仅是在 Slice的定义里指定对象的数据,剩下的工作Ice一手包办:Iceq行库用高速的数据库来自动加蝲和保存对象?/p>
15、Versioning(版本?
CORBA没有M机制来支持对象状态的版本化。Freeze是Ice的持久服务,它允许持久数据在Slice的定义中改变Ӟ很容易地q行数据库的UL?/p>
16、Software Updates(软g更新)
IcePatch是一个允怽更行客户端Y件的工具。它使用压羃来提高数据的传输Qƈ使用校验值来保证一致性。CORBA完全没有提供一个在分布式环境来q行软g更新的机制?/p>
17、Typed Event Service(cd化的事g服务)
CORBA有一个标准来提供cd化的事g服务Q但很少甚至没有被实现。类型化的事件服务也有很多已知的问题Q事实上它在真正环境的部|是不可用的。Ice从一开始就提供了类型化事g的服务。IceStorm是一个高效、类型化事g服务的实玎ͼ它支持事件联盟?/p>
18、Facets(多接?
CORBA支持l承QDCOM支持聚合。在q去Q有很多关于那一U是更好的方法的争论。Ice以接口承加上以多接口Ş式的聚合来同时支持这两种方式。Facets允许你在q行的时候用动态的聚合来扩展类型来替代静态的l承?/p>
19、Asynchronous Messages(异步消息)
CORBA 支持异步消息调用(AMI)Q但很少CORBA产品实现了AMI。Ice一开始就以简单和有效的方式支持AMI。Ice也支持异步消息分?AMD)Q这是CORBA里完全没有的东西。AMD{h于客L的AMIQ不qAMD是用在服务器端的。用AMIQ你可以发送了一个请求,然后在以后的一个事件收到服务器的结果时调用一个回调函数来处理q回的结果。而用AMDQ你可以分发线E归q给IceQƈ在结果已l准备好发送到客户端时再次调用分发U程?AMI和AMD都能被连接v来,q允怽只消耗很的资源p构徏高效的\q序?/p>
AMI和AMD对客L和服务器端来说都是透明的。也是Q一个服务器E序不知道一个请求是否通过AMI调用发出的还是同步地调用发出的,客户端程序也不知道一个操作的调用在服务器端是通过AMD分发处理的还是同步地处理的。当需要用AMI和AMDӞ不用修改Slice?/p>
l束语:
我们希望上面的解释能另你Ȁ发你对Ice的兴。如果你有Q何的问题或解释,我们会邀请你加入我们的邮件列表。我们的目标是不断地改进IceQ因此你的反馈对我们来说是很有h值的?/p>
gigaboy译完成?005/7/4 3:02