收藏 分享(赏)

windows编程.doc

上传人:HR专家 文档编号:7543283 上传时间:2019-05-21 格式:DOC 页数:960 大小:5.65MB
下载 相关 举报
windows编程.doc_第1页
第1页 / 共960页
windows编程.doc_第2页
第2页 / 共960页
windows编程.doc_第3页
第3页 / 共960页
windows编程.doc_第4页
第4页 / 共960页
windows编程.doc_第5页
第5页 / 共960页
点击查看更多>>
资源描述

1、第一章 对程序的错误处理第二章 Unicode第三章 内核对象第四章 进程第五章 作业第六章 进程的基本知识第七章 进程的调度、优先级和亲缘性第八章 用户方式中线程的同步第九章 线程与内核对象的同步第十章 线程同步工具包第十一章 线程池的使用第十二章 纤程第十三章 Windows 内存结构第十四章 虚拟内存第十五章 在应用程序中使用虚拟内存第十六章 线程的堆栈第十七章 内存映射文件第十八章 堆栈第十九章 DLL 基础第二十章 DLL 高级操做技术第二十一章 线程本地存储器第二十二章 插入 DLL 和持接 API第二十三章 结束处理程序第二十四章 异常处理程序和软件异常第二十五章 窗口消息第二十

2、六章 硬件输入模型和局部输入状态第一部分程序员必读第 1 章对程序错误的处理在开始介绍 Microsoft Windows 的特性之前,必须首先了解 Windows 的各个函数是如何进行错误处理的。当调用一个 Windows 函数时,它首先要检验传递给它的的各个参数的有效性,然后再设法执行任务。如果传递了一个无效参数,或者由于某种原因无法执行这项操作,那么操作系统就会返回一个值,指明该函数在某种程度上运行失败了。表 1- 1 列出了大多数 Windows 函数使用的返回值的数据类型。表 1-1 Wi n d o w s 函数常用的返回值类型 数据类型 表示失败的值V O I D 该函数的运行不

3、可能失败。Wi n d o w s 函数的返回值类型很少是 V O I D B O O L 如果函数运行失败,那么返回值是 0 ,否则返回的是非 0 值。最好对返回值进行测试,以确定它是 0 还是非 0 。不要测试返回值是否为 T R U E H A N D L E如果函数运行失败,则返回值通常是 N U L L ,否则返回值为 H A N D L E ,用于标识你可以操作的一个对象。注意,有些函数会返回一个句柄值 I N VALID_ HANDLE_VA L U E ,它被定义为- 1 。函数的 Platform SDK 文档将会清楚地说明该函数运行失败时返回的是 N U L L 还是 I

4、N VA L I D _ H A N D L E _ VA L I D P V O I D如果函数运行失败,则返回值是 N U L L ,否则返回 P V O I D ,以标识数据块的内存地址L O N G / D W O R D 这是个难以处理的值。返回数量的函数通常返回 L O N G 或 D W O R D 。如果由于某种原因,函数无法对想要进行计数的对象进行计数,那么该函数通常返回0 或- 1 (根据函数而定)。如果调用的函数返回了 L O N G / D W O R D ,那么请认真阅读 Platform SDK 文档,以确保能正确检查潜在的错误一个 Wi n d o w s 函数返

5、回的错误代码对了解该函数为什么会运行失败常常很有用。M i c r o s o ft 公司编译了一个所有可能的错误代码的列表,并且为每个错误代码分配了一个 3 2 位的号码。从系统内部来讲,当一个 Wi n d o w s 函数检测到一个错误时,它会使用一个称为线程本地存储器(thread-local storage )的机制,将相应的错误代码号码与调用的线程关联起来 (线程本地存储器将在第 2 1 章中介绍)。这将使线程能够互相独立地运行,而不会影响各自的错误代码。当函数返回时,它的返回值就能指明一个错误已经发生。若要确定这是个什么错误,请调用 G e t L a s t E r r o r

6、 函数:DWORD GetLastError();该函数只返回线程的 3 2 位错误代码。当你拥有 3 2 位错误代码的号码时,必须将该号码转换成更有用的某种对象。Wi n E r r o r. h 头文件包含了 M i c r o s o f t 公司定义的错误代码的列 表。下面显示了该列表的某些内容,使你能够看到它的大概样子:/ MessageId: ERROR_SUCCESS/ MessageText:/ The operation completed successfully./#define ERROR_SUCCESS 0L#define NO_ERROR 0L / dderror/

