• 获取控制台程序输入信息


    文件ProgramExec.h

    //---------------------------------------------------------------------------

    #ifndef ProgramExecH
    #define ProgramExecH

    #include "MyUnicodeString.h"
    //---------------------------------------------------------------------------
    DWORD WINAPI ReadFromPipe(LPVOID args);

    /* globals */

    #define CHUNK 25
    #define STATICBUFFERSIZE    1000
    typedef struct {
     HANDLE pipe;
     char buffer[STATICBUFFERSIZE];
    } pipeinfo;

    pipeinfo Out = { INVALID_HANDLE_VALUE, '/0' };
    pipeinfo Err = { INVALID_HANDLE_VALUE, '/0' };
    MyUnicodeString* myUnicodeString;

    void execProgram(UnicodeString& cmd,MyUnicodeString& _myUnicodeString,int& returnCode)
    {
     STARTUPINFOW si;
     PROCESS_INFORMATION pi;
     SECURITY_ATTRIBUTES sa;
     DWORD threadID;
     char msg[300];
     BOOL ok;
     HANDLE hProcess, h, pipeThreads[2];
     char cmdline[100];
     myUnicodeString = &_myUnicodeString;

     hProcess = GetCurrentProcess();

     ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
     ZeroMemory(&si, sizeof(STARTUPINFOW));
     si.cb = sizeof(STARTUPINFOW);
     si.dwFlags = STARTF_USESTDHANDLES;
     si.hStdInput = INVALID_HANDLE_VALUE;

     ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
     sa.nLength = sizeof(SECURITY_ATTRIBUTES);
     sa.lpSecurityDescriptor = NULL;
     sa.bInheritHandle = TRUE;

     /*
      * Create a non-inheritible pipe.
      */
     CreatePipe(&Out.pipe, &h, &sa, 0);

     /*
      * Dupe the write side, make it inheritible, and close the original.
      */
     DuplicateHandle(hProcess, h, hProcess, &si.hStdOutput, 0, TRUE,
       DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);

     /*
      * Same as above, but for the error side.
      */
     CreatePipe(&Err.pipe, &h, &sa, 0);
     DuplicateHandle(hProcess, h, hProcess, &si.hStdError, 0, TRUE,
       DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);

     ok = CreateProcessW(NULL, /* Module name. */
     cmd.w_str(), /* Command line. */
     NULL, /* Process handle not inheritable. */
     NULL, /* Thread handle not inher 调用一个控制台程序并取得其输出(PIPE)
      www.firnow.com    时间 : 2007-10-19  作者:佚名   编辑:本站 点击:   [ 评论 ]
      itable. */
     TRUE, /* yes, inherit handles. */
     DETACHED_PROCESS, /* No console for you. */
     NULL, /* Use parent's environment block. */
     NULL, /* Use parent's starting directory. */
     &si, /* Pointer to STARTUPINFOW structure. */
     &pi); /* Pointer to PROCESS_INFORMATION structure. */

     if (!ok) {
      DWORD err = GetLastError();
      int chars = _snprintf(msg, sizeof(msg) - 1,
        "Tried to launch: /"%s/", but got error [%u]: ", cmdline, err);

      FormatMessage(
        FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS
          | FORMAT_MESSAGE_MAX_WIDTH_MASK, 0L, err, 0,
        &msg[chars], (300 - chars), 0);
      WriteFile(GetStdHandle(STD_ERROR_HANDLE), msg, lstrlen(msg), &err, NULL);
      returnCode = 2;
      return;
     }

     /*
      * Close our references to the write handles that have now been inherited.
      */
     CloseHandle(si.hStdOutput);
     CloseHandle(si.hStdError);

     WaitForInputIdle(pi.hProcess, 5000);
     CloseHandle(pi.hThread);

     /*
      * Start the pipe reader threads.
      */
     pipeThreads[0] = CreateThread(NULL, 0, ReadFromPipe, &Out, 0, &threadID);
     pipeThreads[1] = CreateThread(NULL, 0, ReadFromPipe, &Err, 0, &threadID);

     /*
      * Block waiting for the process to end.
      */
     WaitForSingleObject(pi.hProcess, INFINITE);
     CloseHandle(pi.hProcess);

     /*
      * Wait for our pipe to get done reading, should it be a little slow.
      */
     WaitForMultipleObjects(2, pipeThreads, TRUE, INFINITE);
     CloseHandle(pipeThreads[0]);
     CloseHandle(pipeThreads[1]);
     returnCode = 0;
     return;
    }
    DWORD WINAPI ReadFromPipe(LPVOID args)
    {
     pipeinfo *pi = (pipeinfo *) args;
     DWORD dwRead;
     BOOL ok;
     char buf[2000];

     while(true)
     {
      ok = ReadFile(pi->pipe, buf, 2000, &dwRead, 0L);
      if (!ok || dwRead == 0)
      {
       CloseHandle(pi->pipe);
       return 0;
      }
      else
      {
       buf[dwRead] = 0;
    //   printf("%s", buf);
             myUnicodeString->append(buf);
      }
     }
    }

    #endif

    文件MyUnicodeString.h

    //---------------------------------------------------------------------------

    #ifndef MyUnicodeStringH
    #define MyUnicodeStringH
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #include <windows.h>
    #include <list>
    using namespace std;

    class MyUnicodeString
    {
    public:
     MyUnicodeString();
     ~MyUnicodeString();
     MyUnicodeString(wchar_t * wchar_ts);
     MyUnicodeString(UnicodeString str);
     MyUnicodeString(const wchar_t * wchar_ts);
     MyUnicodeString(int number);
     int indexOf(wchar_t ch);
     int indexOf(wchar_t * wchar_ts);
     int lastIndexOf(wchar_t ch);
     int lastIndexOf(wchar_t * wchar_ts);
     int getOccurCount(wchar_t* wchar_ts);
     int getOccurCount(wchar_t ch);
     int getLength();
     int getLength(wchar_t * str);
     int getLength(const wchar_t * str);
     wchar_t* getReversed();
     void reverse();
     wchar_t* getReversed(wchar_t * str);
     int copy(const wchar_t* src,wchar_t* dest);
     int copy(wchar_t* src,wchar_t* dest);
     void copy(wchar_t* src,wchar_t* dest,int count);
     void copy(const wchar_t* src,wchar_t* dest,int count);
     list<UnicodeString>* split(wchar_t* splitter);
     list<UnicodeString>* split(UnicodeString splitter);
     wchar_t * getSubString(int startIndex,int count);
     wchar_t * getSubString(int startIndex);
     void rtrim();
     void ltrim();
     void trim();
     bool startsWith(wchar_t *wchar_ts);
     bool endsWith(wchar_t *wchar_ts);
     void replace(wchar_t* oldwchar_ts,wchar_t* newwchar_ts);
        void replace(UnicodeString oldStr,UnicodeString newStr);
     void toUpperCase();
     void toLowerCase();
     MyUnicodeString* operator + (wchar_t* wchar_ts);
     wchar_t* towchar_ts();
     UnicodeString getString();
     wchar_t* getCopy();
     bool isInt();//Contains only numbers
     int toInt();
     bool isLargerThan(wchar_t* wchar_ts);
     bool equals(wchar_t* dest);
     void append(const wchar_t * str);
     void append(UnicodeString str);
     void append(wchar_t * str);
     void append(wchar_t ch);
     void appendNum(int number);
     void append(wchar_t appendwchar_t,int toLength);
     void insertBefore(wchar_t insertwchar_t,int toLength);
     void release();
     wchar_t* getSpace(int count);
    private:
     int indexOf(wchar_t ch,bool isReverse);
     int indexOf(wchar_t * wchar_ts,bool isReverse);
     int indexOf(wchar_t* src,wchar_t ch,bool isReverse);
     int indexOf(wchar_t* src,wchar_t * wchar_ts,bool isReverse);
     wchar_t * getLtrim(wchar_t* wchar_ts);
     wchar_t * getSubString(wchar_t* src,int startIndex,int count);
     wchar_t * getSubString(wchar_t* src,int startIndex);
     bool startsWith(wchar_t* src,wchar_t *wchar_ts);
     void copy(wchar_t* src);
     void copy(const wchar_t* src);
     bool isBufferNull;
     wchar_t * intTowchar_ts(int number);
     void setEndChar(wchar_t* chars,int index);
    protected:
     void replaceBuffer(wchar_t* src);
     wchar_t* charBuffer;
    };


    #endif

    文件MyUnicodeString.cpp

    //---------------------------------------------------------------------------


    #pragma hdrstop

    #include "MyUnicodeString.h"

    //---------------------------------------------------------------------------

    #pragma package(smart_init)
    const wchar_t END_CHAR('/0');

    MyUnicodeString::MyUnicodeString()
    {
     isBufferNull = true;
     charBuffer = NULL;
    }
    MyUnicodeString::MyUnicodeString(UnicodeString str)
    {
     isBufferNull = true;
     charBuffer = NULL;
     if(str.Length()!=0)
     {
      copy(str.w_str());
     }
    }
    MyUnicodeString::MyUnicodeString(wchar_t * wchar_ts)
    {
     isBufferNull = true;
     charBuffer = NULL;
     copy(wchar_ts);
    }
    MyUnicodeString::MyUnicodeString(const wchar_t * wchar_ts)
    {
     isBufferNull = true;
     copy(wchar_ts);
    }
    MyUnicodeString::MyUnicodeString(int number)
    {
     isBufferNull = true;
     wchar_t* wchar_ts = intTowchar_ts(number);
     copy(wchar_ts);
     free(wchar_ts);
    }
    wchar_t * MyUnicodeString::intTowchar_ts(int number)
    {
     const int maxLenForNumber = 10;
     wchar_t * str = getSpace(maxLenForNumber);
     wchar_t temp;
     int i = 0;
     if(number==0)
     {
      str[i]='0';
      i++;
     }
     else
     {
      while(number!=0)
      {
       int remains = number%10;
       number /= 10;
       str[i] = remains+'0';
       i++;
      }
     }
     setEndChar(str,i);
     i--;
     for(int j=0;j<(i+1)/2;j++)
     {
      temp = str[j];
      str[j] = str[i-j];
      str[i-j] = temp;
     }
     return str;
    }
    wchar_t* MyUnicodeString::getSpace(int count)
    {
     return (wchar_t*)malloc(sizeof(wchar_t)*(count+1));
    }
    int MyUnicodeString::indexOf(wchar_t ch)
    {
     return indexOf(ch,true);
    }
    int MyUnicodeString::indexOf(wchar_t * wchar_ts)
    {
     return indexOf(wchar_ts,false);
    }
    int MyUnicodeString::lastIndexOf(wchar_t ch)
    {
        return indexOf(ch,true);
    }
    int MyUnicodeString::lastIndexOf(wchar_t * wchar_ts)
    {
     return indexOf(wchar_ts,true);
    }
    int MyUnicodeString::indexOf(wchar_t ch,bool isReverse)
    {
     return indexOf(charBuffer,ch,isReverse);
    }
    int MyUnicodeString::indexOf(wchar_t * wchar_ts,bool isReverse)
    {
        return indexOf(charBuffer,wchar_ts,isReverse);
    }

    int MyUnicodeString::indexOf(wchar_t* src,wchar_t ch,bool isReverse)
    {
     wchar_t * wchar_ts = getSpace(1);
     wchar_ts[0] = ch;
     setEndChar(wchar_ts,1);
     int index = indexOf(src,wchar_ts,isReverse);
     free(wchar_ts);
        return index;
    }
    int MyUnicodeString::indexOf(wchar_t* src,wchar_t * toSearchwchar_ts,bool isReverse)
    {
     const int NOT_FOUND = -1;
     if(src==NULL)
     {
      return NOT_FOUND;
        }
     if(toSearchwchar_ts[0]==END_CHAR)
      return NOT_FOUND;
     int i = 0;
     int j = 0;
     wchar_t * str,*searchStr;
     int strLen,searchStrLen;
     if(!isReverse)
     {
      str = src;
      searchStr = toSearchwchar_ts;
     }
     else
     {
      str = getReversed();
      searchStr = getReversed(toSearchwchar_ts);
     }
     strLen = getLength(str);
     searchStrLen = getLength(searchStr);
     while(str[i]!=END_CHAR)
     {
         j = 0;
      while(searchStr[j]!=END_CHAR)
      {
       if(str[i+j]==END_CHAR)
        return NOT_FOUND;
       if(str[i+j]!=searchStr[j])
        break;
       j++;
      }
      if(searchStr[j]==END_CHAR)//reach the end
      {
       if(!isReverse)
        return i;
       else
        return strLen-i-searchStrLen;
            }
      i++;
     }
     return NOT_FOUND;
    }
    int MyUnicodeString::getOccurCount(wchar_t* wchar_ts)
    {
     int occurCount = 0;
     int index;
     wchar_t * src = charBuffer;
     while((index=indexOf(src,wchar_ts,false))!=-1)
     {
        src += index+getLength(wchar_ts);
        occurCount++;
     }
     return occurCount;
    }
    int MyUnicodeString::getOccurCount(wchar_t ch)
    {
     wchar_t * wchar_ts = getSpace(1);
     wchar_ts[0] = ch;
     wchar_ts[1] = END_CHAR;
     int occurCount = getOccurCount(wchar_ts);
     free(wchar_ts);
     return occurCount;
    }
    int MyUnicodeString::getLength()
    {
     return getLength(charBuffer);
    }
    int MyUnicodeString::getLength(wchar_t * str)
    {
     const wchar_t* str1 = str;
     return getLength(str1);
    }
    int MyUnicodeString::getLength(const wchar_t * str)
    {
     int i = 0;
     int length = 0;
     if(str!=NULL)
     {
           while(str[i]!=END_CHAR)
      {
       i++;
       length++;
      }
        }

     return length;
    }
    wchar_t* MyUnicodeString::getReversed(wchar_t * str)
    {
     int len = getLength(str);
     wchar_t * wchar_ts = getSpace(len);
     for(int i=0;i<len;i++)
     {
      wchar_ts[len-i-1] = str[i];
     }
     wchar_ts[len] = END_CHAR;
     return wchar_ts;
    }
    wchar_t* MyUnicodeString::getReversed()
    {
     return getReversed(charBuffer);
    }
    void MyUnicodeString::reverse()
    {
     wchar_t* reversed = getReversed();
     replaceBuffer(reversed);
    }
    void MyUnicodeString::append(const wchar_t * str)
    {
     int bufferLen = getLength();
     int strLen = getLength(str);
     if(strLen!=0)
     {
         isBufferNull = false;
           wchar_t * wchar_ts = getSpace(bufferLen+strLen);
      copy(charBuffer,wchar_ts);
      copy(str,wchar_ts+bufferLen);
      replaceBuffer(wchar_ts);
        }
    }
    void MyUnicodeString::append(wchar_t * str)
    {
     const wchar_t* str1 = str;
     append(str1);
    }
    void MyUnicodeString::append(wchar_t ch)
    {
     wchar_t * wchar_ts = getSpace(1);
     wchar_ts[0] = ch;
     wchar_ts[1] = END_CHAR;
     append(wchar_ts);
     free(wchar_ts);
    }
    void MyUnicodeString::append(UnicodeString str)
    {
      append(str.w_str());
    }
    void MyUnicodeString::appendNum(int number)
    {
     wchar_t* wchar_ts = intTowchar_ts(number);
     append(wchar_ts);
     free(wchar_ts);
    }
    int MyUnicodeString::copy(wchar_t* src,wchar_t* dest)
    {
     int i = 0;
     if(src==NULL||dest==NULL)
      return 0;
     while(src[i]!=END_CHAR)
     {
      dest[i] = src[i];
      i++;
     }
     dest[i] = END_CHAR;

     return i;
    }
    int MyUnicodeString::copy(const wchar_t* src,wchar_t* dest)
    {
     int i = 0;
     while(src[i]!=END_CHAR)
     {
      dest[i] = src[i];
      i++;
     }
     dest[i] = END_CHAR;
     return i;
    }
    void MyUnicodeString::copy(wchar_t* src,wchar_t* dest,int count)
    {
     int i = 0;
     if(src==NULL||dest==NULL)
     {
      return;
        }
     while(src[i]!=END_CHAR&&i<=count-1)
     {
      dest[i] = src[i];
      i++;
     }
     dest[i] = END_CHAR;
    }
    void MyUnicodeString::copy(const wchar_t* src,wchar_t* dest,int count)
    {
     int i = 0;
     while(src[i]!=END_CHAR&&i<=count-1)
     {
      dest[i] = src[i];
      i++;
     }
     dest[i] = END_CHAR;
    }
    void MyUnicodeString::copy(wchar_t* src)
    {
     int strLen = getLength(src);
     if(strLen!=0)
     {
           release();
      charBuffer = getSpace(strLen);
      isBufferNull = false;
      copy(src,charBuffer);
        }
    }
    void MyUnicodeString::copy(const wchar_t* src)
    {
     int i = 0;
     int strLen = 0;
     while(src[i]!=END_CHAR)
     {
      i++;
      strLen++;
     }
     if(strLen!=0)
     {
      release();
      charBuffer = getSpace(strLen);
      isBufferNull = false;
      copy(src,charBuffer);
     }
    }
    list<UnicodeString>* MyUnicodeString::split(wchar_t* splitter)
    {
     if(charBuffer==NULL)
         return NULL;
     list<UnicodeString>* resultList = new list<UnicodeString>();

     int occurCount = getOccurCount(splitter);
     int splitterLen = getLength(splitter);
     wchar_t** arr = (wchar_t**)malloc(sizeof(wchar_t*)*(occurCount+2));
     wchar_t *src = charBuffer;
     int index;
     int start = 0;
     int arrIndex = 0;
     int length = 0;
     while((index=indexOf(src,splitter,false))!=-1)
     {
      length = index;
      arr[arrIndex] = getSubString(start,length);
      start += length + splitterLen;
      src += length + splitterLen;
      arrIndex++;
     }

     arr[arrIndex] = getSubString(start);

     for(int i=0;i<=arrIndex;i++)
     {
      resultList->push_back(UnicodeString(arr[i]));
      free(arr[i]);
     }
     free(arr);
     return resultList;
    }
    list<UnicodeString>* MyUnicodeString::split(UnicodeString splitter)
    {
     if(splitter!=NULL)
     {
      return split(splitter.w_str());
     }
     else
     {
      return NULL;
        }
    }
    wchar_t * MyUnicodeString::getSubString(wchar_t* src,int startIndex,int count)
    {
     wchar_t* dest = getSpace(count);
     copy(src+startIndex,dest,count);
     return dest;
    }
    wchar_t * MyUnicodeString::getSubString(int startIndex,int count)
    {
     return getSubString(charBuffer,startIndex,count);
    }
    wchar_t * MyUnicodeString::getSubString(wchar_t* src,int startIndex)
    {
     int length = getLength(src+startIndex);
     wchar_t* dest = getSpace(length);
     copy(src+startIndex,dest,length);
     return dest;
    }
    wchar_t * MyUnicodeString::getSubString(int startIndex)
    {
     return getSubString(charBuffer,startIndex);
    }
    void MyUnicodeString::rtrim()
    {
     if(getLength()!=0)
     {
      wchar_t* reversed = getReversed();
      release();
      wchar_t* ltrimed = getLtrim(reversed);
      free(reversed);
      if(getLength(ltrimed)!=0)
      {
       replaceBuffer(getReversed(ltrimed));
      }
      free(ltrimed);
     }
    }
    wchar_t * MyUnicodeString::getLtrim(wchar_t* wchar_ts)
    {
     int i = 0;
     while(wchar_ts[i]!=END_CHAR)
     {
      if(wchar_ts[i]!=' ')
             break;
      i++;
     }
     return getSubString(wchar_ts,i);
    }
    void MyUnicodeString::ltrim()
    {
     if(getLength()!=0)
     {
          wchar_t * ltrimed = getLtrim(charBuffer);
      release();
      copy(ltrimed);
      free(ltrimed);
        }
    }
    void MyUnicodeString::trim()
    {
     rtrim();
     ltrim();
    }
    bool MyUnicodeString::startsWith(wchar_t* src,wchar_t *wchar_ts)
    {
     int i = 0;
     bool result = true;
     while(src[i]!=END_CHAR&&wchar_ts[i]!=END_CHAR)
     {
      if(src[i]!=wchar_ts[i])
      {
        result = false;
        break;
      }
          i++;
     }
     if(src[i]==END_CHAR&&wchar_ts[i]!=END_CHAR)
      result = false;
     return result;
    }
    bool MyUnicodeString::startsWith(wchar_t *wchar_ts)
    {
     return startsWith(charBuffer,wchar_ts);
    }
    bool MyUnicodeString::endsWith(wchar_t *wchar_ts)
    {
     wchar_t* reversedSrc = getReversed();
     wchar_t* reversedwchar_ts = getReversed(wchar_ts);
     bool result =  startsWith(reversedSrc,reversedwchar_ts);
     free(reversedSrc);
     free(reversedwchar_ts);
     return result;
    }
    void MyUnicodeString::replace(wchar_t* oldwchar_ts,wchar_t* newwchar_ts)
    {
     int occurCount = getOccurCount(oldwchar_ts);
     int oldwchar_tsLen = getLength(oldwchar_ts);
     int newwchar_tsLen = getLength(newwchar_ts);
     int newLength = getLength(charBuffer)+(newwchar_tsLen-oldwchar_tsLen)*occurCount;
     wchar_t * wchar_ts = getSpace(newLength);

     wchar_t *src = charBuffer;
     int index;
     int start = 0;
     int i = 0;
     int length = 0;
     wchar_t * temp;
     wchar_t * dest = wchar_ts;
     while((index=indexOf(src,oldwchar_ts,false))!=-1)
     {
      length = index;
      copy(src,dest,length);
      dest += length;
      start = length + oldwchar_tsLen;
      src += start;
      copy(newwchar_ts,dest,newwchar_tsLen);
      dest += newwchar_tsLen;
      i++;
     }

     copy(src,dest);
     wchar_ts[newLength] = END_CHAR;

     copy(wchar_ts);
     free(wchar_ts);
    }
    void MyUnicodeString::replace(UnicodeString oldStr,UnicodeString newStr)
    {
     replace(oldStr.w_str(),newStr.w_str());
    }
    wchar_t* MyUnicodeString::getCopy()
    {
     int length = getLength();
     wchar_t * wchar_ts = getSpace(length);
     copy(charBuffer,wchar_ts);
        return wchar_ts;
    }
    void MyUnicodeString::toUpperCase()
    {
     int i = 0;
     wchar_t* dest = getCopy();
     while(dest[i]!=END_CHAR)
     {
      if(dest[i]>='a'&&dest[i]<='z')
       dest[i] -= 'a'-'A';
      i++;
     }
     copy(dest);
     free(dest);
    }
    void MyUnicodeString::toLowerCase()
    {
     int i = 0;
        wchar_t* dest = getCopy();
     while(dest[i]!=END_CHAR)
     {
      if(dest[i]>='A'&&dest[i]<='Z')
       dest[i] += 'a'-'A';
      i++;
     }
     copy(dest);
     free(dest);
    }
    MyUnicodeString* MyUnicodeString::operator + (wchar_t* wchar_ts)
    {
     append(wchar_ts);
     return this;
    }
    wchar_t* MyUnicodeString::towchar_ts()
    {
        return charBuffer;
    }
    UnicodeString MyUnicodeString::getString()
    {
     return UnicodeString(charBuffer);
    }
    bool MyUnicodeString::equals(wchar_t* dest)
    {
     if(getLength()==getLength(dest)&&startsWith(dest))
      return true;
     else
         return false;
    }
    bool MyUnicodeString::isInt()
    {
     if(charBuffer==NULL)
         return false;
        int i = 0;
     while(charBuffer[i]!=END_CHAR)
     {
      if(i==0)
      {
       if((charBuffer[i]<'0'||charBuffer[i]>'9')
        &&charBuffer[i]!='-')
        return false;
      }
      else
      {
                if(charBuffer[i]<'0'||charBuffer[i]>'9')
        return false;
            }
      i++;
     }
     return true;
    }
    int MyUnicodeString::toInt()
    {
        int i = 0;
     int result = 0;
     int sub = 1;      //To identify positive or negative number
     if(isInt())
     {
      while(charBuffer[i]!=END_CHAR)
      {
       if(i==0&&charBuffer[i]=='-')
         sub = -1;
       else
        result = result*10+charBuffer[i]-48;

       i++;
      }
      result *= sub;
     }
     else
     {
            throw "Not Integer";
        }

     return result;
    }
    bool MyUnicodeString::isLargerThan(wchar_t* wchar_ts)
    {
     int i = 0;
     while(charBuffer[i]!=END_CHAR&&wchar_ts[i]!=END_CHAR)
     {
      if(charBuffer[i]>wchar_ts[i])
       return true;
      else if (charBuffer[i]<wchar_ts[i])
       return false;

         i++;
     }
     if(charBuffer[i]==END_CHAR&&wchar_ts[i]!=END_CHAR)
      return false;
        if(charBuffer[i]!=END_CHAR&&wchar_ts[i]==END_CHAR)
      return true;
     return false;
    }
    void MyUnicodeString::replaceBuffer(wchar_t* src)
    {
     release();
     isBufferNull = false;
     charBuffer = src;
    }
    void MyUnicodeString::append(wchar_t appendwchar_t,int toLength)
    {
     int len = getLength();
     wchar_t* wchar_ts = getSpace(toLength);
     copy(charBuffer,wchar_ts);
     for(int i=0;i<toLength-len;i++)
     {
      wchar_ts[len+i]=appendwchar_t;
     }
     wchar_ts[toLength] = END_CHAR;
     replaceBuffer(wchar_ts);
    }
    void MyUnicodeString::insertBefore(wchar_t insertwchar_t,int toLength)
    {
     int len = getLength();
     if(toLength>len)
     {
      wchar_t* wchar_ts = getSpace(toLength);
      int i;
      for(i=0;i<toLength-len;i++)
      {
       wchar_ts[i]=insertwchar_t;
      }
      copy(charBuffer,wchar_ts+i);
      replaceBuffer(wchar_ts);
        }
    }
    void MyUnicodeString::release()
    {
     if(!isBufferNull)
     {
      free(charBuffer);
      charBuffer = NULL;
      isBufferNull = true;
     }
    }
    void MyUnicodeString::setEndChar(wchar_t* chars,int index)
    {
     wcscpy(chars+index,L"/0");
    }
    MyUnicodeString::~MyUnicodeString()
    {
        release();
    }

    测试代码:

     UnicodeString cmd("help");
     MyUnicodeString myUnicodeString;
     int returnCode;
     execProgram(cmd,myUnicodeString,returnCode);

     控制台程序输入信息:myUnicodeString.getString();

  • 相关阅读:
    C语言的指针移位问题
    makefile、gdb使用记录
    MUSIC算法学习笔记
    时间格式转换
    linux网络编程笔记——UDP
    linux网络编程笔记——TCP
    bash里,echo对换行符的处理
    树莓派使用8188eu无线网卡
    时间都去哪了?——安卓GTD工具
    让sublime text 2更好地支持Python
  • 原文地址:https://www.cnblogs.com/jerry1999/p/3677364.html
Copyright © 2020-2023  润新知