Bwindows.h部分代码:
//////////////////////////////////////////////////////////////////////////
// Bwindows.h 包含了编写 Windows 程序所必须的头文件,
// 一些常用自定义函数的声明、类型、常数、类的定义
// 类包括:
// CBHashLK: 长整数型 key 的哈希表类
// CBArrLink: 高效数组链表类
// CHeapMemory:用全局对象维护所有通过 new 分配的内存指针类
// CBApp 类: 管理应用程序全局信息
//
// 包含本 h 文件即可使用全局对象指针:pApp(->)获得程序全局信息,但只有
// 同时包含 BForm 的模块(封装 WinMain 函数)后才能获得正确的信息
//
// 包含本 h 文件即可使用全局对象:HM 管理以 new 开辟的内存指针
// 调用 HM.AddPtr(p, bArrNew); 添加管理一个以 new 开辟的内存指针
// 调用 HM.Free(p); 释放 HM 管理的一个动态内存
// 调用 HM.Dispose(); 释放目前管理的所有动态内存(程序结束时也会自动释放)
//////////////////////////////////////////////////////////////////////////
#pragma once
#pragma warning(disable:4996) // 关闭 warning C4996: 如 'wcscpy': This function or variable may be unsafe. Consider using wcscpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
#define OEMRESOURCE // to use any of the OBM_ constants
#include <windows.h>
#include <memory.h>
#include <tchar.h>
#include <string.h>
#include <string>
typedef std::basic_string<TCHAR, std::char_traits<TCHAR>, std::allocator<TCHAR> > tstring;
using std::string;
using std::wstring;
// EventsGenerator 函数返回此值表示要调用默认的窗口程序,否则不再调用默认的窗口程序
#define gc_APICEventsGenDefautRet 0xFEEEEEEE
enum EStandardIcon // 系统图标
{
IDI_Application = (int)IDI_APPLICATION,
IDI_Asterisk = (int)IDI_ASTERISK,
IDI_Error = (int)IDI_ERROR,
IDI_Exclamation = (int)IDI_EXCLAMATION,
IDI_Hand = (int)IDI_HAND,
IDI_Information = (int)IDI_INFORMATION,
IDI_Question = (int)IDI_QUESTION,
IDI_Warning = (int)IDI_WARNING,
IDI_Winlogo = (int)IDI_WINLOGO
};
#define gc_IDStandCursorIDBase 0x10000
enum EStandardCursor // 系统鼠标指针形状,为对应 API 常量 + gc_IDStandCursorIDBase(目的是为与资源 ID 区分,资源 ID 均小于 gc_IDStandCursorIDBase)
{
IDC_AppStarting = (int)IDC_APPSTARTING + gc_IDStandCursorIDBase, // Standard arrow and small hourglass
IDC_Arrow = (int)IDC_ARROW + gc_IDStandCursorIDBase, // Standard arrow
IDC_Cross = (int)IDC_CROSS + gc_IDStandCursorIDBase, // Cross hair
IDC_Hand = (int)MAKEINTRESOURCE(32649) + gc_IDStandCursorIDBase, // Windows NT 5.0 and later: Hand
IDC_Help = (int)IDC_HELP + gc_IDStandCursorIDBase, // Arrow and question mark
IDC_IBeam = (int)IDC_IBEAM + gc_IDStandCursorIDBase, // I-beam
IDC_Icon = (int)IDC_ICON + gc_IDStandCursorIDBase, // Obsolete for applications marked version 4.0 or later.
IDC_No = (int)IDC_NO + gc_IDStandCursorIDBase, // Slashed circle
IDC_Size = (int)IDC_SIZE + gc_IDStandCursorIDBase, // Obsolete for applications marked version 4.0 or later. Use IDC_SIZEALL.
IDC_SizeAll = (int)IDC_SIZEALL + gc_IDStandCursorIDBase, // Four-pointed arrow pointing north, south, east, and west
IDC_SizeNESW = (int)IDC_SIZENESW + gc_IDStandCursorIDBase, // Double-pointed arrow pointing northeast and southwest
IDC_SizeNS = (int)IDC_SIZENS + gc_IDStandCursorIDBase, // Double-pointed arrow pointing north and south
IDC_SizeNWSE = (int)IDC_SIZENWSE + gc_IDStandCursorIDBase, // Double-pointed arrow pointing northwest and southeast
IDC_SizeWE = (int)IDC_SIZEWE + gc_IDStandCursorIDBase, // Double-pointed arrow pointing west and east
IDC_UpArrow = (int)IDC_UPARROW + gc_IDStandCursorIDBase, // Vertical arrow
IDC_Wait = (int)IDC_WAIT + gc_IDStandCursorIDBase // Hourglass
};
enum EOEMBmp // 系统 OEM 位图
{
Obm_Btncorners = OBM_BTNCORNERS,
Obm_Btsize = OBM_BTSIZE,
Obm_Check = OBM_CHECK,
Obm_Checkboxes = OBM_CHECKBOXES,
Obm_Close = OBM_CLOSE,
Obm_Reduce = OBM_REDUCE,
Obm_Combo = OBM_COMBO,
Obm_Reduced = OBM_REDUCED,
Obm_Dnarrow = OBM_DNARROW,
Obm_Restore = OBM_RESTORE,
Obm_Dnarrowd = OBM_DNARROWD,
Obm_Restored = OBM_RESTORED,
Obm_Dnarrowi = OBM_DNARROWI,
Obm_Rgarrow = OBM_RGARROW,
Obm_Lfarrow = OBM_LFARROW,
Obm_Rgarrowd = OBM_RGARROWD,
Obm_Lfarrowd = OBM_LFARROWD,
Obm_Rgarrowi = OBM_RGARROWI,
Obm_Lfarrowi = OBM_LFARROWI,
Obm_Size = OBM_SIZE,
Obm_Mnarrow = OBM_MNARROW,
Obm_Uparrow = OBM_UPARROW,
Obm_Uparrowd = OBM_UPARROWD,
// Obm_Old_Restore = OBM_OLD_RESTORE, // Bitmap names that begin with OBM_OLD represent bitmaps used by 16-bit versions of Windows earlier than 3.0.
// Obm_Old_Rgarrow = OBM_OLD_RGARROW,
// Obm_Old_Uparrow = OBM_OLD_UPARROW,
// Obm_Old_Zoom = OBM_OLD_ZOOM,
// Obm_Old_Close = OBM_OLD_CLOSE,
// Obm_Old_Dnarrow = OBM_OLD_DNARROW,
// Obm_Old_Lfarrow = OBM_OLD_LFARROW,
// Obm_Old_Reduce = OBM_OLD_REDUCE,
Obm_Uparrowi = OBM_UPARROWI,
Obm_Zoom = OBM_ZOOM,
Obm_Zoomd = OBM_ZOOMD
};
enum EOEMIcon // 系统 OEM 图标
{
Oic_Sample = OIC_SAMPLE,
Oic_Hand = OIC_HAND,
Oic_Ques = OIC_QUES,
Oic_Bang = OIC_BANG,
Oic_Note = OIC_NOTE,
#if(WINVER >= 0x0400)
Oic_Winlogo = OIC_WINLOGO,
Oic_Warning = OIC_WARNING,
Oic_Error = OIC_ERROR,
Oic_Information = OIC_INFORMATION,
#endif /* WINVER >= 0x0400 */
};
enum EOEMCursor // 系统 OEM 光标
{
Ocr_Normal = OCR_NORMAL,
Ocr_Ibeam = OCR_IBEAM,
Ocr_Wait = OCR_WAIT,
Ocr_Cross = OCR_CROSS,
Ocr_Up = OCR_UP,
Ocr_Size = OCR_SIZE, /* OBSOLETE: use OCR_SIZEALL */
Ocr_Icon = OCR_ICON, /* OBSOLETE: use OCR_NORMAL */
Ocr_Sizenwse = OCR_SIZENWSE,
Ocr_Sizenesw = OCR_SIZENESW,
Ocr_Sizewe = OCR_SIZEWE,
Ocr_Sizens = OCR_SIZENS,
Ocr_Sizeall = OCR_SIZEALL,
Ocr_Icocur = OCR_ICOCUR, /* OBSOLETE: use OIC_WINLOGO */
Ocr_No = OCR_NO,
#if(WINVER >= 0x0500)
Ocr_Hand = OCR_HAND,
#endif /* WINVER >= 0x0500 */
#if(WINVER >= 0x0400)
Ocr_Appstarting = OCR_APPSTARTING,
#endif /* WINVER >= 0x0400 */
};
enum EColorType // 系统颜色
{
COLOR_ActiveBorder = COLOR_ACTIVEBORDER,
COLOR_ActiveCaption = COLOR_ACTIVECAPTION,
COLOR_AppWorkspace = COLOR_APPWORKSPACE,
COLOR_BackGround = COLOR_BACKGROUND,
COLOR_BtnFace = COLOR_BTNFACE,
COLOR_BtnShadow = COLOR_BTNSHADOW,
COLOR_BtnText = COLOR_BTNTEXT,
COLOR_CaptionText = COLOR_CAPTIONTEXT,
COLOR_GrayText = COLOR_GRAYTEXT,
COLOR_Highlight = COLOR_HIGHLIGHT,
COLOR_HighlightText = COLOR_HIGHLIGHTTEXT,
COLOR_InactiveBorder = COLOR_INACTIVEBORDER,
COLOR_InactiveCaption = COLOR_INACTIVECAPTION,
COLOR_Menu = COLOR_MENU,
COLOR_MenuText = COLOR_MENUTEXT,
COLOR_ScrollBar = COLOR_SCROLLBAR,
COLOR_Window = COLOR_WINDOW,
COLOR_WindowFrame = COLOR_WINDOWFRAME,
COLOR_WindowText = COLOR_WINDOWTEXT
};
enum EShowWindowCmd // 窗口显示状态
{
SW_ForceMinimize = SW_FORCEMINIMIZE, // Windows NT 5.0 and later: Minimizes a window, even if the thread that owns the window is hung. This flag should only be used when minimizing windows from a different thread.
SW_Hide = SW_HIDE, // Hides the window and activates another window.
SW_Mazimize = SW_MAXIMIZE, // Maximizes the specified window.
SW_Minimize = SW_MINIMIZE, // Minimizes the specified window and activates the next top-level window in the Z order.
SW_Restore = SW_RESTORE, // Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized window.
SW_Show = SW_SHOW, // Activates the window and displays it in its current size and position.
SW_ShowDefault = SW_SHOWDEFAULT, // Sets the show state based on the SW_ flag specified in theSTARTUPINFO structure passed to theCreateProcess function by the program that started the application.
SW_ShowMaximized = SW_SHOWMAXIMIZED, // Activates the window and displays it as a maximized window.
SW_ShowMinimized = SW_SHOWMINIMIZED, // Activates the window and displays it as a minimized window.
SW_ShowMinNoactive = SW_SHOWMINNOACTIVE, // Displays the window as a minimized window. The active window remains active.
SW_ShowNA = SW_SHOWNA, // Displays the window in its current state. The active window remains active.
SW_ShowNoActivate = SW_SHOWNOACTIVATE, // Displays a window in its most recent size and position. The active window remains active.
SW_ShowNormal = SW_SHOWNORMAL // Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when displaying the window for the first time.
};
enum EMsgBoxBtn // 用于消息框的按钮样式
{
mb_OK = MB_OK,
mb_OkCancel = MB_OKCANCEL,
mb_AbortRetryIgnore = MB_ABORTRETRYIGNORE,
mb_YesNoCancel = MB_YESNOCANCEL,
mb_YesNo = MB_YESNO,
mb_RetryCancel = MB_RETRYCANCEL
};
enum EMsgBoxIcon // 用于消息框的图标样式
{
mb_IconNone = 0,
mb_IconError = MB_ICONHAND,
mb_IconQuestion = MB_ICONQUESTION,
mb_IconExclamation = MB_ICONEXCLAMATION,
mb_IconInformation = MB_ICONASTERISK
#if(WINVER >= 0x0400)
,mb_UserIcon = MB_USERICON
#endif /* WINVER >= 0x0400 */
};
enum EDlgBoxDefBtn // 用于消息框的默认按钮样式
{
mb_DefButton1 = MB_DEFBUTTON1,
mb_DefButton2 = MB_DEFBUTTON2,
mb_DefButton3 = MB_DEFBUTTON3
#if(WINVER >= 0x0400)
,mb_DefButton4 = MB_DEFBUTTON4
#endif /* WINVER >= 0x0400 */
};
enum EDlgBoxCmdID //用于消息框的用户按下的按钮种类
{
NoValue = 0,
idAbort = IDABORT, // Abort button was selected.
idCancel = IDCANCEL, // Cancel button was selected.
idIgnore = IDIGNORE, // Ignore button was selected.
idNo = IDNO, // No button was selected.
idOk = IDOK, // OK button was selected.
idRetry = IDRETRY, // Retry button was selected.
idYes = IDYES // Yes button was selected.
};
enum EMsgBeep // 系统声音的样式
{
mb_SoundOK = MB_OK, // SystemDefault
mb_SoundError = MB_ICONHAND,
mb_SoundQuestion = MB_ICONQUESTION,
mb_SoundExclamation = MB_ICONEXCLAMATION,
mb_SoundAsterisk = MB_ICONASTERISK,
mb_SoundSpeaker = 0xFFFFFFFF // Standard beep using the computer speaker
};
enum ESysMenu // 系统菜单项
{
eSysMenu_Close = SC_CLOSE,
eSysMenu_Minimize = SC_MINIMIZE,
eSysMenu_Maxmize = SC_MAXIMIZE,
eSysMenu_Move = SC_MOVE,
eSysMenu_Size = SC_SIZE,
eSysMenu_Restore = SC_RESTORE
};
//////////////////////////////////////////////////////////////////////////
// 常用自定义函数
//
//////////////////////////////////////////////////////////////////////////
// 弹出消息框
// 如 title 为 NULL,就自动使用应用程序名作为 title
EDlgBoxCmdID MsgBox(LPCTSTR szPrompt,
LPCTSTR szTitle = NULL,
EMsgBoxBtn buttons = mb_OK,
EMsgBoxIcon icon = mb_IconNone,
EDlgBoxDefBtn defBtn = mb_DefButton1,
bool bTopMost = true,
bool bHelpButton = false,
bool bRightJustified = false,
bool bRightToLeftReading = false);
EDlgBoxCmdID MsgBox(char valueChar,
LPCTSTR szTitle = NULL,
EMsgBoxBtn buttons = mb_OK,
EMsgBoxIcon icon = mb_IconNone,
EDlgBoxDefBtn defBtn = mb_DefButton1,
bool bTopMost = true,
bool bHelpButton = false,
bool bRightJustified = false,
bool bRightToLeftReading = false);
EDlgBoxCmdID MsgBox(unsigned short int valueInt, // TCHAR
LPCTSTR szTitle = NULL,
EMsgBoxBtn buttons = mb_OK,
EMsgBoxIcon icon = mb_IconNone,
EDlgBoxDefBtn defBtn = mb_DefButton1,
bool bTopMost = true,
bool bHelpButton = false,
bool bRightJustified = false,
bool bRightToLeftReading = false);
EDlgBoxCmdID MsgBox(int valueInt,
LPCTSTR szTitle = NULL,
EMsgBoxBtn buttons = mb_OK,
EMsgBoxIcon icon = mb_IconNone,
EDlgBoxDefBtn defBtn = mb_DefButton1,
bool bTopMost = true,
bool bHelpButton = false,
bool bRightJustified = false,
bool bRightToLeftReading = false);
EDlgBoxCmdID MsgBox(long valueLong,
LPCTSTR szTitle = NULL,
EMsgBoxBtn buttons = mb_OK,
EMsgBoxIcon icon = mb_IconNone,
EDlgBoxDefBtn defBtn = mb_DefButton1,
bool bTopMost = true,
bool bHelpButton = false,
bool bRightJustified = false,
bool bRightToLeftReading = false);
EDlgBoxCmdID MsgBox(unsigned int valueInt,
LPCTSTR szTitle = NULL,
EMsgBoxBtn buttons = mb_OK,
EMsgBoxIcon icon = mb_IconNone,
EDlgBoxDefBtn defBtn = mb_DefButton1,
bool bTopMost = true,
bool bHelpButton = false,
bool bRightJustified = false,
bool bRightToLeftReading = false);
EDlgBoxCmdID MsgBox(unsigned long valueInt,
LPCTSTR szTitle = NULL,
EMsgBoxBtn buttons = mb_OK,
EMsgBoxIcon icon = mb_IconNone,
EDlgBoxDefBtn defBtn = mb_DefButton1,
bool bTopMost = true,
bool bHelpButton = false,
bool bRightJustified = false,
bool bRightToLeftReading = false);
EDlgBoxCmdID MsgBox(float valueSng,
LPCTSTR szTitle = NULL,
EMsgBoxBtn buttons = mb_OK,
EMsgBoxIcon icon = mb_IconNone,
EDlgBoxDefBtn defBtn = mb_DefButton1,
bool bTopMost = true,
bool bHelpButton = false,
bool bRightJustified = false,
bool bRightToLeftReading = false);
EDlgBoxCmdID MsgBox(double valueDbl,
LPCTSTR szTitle = NULL,
EMsgBoxBtn buttons = mb_OK,
EMsgBoxIcon icon = mb_IconNone,
EDlgBoxDefBtn defBtn = mb_DefButton1,
bool bTopMost = true,
bool bHelpButton = false,
bool bRightJustified = false,
bool bRightToLeftReading = false);
EDlgBoxCmdID MsgBox(long double valueDbl,
LPCTSTR szTitle = NULL,
EMsgBoxBtn buttons = mb_OK,
EMsgBoxIcon icon = mb_IconNone,
EDlgBoxDefBtn defBtn = mb_DefButton1,
bool bTopMost = true,
bool bHelpButton = false,
bool bRightJustified = false,
bool bRightToLeftReading = false);
EDlgBoxCmdID MsgBox(tstring valueString,
tstring valueTitle = TEXT(""),
EMsgBoxBtn buttons = mb_OK,
EMsgBoxIcon icon = mb_IconNone,
EDlgBoxDefBtn defBtn = mb_DefButton1,
bool bTopMost = true,
bool bHelpButton = false,
bool bRightJustified = false,
bool bRightToLeftReading = false);
BOOL MsgBeep(EMsgBeep soundStyle = mb_SoundSpeaker);
// 将一个整数转换为八进制的字符串,字符串空间自动开辟、由 HM 自动管理
LPTSTR Oct(long number);
// 将一个整数转换为十六进制的字符串,字符串空间自动开辟、由 HM 自动管理
LPTSTR Hex(long number);
// 获得当前路径字符串,字符串空间自动开辟、由 HM 自动管理
LPTSTR CurDir();
// 获取一个自定义资源的字节数据(空间自动开辟、由 HM 自动管理)
// rSize 不为0时,将从此参数指向的空间返回资源的字节数
unsigned char * LoadResData(UINT idRes, UINT typeRes, unsigned long * rSize=0);
unsigned char * LoadResData(UINT idRes, LPCTSTR typeRes, unsigned long * rSize=0 );
unsigned char * LoadResData(LPCTSTR idRes, UINT typeRes, unsigned long * rSize=0 );
unsigned char * LoadResData(LPCTSTR idRes, LPCTSTR typeRes, unsigned long * rSize=0);
//////////////////////////////////////////////////////////////////////////
// 时间 函数
//////////////////////////////////////////////////////////////////////////
// 返回当前系统日期、时间的一个字符串,字符串空间自动开辟、由 HM 自动管理
// 若 lpDblTime 不为0,还将当前系统日期、时间转换为 double
// (为1601-1-1以来经历的毫秒数)存入它指向的 double 型变量中
// 若 lpTime 不为0,还将当前系统日期、时间存储到它指向的结构中
LPTSTR Now( double *lpDblTime=0, SYSTEMTIME *lpTime=0);
// 设置当前系统日期、时间
BOOL NowSet( SYSTEMTIME stNow );
// 将一个日期、时间转换为 double 返回(为1601-1-1以来经历的毫秒数)
double DateTimeDbl( SYSTEMTIME stDatetime );
// 计算两个日期、时间的时间间隔时所用的间隔类型
enum eDataTimeDiffStyle
{
edtYearDiff = 1,
edtMonthDiff,
edtDayDiff,
edtHourDiff,
edtMinuteDiff,
edtSecondDiff,
edtMilliseconds
};
// 计算两个日期、时间的时间间隔
// style 为指定时间间隔的单位
double DateDiff(eDataTimeDiffStyle style,
SYSTEMTIME stDatetime1,
SYSTEMTIME stDatetime2);
// 返回从 1970-1-1 00:00 经过的秒数
// 若参数 blClockTicks==True,则返回本进程经过的 clock ticks 数
long TimeClock( bool blClockTicks=false );
//////////////////////////////////////////////////////////////////////////
// 自定义字符串 函数
//////////////////////////////////////////////////////////////////////////
// 以 printf 方式制作一个字符串(字符串空间自动开辟、由 HM 自动管理)
LPTSTR cdecl StrPrintf( LPCTSTR szFormat, ... );
// 取字符串的前 length 个字符组成新字符串,函数返回新字符串的首地址
// (使用Unicode时1个汉字算1个长度,使用ANSI时1个汉字算2个长度)
// 新字符串空间自动开辟、由 HM 自动管理
// length超过字符串长度时返回整个字符串,length<=0 时返回 指向 "\0" (空串)的指针
LPTSTR Left(LPCTSTR szStringSrc, int length);
// 取字符串的后 length 个字符组成新字符串,函数返回新字符串的首地址
// (使用Unicode时1个汉字算1个长度,使用ANSI时1个汉字算2个长度)
// 新字符串空间自动开辟、由 HM 自动管理
// length超过字符串长度时返回整个字符串,length<=0 时返回 指向 "\0" (空串)的指针
LPTSTR Right(LPCTSTR szStringSrc, int length);
// 取字符串的从第 startPos 个字符起,长 length 个字符组成的字符串,
// 函数返回新字符串的首地址
// (第一个字符位置为1,使用Unicode时1个汉字算1个长度,
// 使用ANSI时1个汉字算2个长度)
// 新字符串空间自动开辟、由 HM 自动管理
// startPos+length-1 超过字符串长度时返回整个字符串,length<=0 时
// 或 startPos<=0 或 startPos>源字符串长度 时返回指向 "\0" (空串)的指针
LPTSTR Mid(LPCTSTR szStringSrc, int startPos, int length);
// 删除字符串的前导、尾部和所有空格,返回删除后的新字符串,
// 新字符串空间自动开辟、由 HM 自动管理
// bDelOtherSpace=true 时删除所有空格在内的 isspace() 返回真的
// 所有字符;bDelOtherSpace=false 时只删除空格
LPTSTR LTrim(LPCTSTR szStringSrc, bool bDelOtherSpace=false);
LPTSTR RTrim(LPCTSTR szStringSrc, bool bDelOtherSpace=false);
LPTSTR Trim(LPCTSTR szStringSrc, bool bDelOtherSpace=false);
// 将字符串中的字母全部转换为大写(UCase)、小写(LCase)
// 返回转换后的新字符串,新字符串空间自动开辟、由 HM 自动管理
LPTSTR LCase(LPCTSTR szStringSrc);
LPTSTR UCase(LPCTSTR szStringSrc);
enum eBStrCompareMethod // 字符串比较方式
{
bcmBinaryCompare = 0, // 二进制比较(区分大小写)
bcmTextCompare = 1 // 文本比较(不区分大小写)
};
// 在 szSrc 中,从第 start 个字符开始(第一个字符位置为1),
// 查找字符串 szFind 的第一次出现的位置(第一个字符位置为1),
// 找到返回值>0,没找到返回0
// 说明:本函数未调用任何库函数(strlen也未调用),提高了运行效率
int InStr(int start,
LPCTSTR szSrc,
LPCTSTR szFind,
eBStrCompareMethod compare=bcmBinaryCompare);
// 在 szSrc 中,从第 1 个字符开始,查找字符串 szFind 的
// 第一次出现的位置(第一个字符位置为1),
// 返回位置号(第一个字符位置为1)。找到返回值>0,没找到返回0
int InStr(LPCTSTR szSrc,
LPCTSTR szFind,
eBStrCompareMethod compare=bcmBinaryCompare);
// 在 szSrc 中,从第 start 个字符开始(第一个字符位置为1)到末尾的部分,
// 查找字符串 szFind 的倒数第一次出现的位置(第一个字符位置为1),
// 找到返回值>0,没找到返回0
// 说明:本函数未调用任何库函数(strlen也未调用),提高了运行效率
int InStrRev(LPCTSTR szSrc,
LPCTSTR szFind,
int start=1,
eBStrCompareMethod compare=bcmTextCompare);
// 按分隔字符串 delimiters ,分割一个字符串,生成若干子字符串
// 各 子字符串 的地址由 ptrStrings[] 数组返回,函数返回子字符串的个数
// ptrStrings[] 数组下标从1开始,最大到函数返回值
// delimiters 为分隔符字符串,省略或为 "" 时使用:空格
// limit 限制返回子字符串的最大个数,为 -1 时不限制,将返回所有字符串
// 子字符串内存及 ptrStrings[] 数组内存都自动分配、自动管理
// iPtrArrExpandPer 为各字段的指针数组 每次动态扩大的大小,应估计字段
// 个数来设置以提高效率
//
// 连续调用 Split,第二次及以后调用并传递上次的 ptrStrings 参数时,
// 本函数将自动 free 前一次的 ptrStrings 参数的指针数组的空间,
// 及指针数组的各元素所指空间
//
// 用法举例:================================
// TCHAR ** s;
// int n,i;
// n=Split(TEXT("a,bc, d,efg, 123"), s, TEXT(","));
// for (i=1;i<=n;i++)
// MsgBox(s[i]);
// ================================================================
int Split(LPCTSTR stringSrc,
TCHAR ** &ptrStrings,
LPCTSTR delimiters=NULL,
int limit=-1,
eBStrCompareMethod compare=bcmBinaryCompare,
int iPtrArrExpandPer = 200);
// 以 delimiter 连接多个字符串,返回连接好的字符串
// 多个字符串的地址由数组 stringSrcArray[] 给出,本函数将连接
// 数组中从下标 arrayIndexStart 到 arrayIndexEnd 的字符串
// delimiter 为 0 时,默认以 "\0" 连接字符串;否则以字符串 delimiter 连接
// bTailDoubleNull 若为 true,则在结果字符串的最后再加一个'\0'(即最后有两个'\0')
// 结果字符串的内存自动分配、由 HM 自动管理
LPTSTR Join(TCHAR * stringSrcArray[],
const int arrayIndexEnd,
LPCTSTR delimiter=0,
const int arrayIndexStart=1,
const bool bTailDoubleNull=false);
// 替换字符串,返回替换后的字符串
// 替换后的字符串空间自动分配、由 HM 自动管理
LPTSTR Replace(LPCTSTR szStringSrc, // 要被替换的字符串
LPCTSTR szFind, // 要被替换掉的子字符串
LPCTSTR szReplaceWith, // 要替换为的内容
int start=1, // 在 szStringSrc 中子字符串搜索的开始位置
int countLimit=-1, // 子字符串进行替换的次数。–1 表明进行所有可能的替换
eBStrCompareMethod compare=bcmBinaryCompare // 判别子字符串时所用的比较方式
);
// 连接字符串,生成连接后的长字符串
// 返回连接好的字符串的首地址,自动分配结果字符串的空间、由 HM 自动管理
// 每次调用可最多连接9个字符串
LPTSTR StrAppend(LPCTSTR str1=0,
LPCTSTR str2=0,
LPCTSTR str3=0,
LPCTSTR str4=0,
LPCTSTR str5=0,
LPCTSTR str6=0,
LPCTSTR str7=0,
LPCTSTR str8=0,
LPCTSTR str9=0 );
// 将 ANSI 或 UTF8 字符串转换为 Unicode,返回结果字符串首地址
// 参数 bToUTF8orANSI 为 false 时转换 ANSI,为 true 时转换 UTF8
// 结果字符串的内存自动分配、由 HM 自动管理
LPWSTR StrConvUnicode(const char * szAnsi, bool bFromUTF8orANSI=false ); // LPWSTR 就是 unsigned short int *
// 将 Unicode 字符串转换为 ANSI 或 UTF8,返回结果字符串首地址
// 参数 bToUTF8orANSI 为 false 时转换为 ANSI,为 true 时转换为 UTF8
// 结果字符串的内存自动分配、由 HM 自动管理
char * StrConvFromUnicode(LPCWSTR szUnicode, bool bToUTF8orANSI=false );
// 将字符串转换为 double 型数值
double Val( LPCWSTR stringVal ); // 转换 Unicode 字符串
double Val( LPCSTR stringVal ); // 转换 ANSI 字符串
报错信息
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/994154807766120.png "#left")