17 # define WIN32_SKIP_HKEY_PROTECTION
36 if (dir[
a - 1] ==
'\\') {
45 static void register_blend_extension_failed(HKEY root,
const bool background)
52 MessageBox(0,
"Could not register file extension.",
"Blender error", MB_OK | MB_ICONERROR);
61 BOOL usr_mode =
false;
65 char BlPath[MAX_PATH];
68 const char *ThumbHandlerDLL;
69 char RegCmd[MAX_PATH * 2];
76 printf(
"Registering file extension...");
77 GetModuleFileName(0, BlPath, MAX_PATH);
80 blender_app = strstr(BlPath,
"blender.exe");
81 if (blender_app !=
NULL) {
82 strcpy(blender_app,
"blender-launcher.exe");
86 lresult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"Software\\Classes", 0, KEY_ALL_ACCESS, &root);
87 if (lresult != ERROR_SUCCESS) {
90 lresult = RegOpenKeyEx(HKEY_CURRENT_USER,
"Software\\Classes", 0, KEY_ALL_ACCESS, &root);
91 if (lresult != ERROR_SUCCESS) {
92 register_blend_extension_failed(0, background);
97 lresult = RegCreateKeyEx(
98 root,
"blendfile", 0,
NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
NULL, &hkey, &dwd);
99 if (lresult == ERROR_SUCCESS) {
100 strcpy(
buffer,
"Blender File");
101 lresult = RegSetValueEx(hkey,
NULL, 0, REG_SZ, (BYTE *)
buffer, strlen(
buffer) + 1);
104 if (lresult != ERROR_SUCCESS) {
105 register_blend_extension_failed(root, background);
109 lresult = RegCreateKeyEx(root,
110 "blendfile\\shell\\open\\command",
113 REG_OPTION_NON_VOLATILE,
118 if (lresult == ERROR_SUCCESS) {
119 sprintf(
buffer,
"\"%s\" \"%%1\"", BlPath);
120 lresult = RegSetValueEx(hkey,
NULL, 0, REG_SZ, (BYTE *)
buffer, strlen(
buffer) + 1);
123 if (lresult != ERROR_SUCCESS) {
124 register_blend_extension_failed(root, background);
128 lresult = RegCreateKeyEx(root,
129 "blendfile\\DefaultIcon",
132 REG_OPTION_NON_VOLATILE,
137 if (lresult == ERROR_SUCCESS) {
138 sprintf(
buffer,
"\"%s\", 1", BlPath);
139 lresult = RegSetValueEx(hkey,
NULL, 0, REG_SZ, (BYTE *)
buffer, strlen(
buffer) + 1);
142 if (lresult != ERROR_SUCCESS) {
143 register_blend_extension_failed(root, background);
147 lresult = RegCreateKeyEx(
148 root,
".blend", 0,
NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
NULL, &hkey, &dwd);
149 if (lresult == ERROR_SUCCESS) {
150 strcpy(
buffer,
"blendfile");
151 lresult = RegSetValueEx(hkey,
NULL, 0, REG_SZ, (BYTE *)
buffer, strlen(
buffer) + 1);
154 if (lresult != ERROR_SUCCESS) {
155 register_blend_extension_failed(root, background);
159 # ifdef WITH_BLENDER_THUMBNAILER
162 ThumbHandlerDLL =
"BlendThumb.dll";
164 RegCmd, MAX_PATH * 2,
"%s\\regsvr32 /s \"%s\\%s\"", SysDir, InstallDir, ThumbHandlerDLL);
169 printf(
"success (%s)\n", usr_mode ?
"user" :
"system");
172 "File extension registered for %s.",
173 usr_mode ?
"the current user. To register for all users, run as an administrator" :
175 MessageBox(0, MBox,
"Blender", MB_OK | MB_ICONINFORMATION);
182 char str[MAX_PATH + 1];
187 if (GetWindowsDirectory(
str, MAX_PATH + 1)) {
196 if (GetModuleFileName(
NULL,
str, MAX_PATH + 1)) {
198 "Error! Could not get the Windows Directory - "
199 "Defaulting to Blender installation Dir!\n");
211 "Error! Could not get the Windows Directory - "
212 "Defaulting to first valid drive! Path might be invalid!\n");
213 tmp = GetLogicalDrives();
214 for (i = 2; i < 26; i++) {
215 if ((tmp >> i) & 1) {
220 if (GetFileAttributes(root) != 0xFFFFFFFF) {
227 printf(
"ERROR in 'BLI_windows_get_default_root_dir': can't find a valid drive!\n");
void BLI_split_dir_part(const char *string, char *dir, size_t dirlen)
Compatibility-like things for windows.
void BLI_windows_get_default_root_dir(char root_dir[4])
int BLI_windows_get_executable_dir(char *str)
bool BLI_windows_register_blend_extension(bool background)
Read Guarded memory(de)allocation.
ccl_global float * buffer