7、 MessageId: ERROR_INVALID_FUNCTION/ MessageText:/ Incorrect function./#define ERROR_INVALID_FUNCTION 1L / dderror/ MessageId: ERROR_FILE_NOT_FOUND/ MessageText:/ The system cannot find the file specified./#define ERROR_FILE_NOT_FOUND 2L/ MessageId: ERROR_PATH_NOT_FOUND/ MessageText:/ The system cann

8、ot find the path specified./#define ERROR_PATH_NOT_FOUND 3L/ MessageId: ERROR_TOO_MANY_OPEN_FILES/ MessageText:/ The system cannot open the file./#define ERROR_TOO_MANY_OPEN_FILES 4L/ MessageId: ERROR_ACCESS_DENIED/ MessageText:/ Access is denied./#define ERROR_ACCESS_DENIED 5L如你所见,每个错误都有 3 种表示法:一个消

9、息 I D(这是你可以在源代码中使用的一个宏,以便与 G e t L a s t E r r o r 的返回值进行比较) ,消息文本(对错误的英文描述)和一个号码(应该避免使用这个号码,可使用消息 I D ) 。请记住,这里只显示了 Wi n E r r o r. h 头文件中的很少一部分内容,整个文件的长度超过 2 1 0 0 0 行。当 Wi n d o w s 函数运行失败时,应该立即调用 G e t L a s t E r r o r 函数。如果调用另一个 Wi n d o w s 函数,它的值很可能被改写。注意 G e t L a s t E r r or 能返回线程产生的最后一个错

10、误。如果该线程调用的 Wi n d o w s 函数运行成功,那么最后一个错误代码就不被改写,并且不指明运行成功。有少数 Wi n do w s 函数并不遵循这一规则,它会更改最后的错误代码;但是 Platform SDK 文档通常指明,当函数运行成功时,该函数会更改最后的错误代码。Wi n d o w s 9 8 许多 Windows 98 的函数实际上是用 M i c r o s o f t 公司的 1 6 位Windows 3.1 产品产生的 1 6 位代码来实现的。这种比较老的代码并 不通过 G e t L a s t E r r o r 之类的函数来报告错误,而且 M i c r o

11、 s o f t 公司并没有在 Windows 98 中修改 1 6 位代码,以支持这种错误处理方式 。对于我们来说,这意味着 Windows 98 中的许多 Wi n 3 2 函数在运行失败时不能设置最后的错误代码。该函数将返回一个值,指明运行失败,这样你就能够 发现该函数确实已经运行失败,但是你无法确定运行失败的原因。有些 Wi n d o w s 函数之所以能够成功运行,其中有许多原因。例如,创建指明的事件内核对象之所以能够取得成功,是因为你实际上创建了该对象,或者因为已经存在带有相同名字的事件内核对象。你应搞清楚成功的原因。为了将该信息返回,Mi c r o s o f t 公司选择使

12、用最后错误代码机制。这样,当某些函数运行成功时,就能够通过调用 G e t L a d t E r r o r 函数来确定其他的一些信息。对于具有这种行为特性的函数来说,Platform SDK 文档清楚地说明了 G e t L a s t E r r o r 函数可以这样使用。请参见该文档,找出 C r e a t e E v e n t 函数的例子。进行调试的时候,监控线程的最后错误代码是非常有用的。在 Microsoft Visual studio 6.0 中,M i c r o s o ft 的调试程序支持一个非常有用的特性,即可以配置 Wa t c h 窗口,以便始终都能显示线程的最

13、后错误代码的号码和该错误的英文描述。通过选定 Wa t c h 窗口中的一行,并键入“ e r r, h r ”,就能够做到这一点。观察图 1 - 1 ,你会看到已经调用了C r e a t e F i l e 函数。该函数返回 I N VA L I D _ H A N D L E _ VA L U E (- 1 )的 H A N D L E,表示它未能打开指定的文件。但是 Wa t c h 窗口向我们显示最后错误代码(即如果调用 G e t L a s t E r r o r 函数,该函数返回的错误代码)是 0 x 0 0 0 0 0 0 0 2 。该 Wa t c h 窗口又进一步指明错误

