获取控制台程序输入信息

来源:互联网 发布:linux finger服务 编辑:程序博客网 时间:2024/05/05 13:14

文件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();