[PRUI]第一个工程中第一个类·PRString

第一个类PRString的Beta版本算是做好了,ANSI 和Unicode转换那一块还有BUG,还有几个小功能没补。

PRString 就是一字符串类,类似std::string

PRMisc.h

#pragma once
#include "stdafx.h"
#include "PRUI_CodeArea\PRUI_Import.h"
template<class T>
BOOLEAN PRPURE_API PRMemory_PutValue(PVOID pvMem,T dwObject)
{
    if (IsBadWritePtr(pvMem, sizeof(T))) return FALSE;
    *(T*)pvMem = dwObject;
    return TRUE;
}
class PRUI_CLASSAPI PRString
{
private:
    LPWSTR szStringBase;
    DWORD dwStringLength;
public:
    //Constructor
    PRString();
    ~PRString();
    PRString(LPWSTR szReference);
    PRString(LPSTR szReference);
    //String equal
    //For UnicodeString
    PRString& operator=(LPWSTR szString);
    //For AnsiString
    PRString& operator=(LPSTR szString);
    //Get/Set Character
    WCHAR operator[](size_t dwIndex);
    void ModifyCharacter(size_t dwIndex, WCHAR chNewChar);
    WCHAR IndexOf(size_t dwIndex);
    //String API
    DWORD LengthOf();
    PRString& Duplicate();
    //It‘s safe.
    LPWSTR GetString();
    //Unsafe Method
    LPWSTR GetBuffer();
    //Make it safe.
    void SyncBuffer();
    LPSTR GetStringA();
    //String Upper/Lower
    PRString& UpperString(BOOLEAN bUpdateThis);
    PRString& LowerString(BOOLEAN bUpdateThis);
    //String compare
    BOOLEAN Compare(PRString& szTarget, BOOLEAN bCaseInSensitive);
    bool operator == (PRString &szTarget);
    //Memory
    PRString& AllocateString(size_t dwSize, BOOLEAN bReAllocate, BOOLEAN bUpdateThis);
    PRString& WriteString
    (size_t dwLocation, LPWSTR szString, size_t dwCount, BOOLEAN bUpdateThis, LPDWORD lpdwCopied);
    //Reload
    PRString& WriteString
    (size_t dwLocation, PRString& szString, size_t dwCount, BOOLEAN bUpdateThis, LPDWORD lpdwCopied);
    //String append
    PRString& AppendString(PRString& szTarget, BOOLEAN bUpdateThis);
    PRString& operator + (PRString &szTarget);
    //Find
    //Replace
    //Trim from...to...
};

PRMisc.cpp