14、代码 2 是指“系统不能找到指定的文件。”你会发现它与 Wi n E r r o r. h 头文件中的错误代码 2 所指的字符串是相同的。图 1-1 在 Visual Studio 6.0 的 Wa t c h 窗口中键入“ e r r, h r ”,就可以查看当前线程的最后错误代码 Visual studio 还配有一个小的实用程序,称为 Error Lookup 。可以使用 ErrorLookup 将错误代码的号码转换成相应文本描述(见图 1 - 2 )。图 1-2 Error Lookup 窗口 如果在编写的应用程序中发现一个错误,可能想要向用户显示该错误的文本描述。Wi n d o w

15、 s 提供了一个函数,可以将错误代码转换成它的文本描述。该函数称为FormatMessage,显示如下:DWORD FormatMessage(DWORD dwFlags, / source and processing optionsLPCVOID lpSource, / pointer to message sourceDWORD dwMessageId, / requested message identifierDWORD dwLanguageId, / language identifier for requested messageLPTSTR lpBuffer, / pointe

16、r to message bufferDWORD nSize, / maximum size of message bufferva_list *Arguments / pointer to array of message inserts);F o r m a t M e s s a g e 函数的功能实际上是非常丰富的,在创建向用户显示的字符串信息时,它是首选函数。该函数之所以有这样大的作用,原因之一是它很容易用多种语言进行操作。该函数能够检测出用户首选的语言(在 Regional Settings Control Panel 小应用程序中设定) ,并返回相应的文本。当然 ,首先必须自己转

17、换字符串,然后将已转换的消息表资源嵌入你的. e x e 文件或 D L L 模块中,然后该函数会选定正确的嵌入对象。 E r r o r S h o w 示 例应用程序(本章后面将加以介绍)展示了如何调用该函数,以便将 M i c r os o f t 公司定义的错误代码转换成它的文本描述。有些人常常问我,M i c r o s o ft 公司是否建立了一个主控列表,以显示每个 Wi n d o w s 函数可能返回的所有错误代码。可惜,回答是没有这样的列 表,而且 M i c r o s o ft 公司将永远不会建立这样的一个列表。因为在创建系统的新版本时,建立和维护该列表实在太困难了。建

18、立这样一个列表存在的问题是,你可以调用一个 Win d o w s 函数,但是该函数能够在内部调用另一个函数,而这另一个函数又可以调用另一个函数,如此类推。由于各种不同的原因,这些函数中的任何一个函数都可能运行失败。有时,当一个函数运行失败时,较高级的函数对它进行恢复,并且仍然可以执行你想执行的操作。为了创建该主控列表,M i c r o s o f t 公司必须跟踪每个函数的运行路径,并建立所有可能的错误代码的列表。这项工作很困难。而且,当创建系统的新版本时,这些函数的运行路径还会改变。1.1 定义自己的错误代码前面已经说明 Wi n d o w s 函数是如何向函数的调用者指明发生的错误,

19、你也能够将该机制用于自己的函数。比如说,你编写了一个希望其他人调用的函数,你的函数可能因为这样或那样的原因而运行失败,你必须向函数的调用者说明它已经运行失败。若要指明函数运行失败,只需要设定线程的最后的错误代码,然后让你的函数返回 FA L S E 、I N VA L I D _ H A N D L E_ VA L U E 、N U L L 或者返回任何合适的信息。若要设定线程的最后错误代码,只需调用下面的代码:请将你认为合适的任何 3 2 位号码传递给该函数。尝试使用 Wi n E r r o r. h 中已经存在的代码,VOID SetLastError(DWORD dwErrCode);

20、只要该代码能够正确地指明想要报告的错误即可。如果你认为 Wi n Er r o r. h 中的任何代码都不能正确地反映该错误的性质,那么可以创建你自己的代码 。错误代码是个 3 2 位的数字,划分成表 1-2 所示的各个域。表 1-2 错误代码的域位 3 1 30 29 28 2716 150内容 严重性 M i c r o s o f t/客户 保留 设备代码 异常代码含义 0 =成功0 =M i c r o s o f t 公司定义的代码必须是 0由 M i c r o s o f t 公司定义由 Microsoft/客户定义1 =供参考 1 =客户定义的代码2 =警告3 =错误这些域将在

