Index: src/ch/ch.cpp
===================================================================
diff -u -N -r09cedb80782a75d4b4896a1f3d2dd535688bf840 -rb556d023b748dfea230575959b6513acf29fd7b3
--- src/ch/ch.cpp	(.../ch.cpp)	(revision 09cedb80782a75d4b4896a1f3d2dd535688bf840)
+++ src/ch/ch.cpp	(.../ch.cpp)	(revision b556d023b748dfea230575959b6513acf29fd7b3)
@@ -635,69 +635,57 @@
 
 void CCopyHandlerApp::RegisterShellExtension() 
 {
-	CString strPath = CString(m_pathProcessor.GetProgramPath()) + _T("\\");
-
-#ifdef _WIN64
-	strPath += _T("chext64.dll");
-#else
-	strPath += _T("chext.dll");
-#endif
-
 	long lExtensionVersion = 0;
 	CString strExtensionVersion;
 
-	HRESULT hResult = m_tShellExtClient.RegisterShellExtDll(strPath, PRODUCT_VERSION1 << 24 | PRODUCT_VERSION2 << 16 | PRODUCT_VERSION3 << 8 | PRODUCT_VERSION4,
+	ERegistrationResult eResult = m_tShellExtClient.RegisterShellExtDll(PRODUCT_VERSION1 << 24 | PRODUCT_VERSION2 << 16 | PRODUCT_VERSION3 << 8 | PRODUCT_VERSION4,
 															lExtensionVersion, strExtensionVersion);
-	if(FAILED(hResult))
-	{
-		// normal failure
-		chcore::TString strError = chcore::TWin32ErrorFormatter::FormatWin32ErrorCode(hResult, true);
 
-		ictranslate::CFormat fmt(GetResManager().LoadString(IDS_REGISTERERR_STRING));
-		fmt.SetParam(_T("%errno"), (unsigned long)hResult);
-		fmt.SetParam(_T("%errdesc"), strError.c_str());
-		AfxMessageBox(fmt, MB_ICONERROR | MB_OK);
-	}
-	else if(hResult == S_FALSE)
+	switch(eResult)
 	{
-		// registered ok, but incompatible versions - probably restart required
-		CString strMsg;
-		strMsg.Format(_T("Registration succeeded, but still the shell extension has different version (0x%lx) than Copy Handler (0x%lx)."), (unsigned long)lExtensionVersion, (unsigned long)(PRODUCT_VERSION1 << 24 | PRODUCT_VERSION2 << 16 | PRODUCT_VERSION3 << 8 | PRODUCT_VERSION4));
-		LOG_WARNING(m_spLog) << strMsg;
+	case eFailure:
+		MsgBox(IDS_REGISTERERR_STRING, MB_ICONERROR | MB_OK);
+		break;
 
-		MsgBox(IDS_SHELL_EXTENSION_REGISTERED_MISMATCH_STRING, MB_ICONWARNING | MB_OK);
-	}
-	else if(hResult == S_OK)
+	case eSuccessNative:
+		MsgBox(IDS_REGISTERED_ONLYNATIVE, MB_ICONWARNING | MB_OK);
+		break;
+
+	case eSuccess32Bit:
+		MsgBox(IDS_REGISTERED_ONLY32BIT, MB_ICONWARNING | MB_OK);
+		break;
+
+	case eSuccessNeedRestart:
+		{
+			// registered ok, but incompatible versions - probably restart required
+			CString strMsg;
+			strMsg.Format(_T("Registration succeeded, but still the shell extension has different version (0x%lx) than Copy Handler (0x%lx)."), (unsigned long)lExtensionVersion, (unsigned long)(PRODUCT_VERSION1 << 24 | PRODUCT_VERSION2 << 16 | PRODUCT_VERSION3 << 8 | PRODUCT_VERSION4));
+			LOG_WARNING(m_spLog) << strMsg;
+
+			MsgBox(IDS_SHELL_EXTENSION_REGISTERED_MISMATCH_STRING, MB_ICONWARNING | MB_OK);
+		}
+
+	case eSuccess:
 		MsgBox(IDS_REGISTEROK_STRING, MB_ICONINFORMATION | MB_OK);
+		break;
+	}
 }
 
 void CCopyHandlerApp::UnregisterShellExtension() 
 {
-	CString strPath = CString(m_pathProcessor.GetProgramPath()) + _T("\\");
-
-#ifdef _WIN64
-	strPath += _T("chext64.dll");
-#else
-	strPath += _T("chext.dll");
-#endif
-
-	HRESULT hResult = m_tShellExtClient.UnRegisterShellExtDll(strPath);
-	if(hResult == TYPE_E_REGISTRYACCESS)
+	ERegistrationResult eResult = m_tShellExtClient.UnRegisterShellExtDll();
+	switch(eResult)
 	{
-		MsgBox(IDS_CHEXT_ALREADY_UNREGISTERED, MB_ICONINFORMATION | MB_OK);
-	}
-	else if(FAILED(hResult))
-	{
-		chcore::TString strError = chcore::TWin32ErrorFormatter::FormatWin32ErrorCode(hResult, true);
+	case eSuccess:
+	case eSuccessNative:
+	case eSuccess32Bit:
+		MsgBox(IDS_UNREGISTEROK_STRING, MB_ICONINFORMATION | MB_OK);
+		break;
 
-		ictranslate::CFormat fmt(GetResManager().LoadString(IDS_UNREGISTERERR_STRING));
-		fmt.SetParam(_T("%errno"), (unsigned long)hResult);
-		fmt.SetParam(_T("%errdesc"), strError.c_str());
-
-		AfxMessageBox(fmt, MB_ICONERROR | MB_OK);
+	case eFailure:
+		MsgBox(IDS_UNREGISTERERR_STRING, MB_ICONERROR | MB_OK);
+		break;
 	}
-	else if(hResult == S_OK)
-		MsgBox(IDS_UNREGISTEROK_STRING, MB_ICONINFORMATION | MB_OK);
 }
 
 void CCopyHandlerApp::OnConfigNotify(const chcore::TStringSet& setPropNames)