65.9K
CodeProject 正在变化。 阅读更多。
Home

ATL 的非 MFC 字符串类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (11投票s)

2000年3月28日

viewsIcon

266968

downloadIcon

2604

用于 ATL 组件的非 MFC 字符串类

  • 下载演示项目 - 22 KB
  • 下载源代码文件 - 6 Kb
  • 引言

    在编写 ATL 组件时,我发现 Windows 程序员最难克服的障碍之一就是对 MFC 库的依赖。对于日期和字符串,MFC 通过其类封装处理内存分配和类型转换,从而简化了程序员的工作。然而,这种简化也付出了分发 MFC DLL 的代价。

    本文重点讨论与在 ATL 组件中使用字符串相关的问题。如果不在 ATL 组件中包含 MFC 支持,显然就无法使用 CString。已经有几篇文章讨论了这个问题。我读过的其中一些是:

    • NonMFC:CString (发布于 www.worldofatl.com) - 本文提供了一个基于标准模板库 (STL) 的新 CString 类。
    • Add MFC's CString to ATL w/ No MFC dependencies (作者 K. Shane Triem (www.codeguru.com)) - 本文演示了如何使用 Visual Studio 宏从 MFC 库中提取 CString 类源代码,然后将其用于 ATL 组件。

    CCOMString

    尽管这两篇文章都是 MFC CString 类的可行替代方案,但我想要一个可以在 ANSI 和 Unicode 下编译,并且没有任何依赖(无论是 MFC 还是 STL)的类。我的选择是编写一个名为 CCOMString 的字符串处理类,该类完全基于 Visual C++ 的 TCHAR 数据类型。

    TCHAR 数据类型定义如下:

    • 当你的程序中定义了 _MBCS 时,它是一个 char
    • 当你的程序中定义了 _UNICODE 时,它是一个 wchar_t
    • 当你的程序中既没有定义 _MBCS 也没有定义 _UNICODE 时,它是一个 char

    因此,通过使用 TCHAR 数据类型,CCOMString 与 ANSI 和 Unicode 编译模式兼容。请注意,该类目前有一个限制:它目前不包含内存分配函数的异常处理。我目前使用 ATLASSERT 宏来捕获任何内存分配错误,但这些在 Release 模式下会编译掉(我仍在研究一种在不增加异常处理开销的情况下处理这些错误的方法)。

    CCOMString 的当前版本包含以下功能。请注意,如果您下载的 CCOMString 类中包含的任何函数未在下文列出,则它们被视为未记录,因此可能也未经测试。

    构造函数

  • CCOMString() - 构造一个空字符串。
  • CCOMString(CCOMString&) - 从另一个 CCOMString 构造字符串。
  • CCOMString(LPCTSTR) - 从 LPCTSTR (即 const TCHAR*) 构造字符串。
  • CCOMString(BSTR) - 从 BSTR 构造字符串。
  • CCOMString(TCHAR, int) - 用指定的字符重复指定的次数构造字符串。
  • 赋值操作

  • operator=(CCOMString&) - 将另一个 CCOMString 对象复制到 CCOMString 对象。
  • operator=(LPCTSTR) - 将 LPCTSTR 复制到 CCOMString 对象。
  • operator=(BSTR) - 将 BSTR 复制到 CCOMString 对象。
  • operator LPCTSTR() - 从 CCOMString 对象返回一个 const TCHAR*
  • TCHAR* GetString() - 获取 CCOMString 对象中包含的字符串的指针。
  • BSTR AllocSysString() - 从 CCOMString 对象分配一个 BSTR
  • 串联

  • <code>operator+=(CCOMString&) - 将一个 CCOMString 对象连接到 CCOMString 对象末尾。
  • operator+=(LPCTSTR) - 将一个 const TCHAR* 连接到 CCOMString 对象末尾。
  • operator+=(BSTR) - 将一个 BSTR 连接到 CCOMString 对象末尾。
  • operator+=(TCHAR) - 将一个 TCHAR 连接到 CCOMString 对象末尾。
  • operator+(CCOMString&, CCOMString&) - 将两个 CCOMString 对象连接在一起。
  • operator+(CCOMString&, LPCTSTR) - 将一个 CCOMString 对象和一个 const TCHAR* 连接在一起。
  • operator+(LPCTSTR, CCOMString&) - 将一个 const TCHAR* 和一个 CCOMString 对象连接在一起。
  • operator+(CCOMString&, BSTR) - 将一个 CCOMString 对象和一个 BSTR 连接在一起。
  • operator+(BSTR, CCOMString&) - 将一个 BSTR 和一个 CCOMString 对象连接在一起。
  • 字符串作为数组的访问器

  • GetLength() - 以整数形式返回 CCOMString 字符串的长度。
  • IsEmpty() - 根据 CCOMString 字符串是否为空,返回 TRUE 或 FALSE。
  • Empty() - 将 CCOMString 字符串设置为一个空字符串(即 _T(""))。
  • GetAt(int) - 返回指定位置 CCOMString 字符串中的一个 TCHAR 字符。
  • operator[] (int) - 功能与 GetAt(int) 相同。
  • SetAt(int, TCHAR) - 将 CCOMString 字符串指定位置的字符设置为指定的字符。
  • 转换

  • MakeUpper() - 将 CCOMString 字符串转换为全大写。
  • MakeLower() - 将 CCOMString 字符串转换为全小写。
  • MakeReverse() - 反转 CCOMString 字符串中字符的顺序。
  • TrimLeft() - 移除 CCOMString 字符串左侧的所有空格。
  • TrimRight() - 移除 CCOMString 字符串右侧的所有空格。
  • 搜索

  • Find(TCHAR) - 返回指定字符在 CCOMString 字符串中的第一个位置。
  • Find(TCHAR, int nStart) - 返回指定字符在 nStart 位置之后的第一个位置。
  • Find(LPCTSTR lpszSub) - 返回指定字符串在 CCOMString 字符串中的第一个位置。
  • Find(LPCTSTR lpszSub, int nStart) - 返回指定字符串在 nStart 位置之后的第一个位置。
  • 提取

  • Mid(int) - 返回一个 CCOMString 对象,其中包含从指定位置到 CCOMString 字符串末尾的字符。
  • Mid(int, int) - 返回一个 CCOMString 对象,其中包含从指定位置开始,长度为指定长度的 CCOMString 字符串的字符。
  • Left(int nCount) - 返回 CCOMString 字符串左侧开始的 nCount 个字符。
  • Right(int nCount) - 返回 CCOMString 字符串右侧开始的 nCount 个字符。
  • 替换

  • Replace(TCHAR chOld, TCHAR chNew) - 将 CCOMString 字符串中的所有 chOld 字符替换为 chNew 字符。
  • Replace(LPCTSTR lpszOld, LPCTSTR lpszNew) - 将 CCOMString 字符串中的所有 lpszOld 字符串替换为 lpszNew 字符串。
  • 比较

  • Compare(CCOMString&) - 将当前 CCOMString 字符串与指定的 CCOMString 字符串进行比较,如果相等则返回零,如果不相等则返回非零。此比较区分大小写。
  • Compare(LPCTSTR) - 将当前 CCOMString 字符串与指定的 const TCHAR* 进行比较,如果相等则返回零,如果不相等则返回非零。此比较区分大小写。
  • operator==(const CCOMString&, const CCOMString&) - 功能与 Compare(CCOMString&) 相同。
  • operator==(const CCOMString&, LPCTSTR) - 功能与 Compare(LPCTSTR) 相同。
  • operator==(LPCTSTR, const CCOMString&) - 功能与 Compare(LPCTSTR) 相同。
  • operator!=(const CCOMString&, const CCOMString&) - 将当前 CCOMString 字符串与指定的 CCOMString 字符串进行比较,如果不相等则返回零,如果相等则返回非零。此比较区分大小写。
  • operator!=(const CCOMString&, LPCTSTR) - 将当前 CCOMString 字符串与指定的 const TCHAR* 进行比较,如果不相等则返回零,如果相等则返回非零。此比较区分大小写。
  • operator!=(LPCTSTR, const CCOMString&) - 功能与 operator !=(const CCOMString&, LPCTSTR) 相同。
  • CompareNoCase(CCOMString&) - 将当前 CCOMString 字符串与指定的 CCOMString 字符串进行比较,如果相等则返回零,如果不相等则返回非零。此比较不区分大小写。
  • CompareNoCase(LPCTSTR) - 将当前 CCOMString 字符串与指定的 const TCHAR* 进行比较,如果相等则返回零,如果不相等则返回非零。此比较不区分大小写。
  • 格式化

  • Format(LPCTSTR, ...) - 类似 C 函数 printf() 格式化字符串。
  • 历史

    2000年6月28日 - 源代码内存泄漏修复

    2000年8月12日 - 更新了源代码 ZIP 文件

    © . All rights reserved.