21、第 2 4 章中详细讲述。现在,需要知道的重要域是第 2 9 位。M i c r o s o f t 公司规定,他们建立的所有错误代码的这个信息位均使用 0 。如果创建自己的错误代码,必须使 2 9 位为 1。这样,就可以确保你的错误代码与 M i c r o s o f t 公司目前或者将来定义的错误代码不会发生冲突。1.2 ErrorShow 示例应用程序E r r o r S h o w 应用程序“01 ErrorShow. e x e ”(在清单 1 - 1 中列出)展示了如何获取错误代码的文本描述的方法。该应用程序的源代码和资源文件位于本书所附光盘上的 0 1 - E r r o r

22、 S h o w 目录下。一般来说,该应用程序用于显示调试程序的 Wa t c h 窗口和 Error Lookup 程序是如何运行的。当启动该程序时,就会出现如图 1 - 3 所示的窗口。图 1-3 Error Show 窗口 可以将任何错误代码键入该编辑控件。当单击 Look up 按钮时,在底部的滚动窗口中就会显示该错误的文本描述。该应用程序唯一令人感兴趣的特性是如何调用 F o r m a t M e s s a g e 函数。下面是使用该函数的方法:/Get the error codeDWORD dwError = GetDlgItemInt(hwnd, IDC_ERRORCODE

23、, NULL, FALSE);/Buffer that gets the error message stringHLOCAL hlocal = NULL; /Get the error codes textual descriptionBOOL fOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwError, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (PTSTR).if (hlocal != NULL)SetDlgI

24、temText(hwnd, IDC_ERRORTEXT, (PCTSTR)LocalLock(hlocal);LocalFree(hlocal); else SetDlgItemText(hwnd, IDC_ERRORTEXT, TEXT(“Error number not found.“);第一个代码行用于从编辑控件中检索错误代码的号码。然后,建立一个内存块的句柄并将它初始化为 N U L L 。F o r m a t M e s sa g e 函数在内部对内存块进行分配,并将它的句柄返回给我们。当调用 F o r m a t M e s s ag e 函数时,传递了 F O R M AT

25、_ M E S S A G E _ F R O M _ S Y S T E M 标志。该标志告诉 F o r m at M e s s a g e 函数,我们想要系统定义的错误代码的字符串。还传递了 F O R M AT _M E S S A G E _ A L L O CAT E _ B U F F E R 标志,告诉该函数为错误代码的文本描述分配足够大的内存块。该内存块的句柄将在 h l o c a l 变量中返回。第三个参数指明想要查找的错误代码的号码,第四个参数指明想要文本描述使用什么语言。如果 F o r m a t M e s s ag e 函数运行成功,那么错误代码的文本描述就位

26、于内存块中,将它拷贝到对话框底部的滚动窗口中。如果 F o r m a t M e s s a g e 函数运行失败,设法查看 N e t M s g . d l l 模块中的消息代码,以了解该错误是否与网络有关。使用 N e t M s g . d l l 模块的句柄,再次调用 F o r m a t M e s s a g e 函数。你会看到,每个 D L L (或. e x e)都有它自己的一组错误代码,可以使用 Message Compiler (M C . e x e)将这组错误代码添加给该模块,并将一个资源添加给该模块。这就是 Visual Studio 的 Error Looku

27、p 工具允许你用 M o d u l es 对话框进行的操作。以下是清单 1 - 1E r r o r S h o w 示例应用程序。清单 1-1 ErrorShow 示例应用程序/*Module: ErrorShow.cppNotices: Copyright (c) 2000 Jeffrey Richter*/#include “CmnHdr.h“ /* See Appendix A. */#include #include #include “Resource.h“/#define ESM_POKECODEANDLOOKUP (WM_USER + 100)const TCHAR g_sz

28、AppName = TEXT(“Error Show“);/BOOL Dlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) chSETDLGICONS(hwnd, IDI_ERRORSHOW);/ Dont accept error codes more than 5 digits longEdit_LimitText(GetDlgItem(hwnd, IDC_ERRORCODE), 5);/ Look up the command-line passed error numberSendMessage(hwnd, ESM_POK

29、ECODEANDLOOKUP, lParam, 0);return(TRUE);/void Dlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)switch (id) case IDCANCEL:EndDialog(hwnd, id);break;case IDC_ALWAYSONTOP:SetWindowPos(hwnd, IsDlgButtonChecked(hwnd, IDC_ALWAYSONTOP) ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE |

30、 SWP_NOSIZE);break;case IDC_ERRORCODE: EnableWindow(GetDlgItem(hwnd, IDOK), Edit_GetTextLength(hwndCtl) 0);break;case IDOK:/ Get the error codeDWORD dwError = GetDlgItemInt(hwnd, IDC_ERRORCODE, NULL, FALSE);HLOCAL hlocal = NULL; / Buffer that gets the error message string/ Get the error codes textua

