致朋友: 

 

 

 

 


  
  感谢你来到 简单天空 。这是我的个人Blog。
 

 

       1,搜索引擎过来的朋友,请使用下面的搜索,资料绝对能找到~~
        2,另为各位博主站长提供合租服务,联系QQ: 574276001
            地址是:http://shop34202471.taobao.com/ 
  祝你使用愉快!

 

 


分类: C/C++预览模式: 普通 | 列表

最近用vs2008学习写ActiveX控件,在调试程序时遇到一个错误(环境win7)

“error PRJ0050: 未能注册输出。请确保您有修改注册表的相应权限。”

 

上网找了一下次问题的解决方案

工程设置的问题,VS2005建的STL工程中默认的设置是:

ALT的使用:动态链接到 ATL

查看更多...

分类:C/C++ | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 231

HRESULT(hresult)详解 解释注释2

HRESULT

 
  函数返回值。如果这个函数是执行完返回的话将包含就有实际意义的数据,如果立即返回则包含状态信息--发送成功与否,并不能说明执行的如何。
 
  HRESULT
 
  A value returned from a function call to an interface, consisting of a severity code, context information, a facility code, and a status code that describes the result. For 16-bit Windows systems, the HRESULT is an opaque result handle defined to be zero for a successful return from a function, and nonzero if error or status information is to be returned. To convert an HRESULT into a more detailed SCODE (or return value), applications call GetSCode(). See SCODE.
 
  HRESULT 是一种简单的数据类型,通常被属性和 ATL 用作返回值。下表说明各种不同的值。头文件 winerror.h 中包含更多的值。
 
  名称 说明 值
 
  S_OK 操作成功 0x00000000
 
  E_UNEXPECTED 意外的失败 0x8000FFFF
 
  E_NOTIMPL 未实现 0x80004001
 
  E_OUTOFMEMORY 未能分配所需的内存 0x8007000E
 
  E_INVALIDARG 一个或多个参数无效 0x80070057
 
  E_NOINTERFACE 不支持此接口 0x80004002
 
  E_POINTER 无效指针 0x80004003
 
  E_HANDLE 无效句柄 0x80070006
 
  E_ABORT 操作已中止 0x80004004
 
  E_FAIL 未指定的失败 0x80004005
 
  E_ACCESSDENIED 一般的访问被拒绝错误 0x80070005
 
  不能简单地把返回值与 S_OK 和 S_FALSE 比较,而要用 SECCEEDED 和 FAILED 宏进行判断。
分类:C/C++ | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 307

要解决的问题:
1,是占两个字节的字符吗?  
2, 怎么定义?
3,宽字符应用在哪里?
----------------------------------------------

是的,宽字符是双字节多语言字符代码

C语言中:

C中的宽字符基于wchar_t数据型态,它在几个表头文件包括WCHAR.H中都有定义,像这样:
typedef unsigned short wchar_t ;
因此,wchar_t数据型态与无符号短整数型态相同,都是16位宽。
要定义包含一个宽字符的变量,可使用下面的语句:
wchar_t c = ’A’ ;
变量c是一个双字节值0x0041,是Unicode表示的字母A。(然而,因为Intel微处理器从最小的字节开始储存多字节数值,该字节实际上是以0x41、0x00的顺序保存在内存中。如果检查Unicode文字的计算机储存应注意这一点。)

您还可定义指向宽字符串的指针:

wchar_t * p = L"Hello!" ;
注意紧接在第一个引号前面的大写字母L(代表「long」)。这将告诉编译器该字符串按宽字符保存-即每个字符占用2个字节。通常,指针变量p要占用4个字节,而字符串变量需要14个字节-每个字符需要2个字节,末尾的0还需要2个字节。

同样,您还可以用下面的语句定义宽字符数组:

static wchar_t a[] = L"Hello!" ;
该字符串也需要14个字节的储存空间,sizeof (a) 将返回14。索引数组a可得到单独的字符。a[1] 的值是宽字符「e」,或者0x0065。

虽然看上去更像一个印刷符号,但第一个引号前面的L非常重要,并且在两个符号之间必须没有空格。只有带有L,编译器才知道您需要将字符串存为每个字符2字节。稍后,当我们看到使用宽字符串而不是变量定义时,您还会遇到第一个引号前面的L。幸运的是,如果忘记了包含L,C编译器通常会给提出警告或错误信息。

您还可在单个字符文字前面使用L前缀,来表示它们应解释为宽字符。如下所示:

wchar_t c = L’A’ ;
但通常这是不必要的,C编译器会对该字符进行扩充,使它成为宽字符。

宽字符链接库函数


我们都知道如何获得字符串的长度。例如,如果我们已经像下面这样定义了一个字符串指针:

char * pc = "Hello!" ;
我们可以呼叫

iLength = strlen (pc) ;
这时变量iLength将等于6,也就是字符串中的字符数。

太好了!现在让我们试着定义一个指向宽字符的指针:

wchar_t * pw = L"Hello!" ;
再次呼叫strlen :

iLength = strlen (pw) ;
现在麻烦来了。首先,C编译器会显示一条警告消息,可能是这样的内容:

