Apply [#26044] Windows thumbnails and improved filetype registration
authorNathan Letwory <nathan@letworyinteractive.com>
Tue, 29 Mar 2011 13:00:03 +0000 (13:00 +0000)
committerNathan Letwory <nathan@letworyinteractive.com>
Tue, 29 Mar 2011 13:00:03 +0000 (13:00 +0000)
submitted by Tom Edwards
Fix [#25473] 64bit Windows installer for version 2.56 is not working
patch submitted by Caleb (Dobz)

The thumbnail patch adds a thumb handler DLL that adds .blend thumbnail support in Windows Explorer. A -r option is added to do registration in background. The patch also improves icon building and metadata for blender.exe.

Caleb fixes and cleans up our installer to an acceptable state. The patch uses the new -r option to do the .blend extension and thumbnailer registration.

Thanks to both Caleb and Tom for their efforts!

SConstruct
release/windows/installer/00.sconsblender.nsi
source/blender/blenlib/BLI_winstuff.h
source/blender/blenlib/intern/winstuff.c
source/creator/CMakeLists.txt
source/creator/creator.c
source/icons/SConscript
source/icons/blender.exe.manifest [new file with mode: 0644]
source/icons/linuxcrossblender.rcscons [deleted file]
source/icons/winblender.rc
source/icons/winblender.rcscons [deleted file]

index 583cc0b144be6d9a6ffafd6c5bd892a846732756..954422e0b3da7795d2bd35fa7da715a93172a403 100644 (file)
@@ -153,13 +153,11 @@ if cc:
 if cxx:
     env['CXX'] = cxx
 
-if env['CC'] in ['cl', 'cl.exe'] and sys.platform=='win32':
-    if bitness == 64:
-        platform = 'win64-vc'
-    else:
-        platform = 'win32-vc'
-elif env['CC'] in ['gcc'] and sys.platform=='win32':
-    platform = 'win32-mingw'
+if sys.platform=='win32':
+    if env['CC'] in ['cl', 'cl.exe']:
+         platform = 'win64-vc' if bitness == 64 else 'win32-vc'
+    elif env['CC'] in ['gcc']:
+        platform = 'win32-mingw'
 
 env.SConscriptChdir(0)
 
@@ -197,6 +195,10 @@ else:
 opts = btools.read_opts(env, optfiles, B.arguments)
 opts.Update(env)
 
+if sys.platform=='win32':
+    if bitness==64:
+        env.Append(CFLAGS=['-DWIN64']) # -DWIN32 needed too, as it's used all over to target Windows generally
+
 if not env['BF_FANCY']:
     B.bc.disable()
 
@@ -641,6 +643,16 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'):
                     '${BF_FFMPEG_LIBPATH}/avdevice-52.dll',
                     '${BF_FFMPEG_LIBPATH}/avutil-50.dll',
                     '${BF_FFMPEG_LIBPATH}/swscale-0.dll']
+
+    # Since the thumb handler is loaded by Explorer, architecture is
+    # strict: the x86 build fails on x64 Windows. We need to ship
+    # both builds in x86 packages.
+    if bitness == 32:
+        dllsources.append('${LCGDIR}/thumbhandler/lib/BlendThumb.dll') 
+    dllsources.append('${LCGDIR}/thumbhandler/lib/BlendThumb64.dll')
+
+    dllsources.append('#source/icons/blender.exe.manifest')
+
     windlls = env.Install(dir=env['BF_INSTALLDIR'], source = dllsources)
     allinstall += windlls
 
index e5ebf8b2f64d1a048023f0086d60e711d0f9a4ac..68d884beb68fa0af9eeee070e628978ec4aa80d2 100644 (file)
@@ -6,19 +6,20 @@
 ; Requires the MoreInfo plugin - http://nsis.sourceforge.net/MoreInfo_plug-in\r
 ;\r
 \r
+SetCompressor /SOLID lzma\r
+\r
+Name "Blender [VERSION]" \r
+\r
+!define MULTIUSER_EXECUTIONLEVEL Admin\r
+\r
 !include "MUI.nsh"\r
 !include "WinVer.nsh"\r
 !include "FileFunc.nsh"\r
 !include "WordFunc.nsh"\r
 !include "nsDialogs.nsh"\r
+!include "MultiUser.nsh"\r
 !include "x64.nsh"\r
 \r
-RequestExecutionLevel user\r
-\r
-SetCompressor /SOLID lzma\r
-\r
-Name "Blender [VERSION]" \r
-\r
 !define MUI_ABORTWARNING\r
 \r
 !define MUI_WELCOMEPAGE_TEXT  "This wizard will guide you through the installation of Blender. It is recommended that you close all other applications before starting Setup."\r
@@ -60,21 +61,17 @@ UninstallIcon "[RELDIR]\00.installer.ico"
 ;Language Strings\r
 \r
   ;Description\r
-  LangString DESC_SecCopyUI ${LANG_ENGLISH} "Copy all required files to the application folder."\r
-  LangString DESC_Section2 ${LANG_ENGLISH} "Add shortcut items to the Start Menu. (Recommended)"\r
-  LangString DESC_Section3 ${LANG_ENGLISH} "Add a shortcut to Blender on your desktop."\r
-  LangString DESC_Section4 ${LANG_ENGLISH} "Blender can register itself with .blend files to allow double-clicking from Windows Explorer, etc."\r
+  LangString DESC_InstallFiles ${LANG_ENGLISH} "Copy all required files to the application folder."\r
+  LangString DESC_StartMenu ${LANG_ENGLISH} "Add shortcut items to the Start Menu. (Recommended)"\r
+  LangString DESC_DesktopShortcut ${LANG_ENGLISH} "Add a shortcut to Blender on your desktop."\r
+  LangString DESC_BlendRegister ${LANG_ENGLISH} "Blender can register itself with .blend files to allow double-clicking from Windows Explorer, etc."\r
   LangString TEXT_IO_TITLE ${LANG_ENGLISH} "Specify User Data Location"\r
 ;--------------------------------\r
 ;Data\r
 \r
 Caption "Blender [VERSION] Installer"\r
 OutFile "[DISTDIR]\..\blender-[VERSION]-windows[BITNESS].exe"\r
-;InstallDir "$PROGRAMFILES[BITNESS]\Blender Foundation\Blender"\r
-; Install to user profile dir. While it is non-standard, it allows\r
-; users to install without having to have the installer run in elevated mode.\r
-InstallDir "$PROFILE\Blender Foundation\Blender"\r
-\r
+InstallDir $INSTDIR ; $INSTDIR is set inside .onInit\r
 BrandingText "Blender Foundation | http://www.blender.org"\r
 ComponentText "This will install Blender [VERSION] on your computer."\r
 \r
@@ -85,7 +82,7 @@ SilentUnInstall normal
 Var BLENDERHOME\r
 Var SHORTVERSION ; This is blender_version_decimal() from path_util.c\r
 \r
-; custom controls\r
+; Custom controls\r
 Var HWND\r
 \r
 Var HWND_APPDATA\r
@@ -94,7 +91,23 @@ Var HWND_HOMEDIR
 \r
 Function .onInit\r
   ClearErrors\r
+  !insertmacro MULTIUSER_INIT ; Checks if user has admin rights\r
   StrCpy $SHORTVERSION "[SHORTVERSION]"\r
+\r
+  ${If} ${RunningX64}\r
+    ${If} "[BITNESS]" == "32"\r
+    ${OrIf} "[BITNESS]" == "-mingw"\r
+      StrCpy $INSTDIR "$PROGRAMFILES32\Blender Foundation\Blender" ; Can't use InstallDir inside Section\r
+    ${ElseIf} "[BITNESS]" == "64"\r
+      StrCpy $INSTDIR "$PROGRAMFILES64\Blender Foundation\Blender"\r
+    ${EndIf}\r
+  ${Else}\r
+    StrCpy $INSTDIR "$PROGRAMFILES\Blender Foundation\Blender"\r
+  ${EndIf}\r
+FunctionEnd\r
+\r
+Function un.onInit\r
+  !insertmacro MULTIUSER_UNINIT\r
 FunctionEnd\r
 \r
 Function DataLocation\r
@@ -105,12 +118,12 @@ Function DataLocation
     Abort\r
   ${EndIf}\r
   \r
-  ${NSD_CreateLabel} 0 0 100% 12u "Please specify where you wish to install Blender's user data files."\r
-  ${NSD_CreateRadioButton} 0 20 100% 12u "Use the Application Data directory"\r
+  ${NSD_CreateLabel} 0 0 100% 24u "Please specify where you wish to install Blender's user data files. Be aware that if you choose to use your Application Data directory, your preferences and scripts will only be accessible by the current user account."\r
+  ${NSD_CreateRadioButton} 0 50 100% 12u "Use Application Data directory (recommended)"\r
   Pop $HWND_APPDATA\r
-  ${NSD_CreateRadioButton} 0 50 100% 12u "Use the installation directory (ie. location chosen to install blender.exe)."\r
+  ${NSD_CreateRadioButton} 0 80 100% 12u "Use installation directory"\r
   Pop $HWND_INSTDIR\r
-  ${NSD_CreateRadioButton} 0 80 100% 12u "I have defined a %HOME% variable, please install files here."\r
+  ${NSD_CreateRadioButton} 0 110 100% 12u "I have defined a %HOME% variable, please install files there"\r
   Pop $HWND_HOMEDIR\r
   \r
   ${If} ${AtMostWinME}\r
@@ -128,7 +141,9 @@ FunctionEnd
 Function DataLocationOnLeave\r
   ${NSD_GetState} $HWND_APPDATA $R0\r
   ${If} $R0 == "1"\r
+    SetShellVarContext current\r
     StrCpy $BLENDERHOME "$APPDATA\Blender Foundation\Blender"\r
+    SetShellVarContext all\r
   ${Else}\r
     ${NSD_GetState} $HWND_INSTDIR $R0\r
     ${If} $R0 == "1"\r
@@ -142,15 +157,15 @@ Function DataLocationOnLeave
   ${EndIf}\r
 FunctionEnd\r
 \r
-Section "Blender-[VERSION] (required)" SecCopyUI\r
+Section "Blender [VERSION] (required)" InstallFiles\r
   SectionIn RO\r
 \r
   ; Set output path to the installation directory.\r
   SetOutPath $INSTDIR\r
-  ; the contents of Blender installation root dir\r
+  ; The contents of Blender installation root dir\r
   [ROOTDIRCONTS]\r
   \r
-  ; all datafiles (python, scripts, config)\r
+  ; All datafiles (python, scripts, config)\r
   [DODATAFILES]\r
   \r
   SetOutPath $INSTDIR\r
@@ -162,13 +177,19 @@ Section "Blender-[VERSION] (required)" SecCopyUI
   WriteRegStr HKLM "SOFTWARE\BlenderFoundation" "ConfigData_Dir" "$BLENDERHOME"\r
   WriteRegStr HKLM "SOFTWARE\BlenderFoundation" "ShortVersion" "[SHORTVERSION]"\r
   ; Write the uninstall keys for Windows\r
-  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "DisplayName" "Blender (remove only)"\r
-  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "UninstallString" '"$INSTDIR\uninstall.exe"'\r
+  WriteRegStr   HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "DisplayName" "Blender"\r
+  WriteRegStr   HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "Publisher" "Blender Foundation"\r
+  WriteRegStr   HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "URLInfoAbout" "http://www.blender.org/"\r
+  WriteRegStr   HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "DisplayVersion" "[VERSION]"\r
+  WriteRegStr   HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "DisplayIcon" "$INSTDIR\blender.exe"\r
+  WriteRegStr   HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "UninstallString" '"$INSTDIR\uninstall.exe"'\r
+  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "NoModify" 1\r
+  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "NoRepair " 1\r
   WriteUninstaller "uninstall.exe"\r
 \r
 SectionEnd\r
 \r
-Section "Add Start Menu shortcuts" Section2\r
+Section "Add Start Menu Shortcuts" StartMenu\r
   SetShellVarContext all\r
   CreateDirectory "$SMPROGRAMS\Blender Foundation\Blender\"\r
   CreateShortCut "$SMPROGRAMS\Blender Foundation\Blender\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0\r
@@ -176,45 +197,38 @@ Section "Add Start Menu shortcuts" Section2
   CreateShortCut "$SMPROGRAMS\Blender Foundation\Blender\Readme.lnk" "$INSTDIR\readme.html" "" "" 0\r
   CreateShortCut "$SMPROGRAMS\Blender Foundation\Blender\Copyright.lnk" "$INSTDIR\Copyright.txt" "" "$INSTDIR\copyright.txt" 0\r
   CreateShortCut "$SMPROGRAMS\Blender Foundation\Blender\GPL-license.lnk" "$INSTDIR\GPL-license.txt" "" "$INSTDIR\GPL-license.txt" 0\r
+  System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' ; refresh icons\r
 SectionEnd\r
 \r
-Section "Add Desktop Blender-[VERSION] shortcut" Section3\r
+Section "Add Desktop Shortcut" DesktopShortcut\r
   CreateShortCut "$DESKTOP\Blender.lnk" "$INSTDIR\blender.exe" "" "$INSTDIR\blender.exe" 0\r
+  System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' ; refresh icons\r
 SectionEnd\r
 \r
-Section "Open .blend files with Blender-[VERSION]" Section4\r
-  \r
-  ${If} ${RunningX64}\r
-    SetRegView 64\r
-  ${EndIf}\r
-  WriteRegStr HKCR ".blend" "" "blendfile"\r
-  WriteRegStr HKCR "blendfile" "" "Blender .blend File"\r
-  WriteRegStr HKCR "blendfile\shell" "" "open"\r
-  WriteRegStr HKCR "blendfile\DefaultIcon" "" $INSTDIR\blender.exe,1\r
-  WriteRegStr HKCR "blendfile\shell\open\command" "" \\r
-    '"$INSTDIR\blender.exe" "%1"'\r
-  \r
+Section "Open .blend files with Blender" BlendRegister\r
+ExecWait '"$INSTDIR\blender.exe" -r'\r
 SectionEnd\r
 \r
-UninstallText "This will uninstall Blender [VERSION], and all installed files. Before continuing make sure you have created backup of all the files you may want to keep: startup.blend, bookmarks.txt, recent-files.txt. Hit next to continue."\r
+UninstallText "This will uninstall Blender [VERSION], and all installed files. Before continuing make sure you have created backup of all the files you may want to keep: startup.blend, bookmarks.txt, recent-files.txt. Hit 'Uninstall' to continue."\r
 \r
 Section "Uninstall"\r
-  ; remove registry keys\r
+  ; Remove registry keys\r
   ${If} ${RunningX64}\r
     SetRegView 64\r
   ${EndIf}\r
+  \r
   ReadRegStr $BLENDERHOME HKLM "SOFTWARE\BlenderFoundation" "ConfigData_Dir"\r
   ReadRegStr $SHORTVERSION HKLM "SOFTWARE\BlenderFoundation" "ShortVersion"\r
-  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender"\r
+  DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Blender"\r
   DeleteRegKey HKLM "SOFTWARE\BlenderFoundation"\r
+  DeleteRegKey HKCR ".blend"\r
+  DeleteRegKey HKCR "blendfile"\r
+  DeleteRegKey HKCR "CLSID\{D45F043D-F17F-4e8a-8435-70971D9FA46D}"\r
   SetShellVarContext all\r
  \r
-  ; remove files\r
+  ; Remove files\r
   [DELROOTDIRCONTS]\r
 \r
-  ; remove bundled python\r
-  RmDir /r $INSTDIR\$SHORTVERSION\python\r
-\r
   Delete "$INSTDIR\uninstall.exe"\r
 \r
   MessageBox MB_YESNO "Recursively erase contents of $BLENDERHOME\$SHORTVERSION\scripts? NOTE: This includes all installed scripts and *any* file and directory you have manually created, installed later or copied. This also including .blend files." IDNO NextNoScriptRemove\r
@@ -226,26 +240,27 @@ NextNoConfigRemove:
   MessageBox MB_YESNO "Recursively erase contents from $BLENDERHOME\$SHORTVERSION\plugins? NOTE: This includes files and subdirectories in this directory" IDNO NextNoPluginRemove\r
   RMDir /r "$BLENDERHOME\$SHORTVERSION\plugins"\r
 NextNoPluginRemove:\r
-  ; try to remove dirs, but leave them if they contain anything\r
+  ; Try to remove dirs, but leave them if they contain anything\r
   RMDir "$BLENDERHOME\$SHORTVERSION\plugins"\r
   RMDir "$BLENDERHOME\$SHORTVERSION\config"\r
   RMDir "$BLENDERHOME\$SHORTVERSION\scripts"\r
   RMDir "$BLENDERHOME\$SHORTVERSION"\r
   RMDir "$BLENDERHOME"\r
-  ; remove shortcuts\r
+  ; Remove shortcuts\r
   Delete "$SMPROGRAMS\Blender Foundation\Blender\*.*"\r
   Delete "$DESKTOP\Blender.lnk"\r
-  ; remove all link related directories and files\r
-  RMDir "$SMPROGRAMS\Blender Foundation\Blender"\r
-  RMDir "$SMPROGRAMS\Blender Foundation"\r
+  ; Remove all link related directories and files\r
+  RMDir /r "$SMPROGRAMS\Blender Foundation"\r
   ; Clear out installation dir\r
-  RMDir "$INSTDIR"\r
+  RMDir /r "$INSTDIR"\r
+  \r
+  System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' ; Refresh icons\r
 SectionEnd\r
 \r
 !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN\r
-  !insertmacro MUI_DESCRIPTION_TEXT ${SecCopyUI} $(DESC_SecCopyUI)\r
-  !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(DESC_Section2)\r
-  !insertmacro MUI_DESCRIPTION_TEXT ${Section3} $(DESC_Section3)\r
-  !insertmacro MUI_DESCRIPTION_TEXT ${Section4} $(DESC_Section4)\r
+  !insertmacro MUI_DESCRIPTION_TEXT ${InstallFiles} $(DESC_InstallFiles)\r
+  !insertmacro MUI_DESCRIPTION_TEXT ${StartMenu} $(DESC_StartMenu)\r
+  !insertmacro MUI_DESCRIPTION_TEXT ${DesktopShortcut} $(DESC_DesktopShortcut)\r
+  !insertmacro MUI_DESCRIPTION_TEXT ${BlendRegister} $(DESC_BlendRegister)\r
 !insertmacro MUI_FUNCTION_DESCRIPTION_END\r
 \r
index 957e5fd0b78684dd635d51bf616f66a1810d38c5..d0eb3c7d67d3d6a4713cf87c146cc9ac80ab4ec4 100644 (file)
@@ -127,7 +127,7 @@ typedef struct _DIR {
        struct dirent direntry;
 } DIR;
 
-void RegisterBlendExtension(char * str);
+void RegisterBlendExtension(void);
 DIR *opendir (const char *path);
 struct dirent *readdir(DIR *dp);
 int closedir (DIR *dp);
index a6dae7958cc5c3b4553016dd4a4daba585a26ff7..2f750545223aee7957c0065cc1bf5d2ef8d819da 100644 (file)
@@ -43,6 +43,7 @@
 #include "BLI_string.h"
 
 #include "BKE_utildefines.h"
+#include "BKE_global.h"
 
 #define WIN32_SKIP_HKEY_PROTECTION             // need to use HKEY
 #include "BLI_winstuff.h"
@@ -64,39 +65,108 @@ int BLI_getInstallationDir( char * str ) {
        return 1;
 }
 
+void RegisterBlendExtension_Fail(HKEY root)
+{
+       printf("failed\n");
+       if (root)
+               RegCloseKey(root);
+       if (!G.background)
+               MessageBox(0,"Could not register file extension.","Blender error",MB_OK|MB_ICONERROR);
+       TerminateProcess(GetCurrentProcess(),1);
+}
 
-void RegisterBlendExtension(char * str) {
+void RegisterBlendExtension(void) {
        LONG lresult;
        HKEY hkey = 0;
+       HKEY root = 0;
+       BOOL usr_mode = FALSE;
        DWORD dwd = 0;
-       char buffer[128];
-       
-       lresult = RegCreateKeyEx(HKEY_CLASSES_ROOT, "blendfile\\shell\\open\\command", 0,
-               "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
+       char buffer[256];
+
+       char BlPath[MAX_PATH];
+       char InstallDir[FILE_MAXDIR];
+       char SysDir[FILE_MAXDIR];
+       char* ThumbHandlerDLL;
+       char RegCmd[MAX_PATH*2];
+       char MBox[256];
+       BOOL IsWOW64;
 
+       printf("Registering file extension...");
+       GetModuleFileName(0,BlPath,MAX_PATH);
+
+       // root is HKLM by default
+       lresult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Classes", 0, KEY_ALL_ACCESS, &root);
+       if (lresult != ERROR_SUCCESS)
+       {
+               // try HKCU on failure
+               usr_mode = TRUE;
+               lresult = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Classes", 0, KEY_ALL_ACCESS, &root);
+               if (lresult != ERROR_SUCCESS)
+                       RegisterBlendExtension_Fail(0);
+       }
+
+       lresult = RegCreateKeyEx(root, "blendfile", 0,
+               NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
        if (lresult == ERROR_SUCCESS) {
-               sprintf(buffer, "\"%s\" \"%%1\"", str);
-               lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, buffer, strlen(buffer) + 1);
+               sprintf(buffer,"%s","Blender File");
+               lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, (BYTE*)buffer, strlen(buffer) + 1);
                RegCloseKey(hkey);
        }
+       if (lresult != ERROR_SUCCESS)
+               RegisterBlendExtension_Fail(root);
 
-       lresult = RegCreateKeyEx(HKEY_CLASSES_ROOT, "blendfile\\DefaultIcon", 0,
-               "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
-
+       lresult = RegCreateKeyEx(root, "blendfile\\shell\\open\\command", 0,
+               NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
        if (lresult == ERROR_SUCCESS) {
-               sprintf(buffer, "\"%s\",1", str);
-               lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, buffer, strlen(buffer) + 1);
+               sprintf(buffer, "\"%s\" \"%%1\"", BlPath);
+               lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, (BYTE*)buffer, strlen(buffer) + 1);
                RegCloseKey(hkey);
        }
+       if (lresult != ERROR_SUCCESS)
+               RegisterBlendExtension_Fail(root);
 
-       lresult = RegCreateKeyEx(HKEY_CLASSES_ROOT, ".blend", 0,
-               "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
+       lresult = RegCreateKeyEx(root, "blendfile\\DefaultIcon", 0,
+               NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
+       if (lresult == ERROR_SUCCESS) {
+               sprintf(buffer, "\"%s\",1", BlPath);
+               lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, (BYTE*)buffer, strlen(buffer) + 1);
+               RegCloseKey(hkey);
+       }
+       if (lresult != ERROR_SUCCESS)
+               RegisterBlendExtension_Fail(root);
 
+       lresult = RegCreateKeyEx(root, ".blend", 0,
+               NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
        if (lresult == ERROR_SUCCESS) {
                sprintf(buffer, "%s", "blendfile");
-               lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, buffer, strlen(buffer) + 1);
+               lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, (BYTE*)buffer, strlen(buffer) + 1);
                RegCloseKey(hkey);
        }
+       if (lresult != ERROR_SUCCESS)
+               RegisterBlendExtension_Fail(root);
+       
+       BLI_getInstallationDir(InstallDir);
+       GetSystemDirectory(SysDir,FILE_MAXDIR);
+#ifdef WIN64
+       ThumbHandlerDLL = "BlendThumb64.dll";
+#else
+       IsWow64Process(GetCurrentProcess(),&IsWOW64);
+       if (IsWOW64 == TRUE)
+               ThumbHandlerDLL = "BlendThumb64.dll";
+       else
+               ThumbHandlerDLL = "BlendThumb.dll";
+#endif 
+       snprintf(RegCmd,MAX_PATH*2,"%s\\regsvr32 /s \"%s\\%s\"",SysDir,InstallDir,ThumbHandlerDLL);
+       system(RegCmd);
+
+       RegCloseKey(root);
+       printf("success (%s)\n",usr_mode ? "user" : "system");
+       if (!G.background)
+       {
+               sprintf(MBox,"File extension registered for %s.",usr_mode ? "the current user. To register for all users, run as an administrator" : "all users");
+               MessageBox(0,MBox,"Blender",MB_OK|MB_ICONINFORMATION);
+       }
+       TerminateProcess(GetCurrentProcess(),0);
 }
 
 DIR *opendir (const char *path) {
index 99c7dba930511f676b569538e1ddca6d0f899cbb..b25cac7bf78cf8782e151fca3e5c845a1c905213 100644 (file)
@@ -101,6 +101,17 @@ set(SRC
 )
 
 if(WIN32 AND NOT UNIX)
+       string(SUBSTRING ${BLENDER_VERSION} 0 1 bver1)
+       string(SUBSTRING ${BLENDER_VERSION} 2 1 bver2)
+       string(SUBSTRING ${BLENDER_VERSION} 3 1 bver3)
+       add_definitions(
+               -DBLEN_VER_RC_STR="${BLENDER_VERSION}"
+               -DBLEN_VER_RC_1=${bver1}
+               -DBLEN_VER_RC_2=${bver2}
+               -DBLEN_VER_RC_3=${bver3}
+               -DBLEN_VER_RC_4=0
+       )
+
        list(APPEND SRC
                ../icons/winblender.rc
        )
@@ -536,6 +547,19 @@ elseif(WIN32)
                        )
                endif()
        endif()
+       
+       add_custom_command(TARGET blender
+               POST_BUILD
+               MAIN_DEPENDENCY blender
+               COMMAND copy /Y \"${LIBDIR}\\thumbhandler\\lib\\BlendThumb64.dll\" \"${TARGETDIR}\\\"
+       )
+       if(NOT CMAKE_CL_64)
+               add_custom_command(TARGET blender
+                       POST_BUILD
+                       MAIN_DEPENDENCY blender
+                       COMMAND copy /Y \"${LIBDIR}\\thumbhandler\\lib\\BlendThumb.dll\" \"${TARGETDIR}\\\"
+               )
+       endif()
 
 elseif(APPLE)
        set(SOURCEDIR ${CMAKE_SOURCE_DIR}/source/darwin/blender.app)
index 2480f8b544b7da416547d07678769bb26b1f81c1..1db143cdd2056604eb69dfac3202beb004b420e5 100644 (file)
@@ -287,6 +287,7 @@ static int print_help(int UNUSED(argc), const char **UNUSED(argv), void *data)
 
 #ifdef WIN32
        BLI_argsPrintArgDoc(ba, "-R");
+       BLI_argsPrintArgDoc(ba, "-r");
 #endif
        BLI_argsPrintArgDoc(ba, "--version");
 
@@ -486,12 +487,12 @@ static int without_borders(int UNUSED(argc), const char **UNUSED(argv), void *UN
 static int register_extension(int UNUSED(argc), const char **UNUSED(argv), void *data)
 {
 #ifdef WIN32
-       char *path = BLI_argsArgv(data)[0];
-       RegisterBlendExtension(path);
+       if (data)
+               G.background = 1;
+       RegisterBlendExtension();
 #else
        (void)data; /* unused */
 #endif
-
        return 0;
 }
 
@@ -1094,7 +1095,8 @@ static void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
        BLI_argsAdd(ba, 2, "-p", "--window-geometry", "<sx> <sy> <w> <h>\n\tOpen with lower left corner at <sx>, <sy> and width and height as <w>, <h>", prefsize, NULL);
        BLI_argsAdd(ba, 2, "-w", "--window-border", "\n\tForce opening with borders (default)", with_borders, NULL);
        BLI_argsAdd(ba, 2, "-W", "--window-borderless", "\n\tForce opening without borders", without_borders, NULL);
-       BLI_argsAdd(ba, 2, "-R", NULL, "\n\tRegister .blend extension (windows only)", register_extension, ba);
+       BLI_argsAdd(ba, 2, "-R", NULL, "\n\tRegister .blend extension, then exit (Windows only)", register_extension, NULL);
+       BLI_argsAdd(ba, 2, "-r", NULL, "\n\tSilently register .blend extension, then exit (Windows only)", register_extension, ba);
 
        /* third pass: disabling things and forcing settings */
        BLI_argsAddCase(ba, 3, "-nojoystick", 1, NULL, 0, "\n\tDisable joystick support", no_joystick, syshandle);
index ca6308781e99cff33ccad100b3cb243020c4ba58..4bb27a7d4fb87e9924af36ea44c7984f6e81e2e8 100644 (file)
@@ -1,9 +1,12 @@
 #!/usr/bin/python
 Import ('env')
+import btools
 
-if env['OURPLATFORM'] == 'linuxcross':
-    source = 'linuxcrossblender.rcscons'
-else:
-    source = 'winblender.rcscons'
+env['RCFLAGS'].append("-DWINDRES")
+env['RCFLAGS'].append("-DBLEN_VER_RC_STR_M=" + btools.VERSION)
+env['RCFLAGS'].append("-DBLEN_VER_RC_1=" + btools.VERSION[0])
+env['RCFLAGS'].append("-DBLEN_VER_RC_2=" + btools.VERSION[2])
+env['RCFLAGS'].append("-DBLEN_VER_RC_3=" + btools.VERSION[3])
+env['RCFLAGS'].append("-DBLEN_VER_RC_4=0")
 
-env.BlenderRes('winresource', source, ['core'], priority=[95])
+env.BlenderRes('winresource', 'winblender.rc', ['core'], priority=[95])
diff --git a/source/icons/blender.exe.manifest b/source/icons/blender.exe.manifest
new file mode 100644 (file)
index 0000000..bc13bf4
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\r
+  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">\r
+    <security>\r
+      <requestedPrivileges>\r
+        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>\r
+      </requestedPrivileges>\r
+    </security>\r
+  </trustInfo>\r
+</assembly>\r
diff --git a/source/icons/linuxcrossblender.rcscons b/source/icons/linuxcrossblender.rcscons
deleted file mode 100644 (file)
index cf3083a..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-APPICON         ICON     "source/icons/winblender.ico"\r
-BLENDERFILE     ICON     "source/icons/winblenderfile.ico"\r
index 77e62111d2dac2acb25c3d3f624e99d9e23466b8..244c2cb2e2cdb40306585fff908ec904b1aec275 100644 (file)
@@ -1,2 +1,40 @@
-APPICON                ICON     "winblender.ico"
-BLENDERFILE    ICON     "winblenderfile.ico"
+#define BLENDERFILE 1
+#define IDR_VERSION1 1
+
+#ifdef WINDRES
+       #include "winresrc.h"
+       #define IDC_STATIC (-1)
+       #define STRINGIFY_(x) #x
+       #define STRINGIFY(x) STRINGIFY_(x)
+       #define BLEN_VER_RC_STR STRINGIFY(BLEN_VER_RC_STR_M)
+       1 RT_MANIFEST "blender.exe.manifest"
+#endif
+
+APPICON ICON DISCARDABLE "winblender.ico"
+BLENDERFILE ICON DISCARDABLE "winblenderfile.ico"
+
+IDR_VERSION1 VERSIONINFO
+FILEVERSION BLEN_VER_RC_1, BLEN_VER_RC_2, BLEN_VER_RC_3, BLEN_VER_RC_4
+PRODUCTVERSION BLEN_VER_RC_1, BLEN_VER_RC_2, BLEN_VER_RC_3, BLEN_VER_RC_4
+FILEOS 0x00000004
+FILETYPE 0x00000001
+BEGIN
+  BLOCK "StringFileInfo"
+  BEGIN
+    BLOCK "04090000"
+    BEGIN
+      VALUE "FileVersion", BLEN_VER_RC_STR
+      VALUE "ProductVersion", BLEN_VER_RC_STR
+      VALUE "CompanyName", "Blender Foundation"
+      VALUE "FileDescription", "Blender"
+      VALUE "LegalCopyright", "GPLv2 (Blender Foundation)"
+      VALUE "OriginalFilename", "blender.exe"
+      VALUE "ProductName", "Blender"
+    END
+  END
+  BLOCK "VarFileInfo"
+  BEGIN
+    VALUE "Translation", 0x0409, 0x0000
+  END
+END
+
diff --git a/source/icons/winblender.rcscons b/source/icons/winblender.rcscons
deleted file mode 100644 (file)
index 97579f1..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-APPICON                ICON     "source\\icons\\winblender.ico"
-BLENDERFILE    ICON     "source\\icons\\winblenderfile.ico"