--- spal60sr\src\TSSGCtrl\SSString.original.cpp	Sun Apr  6 21:44:36 2003
+++ spal60sr\src\TSSGCtrl\SSString.cpp	Sun Apr  6 21:44:36 2003
@@ -1,5 +1,12 @@
 #include "SSString.h"
 
+#define LOCAL_MEMORY_SUPPORT 1
+#define FIX_ADJUST_BY_STRING 1
+
+#if defined(UNICODE_SUPPORT) && UNICODE_SUPPORT
+#include "intrinsic.h"
+#endif
+
 //---------------------------------------------------------------------
 //uݒ֐v
 //
@@ -18,6 +25,16 @@
  size = TStringDivision::ToULongDef(tmpV[1]);
  endWord = (tmpV[2]=="null")? (string)"00" : tmpV[2];
 
+#if defined(UNICODE_SUPPORT) && UNICODE_SUPPORT
+ isUnicode = (endWord.length() == 7 &&
+	*(LPDWORD) endWord.c_str()      == BSWAP32('unic') &&
+	*(LPDWORD)(endWord.c_str() + 4) == BSWAP32('ode\0'));
+ if (isUnicode)
+ {
+	endWord = "0000";
+	size &= -2;
+ }
+#endif
 
  //̂؂蕪
  SSGC.strD.List(name, "/", &tmpV, strD::dtESCAPE+strD::etREPLACE+strD::etTRIM);
@@ -35,6 +52,29 @@
 //	ETSSArg *ArgɁAf[^܂B
 //	ETSSArgƂēn|C^́ATSSArgStringNXł邱ƁB
 //---------------------------------------------------------------------
