| 
					
				 | 
			
			
				@@ -17,6 +17,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "cmMakefile.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "cmSourceFile.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "cmTarget.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <cmsys/Encoding.hxx> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //---------------------------------------------------------------------------- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 cmGlobalVisualStudioGenerator::cmGlobalVisualStudioGenerator() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -559,52 +560,53 @@ bool IsVisualStudioMacrosFileRegistered(const std::string& macrosFile, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   keyname = regKeyBase + "\\OtherProjects7"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   hkey = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  result = RegOpenKeyEx(HKEY_CURRENT_USER, keyname.c_str(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        0, KEY_READ, &hkey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  result = RegOpenKeyExW(HKEY_CURRENT_USER, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         cmsys::Encoding::ToWide(keyname).c_str(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         0, KEY_READ, &hkey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (ERROR_SUCCESS == result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Iterate the subkeys and look for the values of interest in each subkey: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    CHAR subkeyname[256]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    DWORD cch_subkeyname = sizeof(subkeyname)/sizeof(subkeyname[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    CHAR keyclass[256]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    DWORD cch_keyclass = sizeof(keyclass)/sizeof(keyclass[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    wchar_t subkeyname[256]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    DWORD cch_subkeyname = sizeof(subkeyname)*sizeof(subkeyname[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    wchar_t keyclass[256]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    DWORD cch_keyclass = sizeof(keyclass)*sizeof(keyclass[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     FILETIME lastWriteTime; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     lastWriteTime.dwHighDateTime = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     lastWriteTime.dwLowDateTime = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    while (ERROR_SUCCESS == RegEnumKeyEx(hkey, index, subkeyname, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    while (ERROR_SUCCESS == RegEnumKeyExW(hkey, index, subkeyname, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                          &cch_subkeyname, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       0, keyclass, &cch_keyclass, &lastWriteTime)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // Open the subkey and query the values of interest: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       HKEY hsubkey = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      result = RegOpenKeyEx(hkey, subkeyname, 0, KEY_READ, &hsubkey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      result = RegOpenKeyExW(hkey, subkeyname, 0, KEY_READ, &hsubkey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (ERROR_SUCCESS == result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         DWORD valueType = REG_SZ; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        CHAR data1[256]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        DWORD cch_data1 = sizeof(data1)/sizeof(data1[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        RegQueryValueEx(hsubkey, "Path", 0, &valueType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        wchar_t data1[256]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        DWORD cch_data1 = sizeof(data1)*sizeof(data1[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RegQueryValueExW(hsubkey, L"Path", 0, &valueType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         (LPBYTE) &data1[0], &cch_data1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         DWORD data2 = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         DWORD cch_data2 = sizeof(data2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        RegQueryValueEx(hsubkey, "Security", 0, &valueType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RegQueryValueExW(hsubkey, L"Security", 0, &valueType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         (LPBYTE) &data2, &cch_data2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         DWORD data3 = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         DWORD cch_data3 = sizeof(data3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        RegQueryValueEx(hsubkey, "StorageFormat", 0, &valueType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RegQueryValueExW(hsubkey, L"StorageFormat", 0, &valueType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         (LPBYTE) &data3, &cch_data3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        s2 = cmSystemTools::LowerCase(data1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        s2 = cmSystemTools::LowerCase(cmsys::Encoding::ToNarrow(data1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         cmSystemTools::ConvertToUnixSlashes(s2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (s2 == s1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           macrosRegistered = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        std::string fullname(data1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        std::string fullname = cmsys::Encoding::ToNarrow(data1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         std::string filename; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         std::string filepath; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         std::string filepathname; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -636,8 +638,8 @@ bool IsVisualStudioMacrosFileRegistered(const std::string& macrosFile, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       ++index; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      cch_subkeyname = sizeof(subkeyname)/sizeof(subkeyname[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      cch_keyclass = sizeof(keyclass)/sizeof(keyclass[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      cch_subkeyname = sizeof(subkeyname)*sizeof(subkeyname[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      cch_keyclass = sizeof(keyclass)*sizeof(keyclass[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       lastWriteTime.dwHighDateTime = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       lastWriteTime.dwLowDateTime = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -662,27 +664,28 @@ bool IsVisualStudioMacrosFileRegistered(const std::string& macrosFile, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   keyname = regKeyBase + "\\RecordingProject7"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   hkey = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  result = RegOpenKeyEx(HKEY_CURRENT_USER, keyname.c_str(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        0, KEY_READ, &hkey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  result = RegOpenKeyExW(HKEY_CURRENT_USER, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         cmsys::Encoding::ToWide(keyname).c_str(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         0, KEY_READ, &hkey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (ERROR_SUCCESS == result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     DWORD valueType = REG_SZ; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    CHAR data1[256]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    DWORD cch_data1 = sizeof(data1)/sizeof(data1[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    RegQueryValueEx(hkey, "Path", 0, &valueType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    wchar_t data1[256]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    DWORD cch_data1 = sizeof(data1)*sizeof(data1[0]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RegQueryValueExW(hkey, L"Path", 0, &valueType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     (LPBYTE) &data1[0], &cch_data1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     DWORD data2 = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     DWORD cch_data2 = sizeof(data2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    RegQueryValueEx(hkey, "Security", 0, &valueType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RegQueryValueExW(hkey, L"Security", 0, &valueType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     (LPBYTE) &data2, &cch_data2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     DWORD data3 = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     DWORD cch_data3 = sizeof(data3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    RegQueryValueEx(hkey, "StorageFormat", 0, &valueType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RegQueryValueExW(hkey, L"StorageFormat", 0, &valueType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     (LPBYTE) &data3, &cch_data3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    s2 = cmSystemTools::LowerCase(data1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    s2 = cmSystemTools::LowerCase(cmsys::Encoding::ToNarrow(data1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     cmSystemTools::ConvertToUnixSlashes(s2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (s2 == s1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -714,24 +717,27 @@ void WriteVSMacrosFileRegistryEntry( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   std::string keyname = regKeyBase + "\\OtherProjects7"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   HKEY hkey = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  LONG result = RegOpenKeyEx(HKEY_CURRENT_USER, keyname.c_str(), 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  LONG result = RegOpenKeyExW(HKEY_CURRENT_USER, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cmsys::Encoding::ToWide(keyname).c_str(), 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     KEY_READ|KEY_WRITE, &hkey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (ERROR_SUCCESS == result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Create the subkey and set the values of interest: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     HKEY hsubkey = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    char lpClass[] = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    result = RegCreateKeyEx(hkey, nextAvailableSubKeyName.c_str(), 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            lpClass, 0, KEY_READ|KEY_WRITE, 0, &hsubkey, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    wchar_t lpClass[] = L""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    result = RegCreateKeyExW(hkey, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      cmsys::Encoding::ToWide(nextAvailableSubKeyName).c_str(), 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      lpClass, 0, KEY_READ|KEY_WRITE, 0, &hsubkey, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (ERROR_SUCCESS == result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       DWORD dw = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       std::string s(macrosFile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       cmSystemTools::ReplaceString(s, "/", "\\"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      std::wstring ws = cmsys::Encoding::ToWide(s); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      result = RegSetValueEx(hsubkey, "Path", 0, REG_SZ, (LPBYTE) s.c_str(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        static_cast<DWORD>(strlen(s.c_str()) + 1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      result = RegSetValueExW(hsubkey, L"Path", 0, REG_SZ, (LPBYTE)ws.c_str(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static_cast<DWORD>(ws.size() + 1)*sizeof(wchar_t)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (ERROR_SUCCESS != result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         std::cout << "error result 1: " << result << std::endl; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -741,7 +747,7 @@ void WriteVSMacrosFileRegistryEntry( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // Security value is always "1" for sample macros files (seems to be "2" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // if you put the file somewhere outside the standard VSMacros folder) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       dw = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      result = RegSetValueEx(hsubkey, "Security", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      result = RegSetValueExW(hsubkey, L"Security", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                              0, REG_DWORD, (LPBYTE) &dw, sizeof(DWORD)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (ERROR_SUCCESS != result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -751,7 +757,7 @@ void WriteVSMacrosFileRegistryEntry( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // StorageFormat value is always "0" for sample macros files 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       dw = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      result = RegSetValueEx(hsubkey, "StorageFormat", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      result = RegSetValueExW(hsubkey, L"StorageFormat", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                              0, REG_DWORD, (LPBYTE) &dw, sizeof(DWORD)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (ERROR_SUCCESS != result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 |