#pragma once
#include "stdafx.h"
#include "PRUI_CodeArea\PRUI_Import.h"
#include "PRMisc.h"
#pragma region PRString Area
    //Constructor
    PRString::PRString() {
        PRString("");
    }
    PRString::~PRString()
    {
        LocalFree((HLOCAL)szStringBase);
        szStringBase = 0;
        dwStringLength = 0;
    }
    PRString::PRString(LPWSTR szReference) { *this = szReference; }
    PRString::PRString(LPSTR szReference) { *this = szReference; }
    //String equal
    //For UnicodeString
    PRString& PRString::operator=(LPWSTR szString)
    {
        AllocateString(lstrlenW(szString), FALSE, TRUE);
        WriteString(0, szString, lstrlenW(szString), TRUE, 0);
        return *this;
    }
    //For AnsiString
    PRString& PRString::operator=(LPSTR szString)
    {
        dwStringLength = MultiByteToWideChar(CP_ACP, 0, szString, -1, 0, 0);
        AllocateString(dwStringLength, FALSE, TRUE);
        MultiByteToWideChar(CP_ACP, 0, szString, -1, GetBuffer(), dwStringLength);
        dwStringLength--;
        //ANSI String->Unicode String,本类以Unicode String为主
        return *this;
    }
    //Get/Set Character
    WCHAR PRString::operator[](size_t dwIndex)
    {
        return szStringBase[dwIndex];
    }
    void PRString::ModifyCharacter(size_t dwIndex, WCHAR chNewChar)
    {
        szStringBase[dwIndex] = chNewChar;
        if (chNewChar == ‘\0‘) SyncBuffer();
    }
    WCHAR PRString::IndexOf(size_t dwIndex) { return this->operator[](dwIndex); }
    //String API
    DWORD PRString::LengthOf() { return dwStringLength; }
    PRString& PRString::Duplicate()
    {
        PRString* szObjRef = new PRString(GetBuffer());
        PRString& szReturn = *szObjRef;
        return szReturn;
    }
    LPWSTR PRString::GetString() { return Duplicate().GetBuffer(); }
    //It‘s safe.
    LPWSTR PRString::GetBuffer() { return szStringBase; }
    void PRString::SyncBuffer() { dwStringLength = lstrlenW(szStringBase); }
    //Make it safe.
    LPSTR PRString::GetStringA() {
        DWORD dwAnsiStringLength;
        CHAR* szAnsiString;
        dwAnsiStringLength = WideCharToMultiByte(CP_ACP, 0, szStringBase, -1, 0, 0, 0, 0);
        szAnsiString = new CHAR[dwAnsiStringLength];
        WideCharToMultiByte(CP_ACP, 0, szStringBase, -1, szAnsiString, dwAnsiStringLength, 0, 0);
        return szAnsiString;
    }
    PRString& PRString::UpperString(BOOLEAN bUpdateThis)
    {
        PRString& szTemp = bUpdateThis ? *this : Duplicate();
        _wcsupr_s(szTemp.GetBuffer(), szTemp.LengthOf());
        szTemp.SyncBuffer();
        return szTemp;
    }
    PRString& PRString::LowerString(BOOLEAN bUpdateThis)
    {
        PRString& szTemp = bUpdateThis ? *this : Duplicate();
        _wcslwr_s(szTemp.GetBuffer(), szTemp.LengthOf());
        szTemp.SyncBuffer();
        return szTemp;
    }
    //String compare
    BOOLEAN PRString::Compare(PRString& szTarget, BOOLEAN bCaseInSensitive)
    {
        PRString szTarget_ = szTarget,
            szDestination = *this;
        if (!bCaseInSensitive) {
            szTarget_ = szTarget_.UpperString(FALSE);
            szDestination = szDestination.UpperString(FALSE);
        }
        if (szTarget_.LengthOf() != szDestination.LengthOf()) return FALSE;
        for (size_t i = 0; i < szTarget_.LengthOf(); i++) {
            if (szTarget_[i] != szDestination[i]) return FALSE;
        }
        return TRUE;
    }
    bool PRString::operator == (PRString &szTarget) {
        return Compare(szTarget, 1) == 1 ?  true : false;
    }
    //Memory
    PRString& PRString::AllocateString(size_t dwSize, BOOLEAN bReAllocate, BOOLEAN bUpdateThis)
    {
        PRString& szResult = bUpdateThis ? *this : Duplicate();
        HANDLE hHeap = GetProcessHeap();
        LPWSTR szBuffer = (LPWSTR)HeapAlloc(hHeap, 8, dwSize * sizeof(WCHAR) + 1);
        if (bReAllocate) lstrcpyW(szBuffer, this->GetBuffer());
        szResult.szStringBase = szBuffer;
        szResult.dwStringLength = dwSize;
        return szResult;
    }
    PRString& PRString::WriteString
    (size_t dwLocation, LPWSTR szString, size_t dwCount, BOOLEAN bUpdateThis, LPDWORD lpdwCopied)
    {
        PRString& szTarget = bUpdateThis ? *this : Duplicate();
        PRMemory_PutValue<int>((PVOID)lpdwCopied, 0);
        for (size_t i = dwLocation;
            i < (((dwLocation + dwCount - 1) > szTarget.LengthOf()) ?
                szTarget.LengthOf() : dwLocation + dwCount);
            i++) {
            szTarget.ModifyCharacter(i, szString[i - dwLocation]);
            PRMemory_PutValue<int>((PVOID)lpdwCopied, i - dwLocation + 1);
        }
        return szTarget;
    }
    //Reload
    PRString& PRString::WriteString
    (size_t dwLocation, PRString& szString, size_t dwCount, BOOLEAN bUpdateThis, LPDWORD lpdwCopied)
    {
        PRString& szTarget = bUpdateThis ? *this : Duplicate();
        PRMemory_PutValue<int>((PVOID)lpdwCopied, 0);
        for (size_t i = dwLocation;
            i < (((dwLocation + dwCount - 1) > szTarget.LengthOf()) ?
                szTarget.LengthOf() : dwLocation + dwCount);
            i++) {
            szTarget.ModifyCharacter(i, szString[i - dwLocation]);
            PRMemory_PutValue<int>((PVOID)lpdwCopied, i - dwLocation + 1);
        }
        return szTarget;
    }
    //String append
    PRString& PRString::AppendString(PRString& szTarget, BOOLEAN bUpdateThis)
    {
        DWORD dwLengthTotal = szTarget.LengthOf() + this->LengthOf();
        PRString& szResult = bUpdateThis ? *this : Duplicate();
        szResult = szResult.AllocateString(dwLengthTotal, TRUE, TRUE);
        szResult.WriteString(this->LengthOf(), szTarget, szTarget.LengthOf(), TRUE, 0);
        return szResult;
    }
    PRString& PRString::operator + (PRString &szTarget) {
        return AppendString(szTarget, TRUE);
    }