+#if defined(UNICODE_SUPPORT) && UNICODE_SUPPORT
+void __stdcall TSSString_Read_UnicodeString(TSSString *_this, unsigned long size, string &Data, char *tmpC)
+{
+	if (_this->isUnicode)
+	{
+		Data.resize(size);
+		int cchMultiByte =
+			WideCharToMultiByte(
+				CP_ACP,
+				0,
+				(LPCWSTR)tmpC,
+				-1,
+				Data.begin(),
+				size + 1,
+				NULL,
+				NULL);
+		if (cchMultiByte != 0)
+			cchMultiByte--;
+		Data.resize(cchMultiByte);
+	}
+}
+//---------------------------------------------------------------------
+#endif
 unsigned long TSSString::Read(TSSGCtrl &SSGC, TSSArg *Arg)
 {
  if((Arg==NULL) || (Arg->GetType()!=ssgCtrl::atSTRING) )
@@ -43,28 +83,52 @@
  Setting(SSGC);
 
  TSmartHandle SHandle;
+#if !defined(LOCAL_MEMORY_SUPPORT) || !LOCAL_MEMORY_SUPPORT
  if(( SHandle=SSGC.Open(this, PROCESS_VM_READ) )==NULL)
+#else
+ if ((SHandle = SSGC.Open(this, PROCESS_VM_READ, addressStr.c_str())) == NULL)
+#endif
 	return ssgCtrl::reOPEN_ERROR;	//vZX̃I[vG[
 
+#if !defined(SUBJECT_STATUS) || !SUBJECT_STATUS
  if(!SSGC.IsEnabled(this)) return ssgCtrl::reNOT_ENABLED;	//LU
+#else
+ if(!SSGC.IsEnabled(this, TRUE)) return ssgCtrl::reNOT_ENABLED;	//LU
+#endif
 
 
  //Kp
  unsigned long Address = SSGC.GetAddress(this, addressStr);
+#if defined(SUBJECT_STATUS) && SUBJECT_STATUS
+ address = (const BYTE *)Address;
+#endif
 
+#if !defined(UNICODE_SUPPORT) || !UNICODE_SUPPORT
  char *tmpC = new char[size+1];
  tmpC[size] = (char)NULL;
+#else
+ char *tmpC = new char[size + 2];
+ *(LPWSTR)&tmpC[size] = L'\0';
+#endif
 
  if(!SSGC.OneRead(this, SHandle, Address, tmpC, size)){
     delete[] tmpC;
  	return ssgCtrl::reACCESS_ERROR; //G[ȂssgCtrl::reACCESS_ERRORԂ
  }
  string Data(tmpC);
+#if defined(UNICODE_SUPPORT) && UNICODE_SUPPORT
+ TSSString_Read_UnicodeString(size, endWord, Data, tmpC);
+#endif
  delete[] tmpC;
 
  if((!endWord.empty())&&(endWord!="00")){
 	unsigned long Pos = SSGC.strD.Find(Data, SSGC.GetSimpleByteCode(this, endWord));
+#if !defined(UNICODE_SUPPORT) || !UNICODE_SUPPORT
 	if((size_t)Pos != string::npos) Data[Pos]=(byte)NULL;
+#else
+	if ((size_t)Pos != string::npos && !isUnicode)
+		Data.resize(Pos);
+#endif
  }
 
  ((TSSArgString*)Arg)->SetValue( Data );
@@ -85,7 +149,11 @@
  Setting(SSGC);
 
  TSmartHandle SHandle;
+#if !defined(LOCAL_MEMORY_SUPPORT) || !LOCAL_MEMORY_SUPPORT
  if(( SHandle=SSGC.Open(this, PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_VM_OPERATION) )==NULL)
+#else
+ if ((SHandle = SSGC.Open(this, PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, addressStr.c_str())) == NULL)
+#endif
 	return ssgCtrl::reOPEN_ERROR;	//vZX̃I[vG[
 
  if(!SSGC.IsEnabled(this)) return ssgCtrl::reNOT_ENABLED;	//LU
@@ -93,10 +161,30 @@
 
  //Kp
  unsigned long Address = SSGC.GetAddress(this, addressStr);
+#if defined(SUBJECT_STATUS) && SUBJECT_STATUS
+ address = (const BYTE *)Address;
+#endif
 
  string Str( ((TSSArgString*)Arg)->GetValue() );
  string WriteString;
+#if !defined(UNICODE_SUPPORT) || !UNICODE_SUPPORT
  WriteString.reserve( Str.size()*2 + endWord.size() );
+#else
+ size_t n = Str.size() * 2 + endWord.size();
+ WriteString.reserve(n);
+ if (isUnicode)
+ {
+	size_t unicodeSize = MultiByteToWideChar(
+		CP_ACP,
+		0,
+		Str.c_str(),
+		Str.length(),
+		(LPWSTR)WriteString.begin(),
+		n / 2) * 2;
+	Str = string(WriteString.c_str(), min(unicodeSize, size));
+	WriteString.clear();
+ }
+#endif
  {//AoCgɕϊ
 	string::iterator 
 		SIt = Str.begin(),
@@ -131,9 +219,27 @@
  string Val = ((TSSArgString*)Arg)->GetValue();
  string tmpS;
  tmpS.reserve(size*2);
+#if defined(UNICODE_SUPPORT) && UNICODE_SUPPORT
+ if (isUnicode)
+ {
+	size_t unicodeSize = MultiByteToWideChar(
+		CP_ACP,
+		0,
+		Val.c_str(),
+		Val.length(),
+		(LPWSTR)tmpS.begin(),
+		size) * 2;
+	Val = string(tmpS.c_str(), min(unicodeSize, size));
+	tmpS.clear();
+ }
+#endif
 
  unsigned long i=0, End=Val.size();
+#if !defined(FIX_ADJUST_BY_STRING) || !FIX_ADJUST_BY_STRING
  for(; i<End; i++) tmpS += TStringDivision::ToString((char)Val[i], "%02X");
+#else
+ for(; i<End; i++) tmpS += TStringDivision::ToString((unsigned char)Val[i], "%02X");
+#endif
  
  if((size -End) != 0){
 	tmpS += "*+04";