’’ : incompatible types - from ’unsigned short *’ to ’const char *’

这条消息的意思是:声明strlen函数时,该函数应接收char类型的指标,但它现在却接收了一个unsigned short类型的指标。您仍然可编译并执行该程序,但您会发现iLength等于1。为什么?

字符串「Hello!」中的6个字符占用16位:

0x0048 0x0065 0x006C 0x006C 0x006F 0x0021Intel处理器在内存中将其存为:

48 00 65 00 6C 00 6C 00 6F 00 21 00假定strlen函数正试图得到一个字符串的长度,并把第1个字节作为字符开始计数,但接着假定如果下一个字节是0,则表示字符串结束。

这个小练习清楚地说明了C语言本身和执行时期链接库函数之间的区别。编译器将字符串L"Hello!" 解释为一组16位短整数型态数据,并将其保存在wchar_t数组中。编译器还处理数组索引和sizeof操作符,因此这些都能正常工作,但在连结时才添加执行时期链接库函数,例如strlen。这些函数认为字符串由单字节字符组成。遇到宽字符串时,函数就不像我们所希望那样执行了。

您可能要说:「噢,太麻烦了!」现在每个C语言链接库函数都必须重写以接受宽字符。但事实上并不是每个C语言链接库函数都需要重写,只是那些有字符串参数的函数才需要重写,而且也不用由您来完成。它们已经重写完了。

strlen函数的宽字符版是wcslen(wide-character string length:宽字符串长度),并且在STRING.H(其中也说明了strlen)和WCHAR.H中均有说明。strlen函数说明如下:

size_t __cdecl strlen (const char *) ; 而wcslen函数则说明如下:

size_t __cdecl wcslen (const wchar_t *) ; 这时我们知道,要得到宽字符串的长度可以呼叫

iLength = wcslen (pw) ; 函数将返回字符串中的字符数6。请记住,改成宽字节后,字符串的字符长度不改变,只是位组长度改变了。

您熟悉的所有带有字符串参数的C执行时期链接库函数都有宽字符版。例如,wprintf是printf的宽字符版。这些函数在WCHAR.H和含有标准函数说明的表头文件中说明。

维护单一原始码


当然,使用Unicode也有缺点。第一点也是最主要的一点是,程序中的每个字符串都将占用两倍的储存空间。此外,您将发现宽字符执行时期链接库中的函数比常规的函数大。出于这个原因,您也许想建立两个版本的程序-一个处理ASCII字符串,另一个处理Unicode字符串。最好的解决办法是维护既能按ASCII编译又能按Unicode编译的单一原始码文件。

虽然只是一小段程序,但由于执行时期链接库函数有不同的名称,您也要定义不同的字符,这将在处理前面有L的字符串文字时遇到麻烦。

一个办法是使用Microsoft Visual C++包含的TCHAR.H表头文件。该表头文件不是ANSI C标准的一部分,因此那里定义的每个函数和宏定义的前面都有一条底线。TCHAR.H为需要字符串参数的标准执行时期链接库函数提供了一系列的替代名称(例如,_tprintf和_tcslen)。有时这些名称也称为「通用」函数名称,因为它们既可以指向函数的Unicode版也可以指向非Unicode版。

如果定义了名为_UNICODE的标识符,并且程序中包含了TCHAR.H表头文件,那么_tcslen就定义为wcslen:

#define _tcslen wcslen 如果没有定义UNICODE,则_tcslen定义为strlen:

#define _tcslen strlen 等等。TCHAR.H还用一个新的数据型态TCHAR来解决两种字符数据型态的问题。如果定义了_UNICODE标识符,那么TCHAR就是wchar_t:

typedef wchar_t TCHAR ; 否则,TCHAR就是Char:

typedef char TCHAR ; 现在开始讨论字符串文字中的L问题。如果定义了_UNICODE标识符,那么一个称作__T的宏就定义如下:

#define __T(x) L##x 这是相当晦涩的语法,但合乎ANSI C标准的前置处理器规范。那一对井字号称为「粘贴符号(token paste)」,它将字母L添加到宏参数上。因此,如果宏参数是"Hello!",则L##x就是L"Hello!"。

如果没有定义_UNICODE标识符,则__T宏只简单地定义如下:

#define __T(x) x 此外,还有两个宏与__T定义相同:

#define _T(x)__T(x)
#define _TEXT(x)__T(x) 在Win32 console程序中使用哪个宏,取决于您喜欢简洁还是详细。基本地,必须按下述方法在_T或_TEXT宏内定义字符串文字:

_TEXT ("Hello!") 这样做的话,如果定义了_UNICODE,那么该串将解释为宽字符的组合,否则解释为8位的字符字符串。
 

通常,宽字符在内存中占用的空间比多字节字符多,但处理速度更快。另外,在多字节编码中一次只能表示一个区域设置,而世界上的所有字符集都同时以   Unicode   表示形式表示。

 

查看更多...

Tags: BSTR _bstr_t_ CComBSTR 宽字符 指针

分类:C/C++ | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 278