#pragma endregion
时间: 2024-10-04 17:41:16

[PRUI]第一个工程中第一个类·PRString的相关文章

在一个工程中使用另外一个工程的类

比如我们在A工程中定义了类A,但是在另外一个工程中的类B中想调用类A中的函数,这时,可以在类A的头文件中加入如下代码: #if !defined(AFX_DRAWPOLYLINEJIG__INCLUDED_) #define AFX_DRAWPOLYLINEJIG__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 同时在类A的源文件中加入如下代码(在源文件所包含的头文件下面加): #include &qu

VC/MFC中通过CWebPage类调用javascript函数(给js函数传参,并取得返回值)

转自:http://www.cnblogs.com/javaexam2/archive/2012/07/14/2632959.html ①需要一个别人写好的类CWebPage,将其对于的两个文件WebPage.h和WebPage.cpp添加到工程中. CWebPage类头文件和实现文件下载地址: http://download.csdn.net/detail/masikkk/4427190 ②添加WebBrowser控件,在视图/对话框类的头文件中#include "webbrowser2.h&

如何在MFC DLL中向C#类发送消息

如何在MFC DLL中向C#类发送消息 一. 引言 由于Windows Message才是Windows平台的通用数据流通格式,故在跨语言传输数据时,Message是一个不错的选择,本文档将描述如何在MFC DLL中向C#窗口类发送消息. 二. 实现过程 1. 新建一个基于MFC的DLL工程,在工程作用是用于生成Dll库函数: 2. 在该工程中新增一个类,CMessager: 3. 在头文件中添加代码如下: 1 #define ZS_API extern "C" _declspec (

Tomcat热部署,Web工程中线程没有终止

近期项目中,用 jenkins 热部署 web工程时,发现工程中静态持有的线程(将ScheduledExecutorService定时任务存储在静态Map中),导致不定时出现数据库访问事务关闭异常,如下:org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.Il

三道习题(1、将单词表中由相同字母组成的单词归成一类,每类单词按照单词的首字母排序,并按 #每类中第一个单词字典序由大到小排列输出各个类别。 #输入格式:按字典序由小到大输入若干个单词,每个单词占一行,以end结束输入。)

#coding=gbk ''' 1.将单词表中由相同字母组成的单词归成一类,每类单词按照单词的首字母排序,并按 #每类中第一个单词字典序由大到小排列输出各个类别. #输入格式:按字典序由小到大输入若干个单词,每个单词占一行,以end结束输入. #cinema #iceman #maps #spam #aboard #abroad #end #输出格式:一类单词一行,类别间单词以空格隔开. #aboard abroad #cinema iceman #maps spam ''' result=[]

《Deep Learning》译文 第一章 前言(中) 神经网络的变迁与称谓的更迭

转载请注明出处! 第一章 前言(中) 1.1 本书适合哪些人阅读? 可以说本书的受众目标比较广泛,但是本书可能更适合于如下的两类人群,一类是学习过与机器学习相关课程的大学生们(本科生或者研究生),这包括了那些刚刚开始深度学习和AI研究的同学们:另一类是有机器学习或统计学背景的,想快速将深度学习应用在其产品或平台中的软件开发者们.深度学习早已被证实可以在许多软件应用中发挥光和热,比如:计算机视觉.语音与视频处理.自然语言理解.机器人学.生物学与化学.电视游戏.搜索引擎.在线广告与金融学等等. 为了

iOS狂暴之路---iOS的第一个应用中能学到哪些知识

一.前文回顾 在之前已经介绍了 iOS的学习路线图,因为中间遇到一些Android开发问题,所以就耽搁了一段时间,那么接下来的这段时间我们将继续开始iOS的狂暴之路学习,按照国际惯例,第一个应用当然是我们的HelloWorld程序了.那么本文将会通过这么一个简单的程序来讲解一下iOS中的程序生命周期,应用中关键的几个对象,项目结构,最后在手把手的创建一个空项目. 二.建立简单程序HelloWorld 下面先用Xcode来新建一个HelloWorld程序: 点击下一步即可: 这里和我们在Andro

hibernate 的第一个工程

一.什么是Hibernate? Hibernate 是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2

Annotation 的第一个工程

一.什么是 Annotation? java.lang.annotation,接口 Annotation.对于Annotation,是Java5的新特性,JDK5引入了Metadata(元数据)很容易的就能够调用Annotations.Annotations提供一些本来不属于程序的数据,比如:一段代码的作者或者告诉编译器禁止一些特殊的错误.An annotation 对代码的执行没有什么影响.Annotations使用@annotation的形式应用于代码:类(class),属性(attribu