31、l descriptionBOOL fOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwError, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (PTSTR) if (!fOk) / Is it a network-related error?HMODULE hDll = LoadLibraryEx(TEXT(“netmsg.dll“), NULL, DONT_RESOLVE_DLL_REFERENCES);if (hD

32、ll != NULL) FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_FROM_SYSTEM,hDll, dwError, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),(PTSTR) FreeLibrary(hDll);if (hlocal != NULL) SetDlgItemText(hwnd, IDC_ERRORTEXT, (PCTSTR) LocalLock(hlocal);LocalFree(hlocal); else SetDlgItemText(hwnd, IDC

33、_ERRORTEXT, TEXT(“Error number not found.“);break;/INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)switch (uMsg) chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand);case ESM_POKECODEANDLOOKUP:SetDlgItemInt(hwnd, IDC_ERROR

34、CODE, (UINT) wParam, FALSE);FORWARD_WM_COMMAND(hwnd, IDOK, GetDlgItem(hwnd, IDOK), BN_CLICKED, PostMessage);SetForegroundWindow(hwnd);break;return(FALSE);/int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int)HWND hwnd = FindWindow(TEXT(“#32770“), TEXT(“Error Show“);if (IsWindow(

35、hwnd) / An instance is already running, activate it and send it the new #SendMessage(hwnd, ESM_POKECODEANDLOOKUP, _ttoi(pszCmdLine), 0); else DialogBoxParam(hinstExe, MAKEINTRESOURCE(IDD_ERRORSHOW), NULL, Dlg_Proc, _ttoi(pszCmdLine);return(0);/ End of File /ErrorShow.rc Microsoft Developer Studio ge

36、nerated resource script./#include “resource.h“#define APSTUDIO_READONLY_SYMBOLS/ Generated from the TEXTINCLUDE 2 resource./#include “afxres.h“/#undef APSTUDIO_READONLY_SYMBOLS/ English (U.S.) resources#if !defined(AFX_RESOURCE_DLL) | defined(AFX_TARG_ENU)#ifdef _WIN32LANGUAGE LANG_ENGLISH, SUBLANG_

37、ENGLISH_US#pragma code_page(1252)#endif /_WIN32/ Dialog/IDD_ERRORSHOW DIALOGEX 0, 0, 182, 42STYLE DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENUCAPTION “Error Show“FONT 8, “MS Sans Serif“BEGINLTEXT “Error:“,IDC_STATIC,4,4,19,8EDITTEXT IDC_ERRORCODE,2

38、4,2,24,14,ES_AUTOHSCROLL | ES_NUMBERDEFPUSHBUTTON “Look up“,IDOK,56,2,36,14CONTROL “ 返回字符串中的下一个字符的地址PTSTR CharPrev (PCTSTR pszStart,PCTSTR p s z C u r r e n t C h a r);返回字符串中的上一个字符的地址BOOL IsDBCSLeadByteTRUE(BYTE bTestChar); 如果该字节是 DBCS 字符的第一个字节,则返回尽管这些函数使得我们对 D B C S 的操作更容易,但还需要,一个更好的方法让我们来看看 U n i

39、c o d e 。2.1.2 Unicode :宽字节字符集U n i c o d e 是 A p p l e 和 X e r o x 公司于 1 9 8 8 年建立的一个技术标准。 1 9 9 1 年,成立了一个集团机构负责 U n i c o d e 的开发和推广应用。该集团由 A p p l e 、C o m p a q 、H P 、I B M 、M i c r o s o f t 、O r a c l e、Silicon Graphics, Inc.、S y b a s e 、U n i s y s 和 X e r o x 等公司组成(若要了解该集团的全部成员,请通过网址 w w w.

40、 U n i c o d e . o rg 查找)。该集团负责维护 U n i c o d e 标准。U n i c o d e 的完整描述可以参阅A d d i s o n We s l e y 出版的Unicode Standard一书(该书可以通过网址 w w w. U n i c o d e . o rg 订购)。U n i c o d e 提供了一种简单而又一致的表示字符串的方法。U n i c o d e 字符串中的所有字符都是 1 6 位的(两个字节)。它没有专门的字节来指明下一个字节是属于同一个字符的组成部分,还是一个新字符。这意味着你只需要对指针进行递增或递减,就可以遍历字符

41、串中的各个字符,不再需要调用 Ch a r N e x t 、C h a r P r e v 和 I s D B C S L e a d B y t e 之类的函数。由于 U n i c o d e 用一个 1 6 位的值来表示每个字符,因此总共可以得到 65 000 个字符,这样,它就能够对世界各国的书面文字中的所有字符进行编码,远远超过了单字节字符集的2 5 6 个字符的数目。目前,已经为阿拉伯文、中文拼音、西里尔字母(俄文)、希腊文、西伯莱文、日文、韩文和拉丁文(英文)字母定义了 U n i c o d e 代码点。(代码点是字符集中符号的位置。)这些字符集中还包含了大量的标点符号、数学

42、符号、技术符号、箭头、装饰标志、区分标志和其他许多字符。如果将所有这些字母和符号加在一起,总计约达 35 0 0 0 个不同的代码点,这样,总计 65 000 多个代码点中,大约还有一半可供将来扩充时使用。这 65536 个字符可以分成不同的区域。表 2-2 显示了这样的区域的一部分以及分配给这些区域的字符。表 2-2 区域字符 1 6 位代码 字符 16 位代码 字符0 0 0 0 - 0 0 7 F A S C I I 0 3 0 0 - 0 3 6 F 通用区分标志0 0 8 0 - 0 0 F F 拉丁文 1 字符 0 4 0 0 - 0 4 F F 西里尔字母0 1 0 0 - 0

43、1 7 F 欧洲拉丁文 0 5 3 0 - 0 5 8 F 亚美尼亚文0 1 8 0 - 0 1 F F 扩充拉丁文 0 5 9 0 - 0 5 F F 西伯莱文0 2 5 0 - 0 2 A F 标准拼音 0 6 0 0 - 0 6 F F 阿拉伯文0 2 B 0 - 0 2 F F 修改型字母 0 9 0 0 - 0 9 7 F 梵文目前尚未分配的代码点大约还有 29 000 个,不过它们是保留供将来使用的。另外,大约有6 0 0 0 个代码点是保留供个人使用的。2.2 为什么使用 Unicode当开发应用程序时,当然应该考虑利用 U n i co d e 的优点。即使现在你不打算对应用程

44、序进行本地化,开发时将 U n i c o d e 放在心上,肯定可以简化将来的代码转换工作。此外,U n i c od e 还具备下列功能: 可以很容易地在不同语言之间进行数据交换。 使你能够分配支持所有语言的单个二进制. ex e 文件或 D L L 文件。 提高应用程序的运行效率(本章后面还要详细介绍)。2.3 Windows 2000 与 UnicodeWindows 2000 是使用 U n i co d e 从头进行开发的,用于创建窗口、显示文本、进行字符串操作等的所有核心函数都需要 U n i c o d e 字符串。如果调用任何一个 Wi n d o ws 函数并给它传递一个

45、A N S I 字符串,那么系统首先要将字符串转换成 U n i c o d e ,然后将 U n i c o d e 字符串传递给操作系统。如果希望函数返回 A N S I 字符串,系统就会首先将 U n i c o d e 字符串转换成 A N S I 字符串,然后将结果返回给你的应用程序。所有这些转换操作都是在你看不见的情况下发生的。当然,进行这些字符串的转换需要占用系统的时间和内存。例如,如果调用 C r e a t e Wi nd o w E x 函数,并传递类名字和窗口标题文本的非 U n i c o d e 字符串,那么 C r e a t e Wi n d o w E x 必须

46、分配内存块(在你的进程的默认堆中),将非 U n i c o d e 字符串转换成 U n i c o d e 字符串,并将结果存储在分配到的内存块中,然后调用 U n i c o d e 版本的 C r e a t e Wi n d o w E x 函数。对于用字符串填入缓存的函数来说,系统必须首先将 Un i c o d e 字符串转换成非 U n i c o d e 字符串,然后你的应用程序才能处理该字符串。由于系统必须执行所有这些转换操作,因此你的应用程序需要更多的内存,并且运行的速度比较慢。通过从头开始用 U n i co d e 来开发应用程序,就能够使你的应用程序更加有效地运行。2.4 Windows 98 与 UnicodeWindows 98 不是一种全新的操作系统。它继承了 1 6 位 Wi n d o w

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报