Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
2afe205e
Commit
2afe205e
authored
Jan 19, 2011
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
shell32: Convert dll registration to the IRegistrar mechanism.
parent
6dcf94b2
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
287 additions
and
882 deletions
+287
-882
Makefile.in
dlls/shell32/Makefile.in
+2
-1
regsvr.c
dlls/shell32/regsvr.c
+0
-881
shell32.rc
dlls/shell32/shell32.rc
+3
-0
shell32.rgs
dlls/shell32/shell32.rgs
+51
-0
shell32_classes.idl
dlls/shell32/shell32_classes.idl
+137
-0
shell32_main.c
dlls/shell32/shell32_main.c
+21
-0
shellpath.c
dlls/shell32/shellpath.c
+73
-0
No files found.
dlls/shell32/Makefile.in
View file @
2afe205e
...
...
@@ -25,7 +25,6 @@ C_SRCS = \
iconcache.c
\
pidl.c
\
recyclebin.c
\
regsvr.c
\
shell32_main.c
\
shelldispatch.c
\
shellitem.c
\
...
...
@@ -91,6 +90,8 @@ PO_SRCS = shell32.rc
IDL_TLB_SRCS
=
shell32_tlb.idl
IDL_R_SRCS
=
shell32_classes.idl
SVG_SRCS
=
\
cdrom.svg
\
control.svg
\
...
...
dlls/shell32/regsvr.c
deleted
100644 → 0
View file @
6dcf94b2
/*
* self-registerable dll functions for shell32.dll
*
* Copyright (C) 2003 John K. Hohm
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
#define COBJMACROS
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "winreg.h"
#include "winerror.h"
#include "ole2.h"
#include "shldisp.h"
#include "shlguid.h"
#include "shell32_main.h"
#include "shresdef.h"
#include "initguid.h"
#include "shfldr.h"
#include "wine/debug.h"
#include "wine/unicode.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
shell
);
/*
* Near the bottom of this file are the exported DllRegisterServer and
* DllUnregisterServer, which make all this worthwhile.
*/
/***********************************************************************
* interface for self-registering
*/
struct
regsvr_interface
{
IID
const
*
iid
;
/* NULL for end of list */
LPCSTR
name
;
/* can be NULL to omit */
IID
const
*
base_iid
;
/* can be NULL to omit */
int
num_methods
;
/* can be <0 to omit */
CLSID
const
*
ps_clsid
;
/* can be NULL to omit */
CLSID
const
*
ps_clsid32
;
/* can be NULL to omit */
};
static
HRESULT
register_interfaces
(
struct
regsvr_interface
const
*
list
);
static
HRESULT
unregister_interfaces
(
struct
regsvr_interface
const
*
list
);
struct
regsvr_coclass
{
CLSID
const
*
clsid
;
/* NULL for end of list */
LPCSTR
name
;
/* can be NULL to omit */
UINT
idName
;
/* can be 0 to omit */
LPCSTR
ips
;
/* can be NULL to omit */
LPCSTR
ips32
;
/* can be NULL to omit */
LPCSTR
ips32_tmodel
;
/* can be NULL to omit */
DWORD
flags
;
DWORD
dwAttributes
;
DWORD
dwCallForAttributes
;
LPCSTR
clsid_str
;
/* can be NULL to omit */
LPCSTR
progid
;
/* can be NULL to omit */
LPCSTR
viprogid
;
/* can be NULL to omit */
LPCSTR
progid_extra
;
/* can be NULL to omit */
UINT
idDefaultIcon
;
/* can be 0 to omit */
};
/* flags for regsvr_coclass.flags */
#define SHELLEX_MAYCHANGEDEFAULTMENU 0x00000001
#define SHELLFOLDER_WANTSFORPARSING 0x00000002
#define SHELLFOLDER_WANTSFORDISPLAY 0x00000004
#define SHELLFOLDER_ATTRIBUTES 0x00000008
#define SHELLFOLDER_CALLFORATTRIBUTES 0x00000010
#define SHELLFOLDER_HIDEASDELETE 0x00000020
static
HRESULT
register_coclasses
(
struct
regsvr_coclass
const
*
list
);
static
HRESULT
unregister_coclasses
(
struct
regsvr_coclass
const
*
list
);
struct
regsvr_namespace
{
CLSID
const
*
clsid
;
/* CLSID of the namespace extension. NULL for end of list */
LPCWSTR
parent
;
/* Mount point (MyComputer, Desktop, ..). */
LPCWSTR
value
;
/* Display name of the extension. */
};
static
HRESULT
register_namespace_extensions
(
struct
regsvr_namespace
const
*
list
);
static
HRESULT
unregister_namespace_extensions
(
struct
regsvr_namespace
const
*
list
);
/***********************************************************************
* static string constants
*/
static
WCHAR
const
interface_keyname
[
10
]
=
{
'I'
,
'n'
,
't'
,
'e'
,
'r'
,
'f'
,
'a'
,
'c'
,
'e'
,
0
};
static
WCHAR
const
base_ifa_keyname
[
14
]
=
{
'B'
,
'a'
,
's'
,
'e'
,
'I'
,
'n'
,
't'
,
'e'
,
'r'
,
'f'
,
'a'
,
'c'
,
'e'
,
0
};
static
WCHAR
const
num_methods_keyname
[
11
]
=
{
'N'
,
'u'
,
'm'
,
'M'
,
'e'
,
't'
,
'h'
,
'o'
,
'd'
,
's'
,
0
};
static
WCHAR
const
ps_clsid_keyname
[
15
]
=
{
'P'
,
'r'
,
'o'
,
'x'
,
'y'
,
'S'
,
't'
,
'u'
,
'b'
,
'C'
,
'l'
,
's'
,
'i'
,
'd'
,
0
};
static
WCHAR
const
ps_clsid32_keyname
[
17
]
=
{
'P'
,
'r'
,
'o'
,
'x'
,
'y'
,
'S'
,
't'
,
'u'
,
'b'
,
'C'
,
'l'
,
's'
,
'i'
,
'd'
,
'3'
,
'2'
,
0
};
static
WCHAR
const
clsid_keyname
[
6
]
=
{
'C'
,
'L'
,
'S'
,
'I'
,
'D'
,
0
};
static
WCHAR
const
curver_keyname
[
7
]
=
{
'C'
,
'u'
,
'r'
,
'V'
,
'e'
,
'r'
,
0
};
static
WCHAR
const
ips_keyname
[
13
]
=
{
'I'
,
'n'
,
'P'
,
'r'
,
'o'
,
'c'
,
'S'
,
'e'
,
'r'
,
'v'
,
'e'
,
'r'
,
0
};
static
WCHAR
const
ips32_keyname
[
15
]
=
{
'I'
,
'n'
,
'P'
,
'r'
,
'o'
,
'c'
,
'S'
,
'e'
,
'r'
,
'v'
,
'e'
,
'r'
,
'3'
,
'2'
,
0
};
static
WCHAR
const
progid_keyname
[
7
]
=
{
'P'
,
'r'
,
'o'
,
'g'
,
'I'
,
'D'
,
0
};
static
WCHAR
const
viprogid_keyname
[
25
]
=
{
'V'
,
'e'
,
'r'
,
's'
,
'i'
,
'o'
,
'n'
,
'I'
,
'n'
,
'd'
,
'e'
,
'p'
,
'e'
,
'n'
,
'd'
,
'e'
,
'n'
,
't'
,
'P'
,
'r'
,
'o'
,
'g'
,
'I'
,
'D'
,
0
};
static
WCHAR
const
shellex_keyname
[
8
]
=
{
's'
,
'h'
,
'e'
,
'l'
,
'l'
,
'e'
,
'x'
,
0
};
static
WCHAR
const
shellfolder_keyname
[
12
]
=
{
'S'
,
'h'
,
'e'
,
'l'
,
'l'
,
'F'
,
'o'
,
'l'
,
'd'
,
'e'
,
'r'
,
0
};
static
WCHAR
const
mcdm_keyname
[
21
]
=
{
'M'
,
'a'
,
'y'
,
'C'
,
'h'
,
'a'
,
'n'
,
'g'
,
'e'
,
'D'
,
'e'
,
'f'
,
'a'
,
'u'
,
'l'
,
't'
,
'M'
,
'e'
,
'n'
,
'u'
,
0
};
static
WCHAR
const
defaulticon_keyname
[]
=
{
'D'
,
'e'
,
'f'
,
'a'
,
'u'
,
'l'
,
't'
,
'I'
,
'c'
,
'o'
,
'n'
,
0
};
static
char
const
tmodel_valuename
[]
=
"ThreadingModel"
;
static
char
const
wfparsing_valuename
[]
=
"WantsFORPARSING"
;
static
char
const
wfdisplay_valuename
[]
=
"WantsFORDISPLAY"
;
static
char
const
attributes_valuename
[]
=
"Attributes"
;
static
char
const
cfattributes_valuename
[]
=
"CallForAttributes"
;
static
char
const
localized_valuename
[]
=
"LocalizedString"
;
static
char
const
hideasdelete_valuename
[]
=
"HideAsDeletePerUser"
;
/***********************************************************************
* static helper functions
*/
static
LONG
register_key_guid
(
HKEY
base
,
WCHAR
const
*
name
,
GUID
const
*
guid
);
static
LONG
register_key_defvalueW
(
HKEY
base
,
WCHAR
const
*
name
,
WCHAR
const
*
value
);
static
LONG
register_key_defvalueA
(
HKEY
base
,
WCHAR
const
*
name
,
char
const
*
value
);
static
LONG
register_progid
(
WCHAR
const
*
clsid
,
char
const
*
progid
,
char
const
*
curver_progid
,
char
const
*
name
,
char
const
*
extra
);
/***********************************************************************
* register_interfaces
*/
static
HRESULT
register_interfaces
(
struct
regsvr_interface
const
*
list
)
{
LONG
res
=
ERROR_SUCCESS
;
HKEY
interface_key
;
res
=
RegCreateKeyExW
(
HKEY_CLASSES_ROOT
,
interface_keyname
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
interface_key
,
NULL
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_return
;
for
(;
res
==
ERROR_SUCCESS
&&
list
->
iid
;
++
list
)
{
WCHAR
buf
[
39
];
HKEY
iid_key
;
StringFromGUID2
(
list
->
iid
,
buf
,
39
);
res
=
RegCreateKeyExW
(
interface_key
,
buf
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
iid_key
,
NULL
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_interface_key
;
if
(
list
->
name
)
{
res
=
RegSetValueExA
(
iid_key
,
NULL
,
0
,
REG_SZ
,
(
CONST
BYTE
*
)(
list
->
name
),
strlen
(
list
->
name
)
+
1
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_iid_key
;
}
if
(
list
->
base_iid
)
{
res
=
register_key_guid
(
iid_key
,
base_ifa_keyname
,
list
->
base_iid
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_iid_key
;
}
if
(
0
<=
list
->
num_methods
)
{
static
WCHAR
const
fmt
[
3
]
=
{
'%'
,
'd'
,
0
};
HKEY
key
;
res
=
RegCreateKeyExW
(
iid_key
,
num_methods_keyname
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
key
,
NULL
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_iid_key
;
sprintfW
(
buf
,
fmt
,
list
->
num_methods
);
res
=
RegSetValueExW
(
key
,
NULL
,
0
,
REG_SZ
,
(
CONST
BYTE
*
)
buf
,
(
lstrlenW
(
buf
)
+
1
)
*
sizeof
(
WCHAR
));
RegCloseKey
(
key
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_iid_key
;
}
if
(
list
->
ps_clsid
)
{
res
=
register_key_guid
(
iid_key
,
ps_clsid_keyname
,
list
->
ps_clsid
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_iid_key
;
}
if
(
list
->
ps_clsid32
)
{
res
=
register_key_guid
(
iid_key
,
ps_clsid32_keyname
,
list
->
ps_clsid32
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_iid_key
;
}
error_close_iid_key:
RegCloseKey
(
iid_key
);
}
error_close_interface_key:
RegCloseKey
(
interface_key
);
error_return:
return
res
!=
ERROR_SUCCESS
?
HRESULT_FROM_WIN32
(
res
)
:
S_OK
;
}
/***********************************************************************
* unregister_interfaces
*/
static
HRESULT
unregister_interfaces
(
struct
regsvr_interface
const
*
list
)
{
LONG
res
=
ERROR_SUCCESS
;
HKEY
interface_key
;
res
=
RegOpenKeyExW
(
HKEY_CLASSES_ROOT
,
interface_keyname
,
0
,
KEY_READ
|
KEY_WRITE
,
&
interface_key
);
if
(
res
==
ERROR_FILE_NOT_FOUND
)
return
S_OK
;
if
(
res
!=
ERROR_SUCCESS
)
goto
error_return
;
for
(;
res
==
ERROR_SUCCESS
&&
list
->
iid
;
++
list
)
{
WCHAR
buf
[
39
];
StringFromGUID2
(
list
->
iid
,
buf
,
39
);
res
=
RegDeleteTreeW
(
interface_key
,
buf
);
if
(
res
==
ERROR_FILE_NOT_FOUND
)
res
=
ERROR_SUCCESS
;
}
RegCloseKey
(
interface_key
);
error_return:
return
res
!=
ERROR_SUCCESS
?
HRESULT_FROM_WIN32
(
res
)
:
S_OK
;
}
/***********************************************************************
* register_coclasses
*/
static
HRESULT
register_coclasses
(
struct
regsvr_coclass
const
*
list
)
{
LONG
res
=
ERROR_SUCCESS
;
HKEY
coclass_key
;
res
=
RegCreateKeyExW
(
HKEY_CLASSES_ROOT
,
clsid_keyname
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
coclass_key
,
NULL
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_return
;
for
(;
res
==
ERROR_SUCCESS
&&
list
->
clsid
;
++
list
)
{
WCHAR
buf
[
39
];
HKEY
clsid_key
;
StringFromGUID2
(
list
->
clsid
,
buf
,
39
);
res
=
RegCreateKeyExW
(
coclass_key
,
buf
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
clsid_key
,
NULL
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_coclass_key
;
if
(
list
->
name
)
{
res
=
RegSetValueExA
(
clsid_key
,
NULL
,
0
,
REG_SZ
,
(
CONST
BYTE
*
)(
list
->
name
),
strlen
(
list
->
name
)
+
1
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
}
if
(
list
->
idName
)
{
char
buffer
[
64
];
sprintf
(
buffer
,
"@shell32.dll,-%u"
,
list
->
idName
);
res
=
RegSetValueExA
(
clsid_key
,
localized_valuename
,
0
,
REG_SZ
,
(
CONST
BYTE
*
)(
buffer
),
strlen
(
buffer
)
+
1
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
}
if
(
list
->
idDefaultIcon
)
{
HKEY
icon_key
;
char
buffer
[
64
];
res
=
RegCreateKeyExW
(
clsid_key
,
defaulticon_keyname
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
icon_key
,
NULL
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
sprintf
(
buffer
,
"shell32.dll,-%u"
,
list
->
idDefaultIcon
);
res
=
RegSetValueExA
(
icon_key
,
NULL
,
0
,
REG_SZ
,
(
CONST
BYTE
*
)(
buffer
),
strlen
(
buffer
)
+
1
);
RegCloseKey
(
icon_key
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
}
if
(
list
->
ips
)
{
res
=
register_key_defvalueA
(
clsid_key
,
ips_keyname
,
list
->
ips
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
}
if
(
list
->
ips32
)
{
HKEY
ips32_key
;
res
=
RegCreateKeyExW
(
clsid_key
,
ips32_keyname
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
ips32_key
,
NULL
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
res
=
RegSetValueExA
(
ips32_key
,
NULL
,
0
,
REG_SZ
,
(
CONST
BYTE
*
)
list
->
ips32
,
lstrlenA
(
list
->
ips32
)
+
1
);
if
(
res
==
ERROR_SUCCESS
&&
list
->
ips32_tmodel
)
res
=
RegSetValueExA
(
ips32_key
,
tmodel_valuename
,
0
,
REG_SZ
,
(
CONST
BYTE
*
)
list
->
ips32_tmodel
,
strlen
(
list
->
ips32_tmodel
)
+
1
);
RegCloseKey
(
ips32_key
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
}
if
(
list
->
flags
&
SHELLEX_MAYCHANGEDEFAULTMENU
)
{
HKEY
shellex_key
,
mcdm_key
;
res
=
RegCreateKeyExW
(
clsid_key
,
shellex_keyname
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
shellex_key
,
NULL
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
res
=
RegCreateKeyExW
(
shellex_key
,
mcdm_keyname
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
mcdm_key
,
NULL
);
RegCloseKey
(
shellex_key
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
RegCloseKey
(
mcdm_key
);
}
if
(
list
->
flags
&
(
SHELLFOLDER_WANTSFORPARSING
|
SHELLFOLDER_WANTSFORDISPLAY
|
SHELLFOLDER_ATTRIBUTES
|
SHELLFOLDER_CALLFORATTRIBUTES
|
SHELLFOLDER_HIDEASDELETE
))
{
HKEY
shellfolder_key
;
res
=
RegCreateKeyExW
(
clsid_key
,
shellfolder_keyname
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
shellfolder_key
,
NULL
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
if
(
list
->
flags
&
SHELLFOLDER_WANTSFORPARSING
)
res
=
RegSetValueExA
(
shellfolder_key
,
wfparsing_valuename
,
0
,
REG_SZ
,
(
const
BYTE
*
)
""
,
1
);
if
(
list
->
flags
&
SHELLFOLDER_WANTSFORDISPLAY
)
res
=
RegSetValueExA
(
shellfolder_key
,
wfdisplay_valuename
,
0
,
REG_SZ
,
(
const
BYTE
*
)
""
,
1
);
if
(
list
->
flags
&
SHELLFOLDER_HIDEASDELETE
)
res
=
RegSetValueExA
(
shellfolder_key
,
hideasdelete_valuename
,
0
,
REG_SZ
,
(
const
BYTE
*
)
""
,
1
);
if
(
list
->
flags
&
SHELLFOLDER_ATTRIBUTES
)
res
=
RegSetValueExA
(
shellfolder_key
,
attributes_valuename
,
0
,
REG_DWORD
,
(
const
BYTE
*
)
&
list
->
dwAttributes
,
sizeof
(
DWORD
));
if
(
list
->
flags
&
SHELLFOLDER_CALLFORATTRIBUTES
)
res
=
RegSetValueExA
(
shellfolder_key
,
cfattributes_valuename
,
0
,
REG_DWORD
,
(
const
BYTE
*
)
&
list
->
dwCallForAttributes
,
sizeof
(
DWORD
));
RegCloseKey
(
shellfolder_key
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
}
if
(
list
->
clsid_str
)
{
res
=
register_key_defvalueA
(
clsid_key
,
clsid_keyname
,
list
->
clsid_str
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
}
if
(
list
->
progid
)
{
HKEY
progid_key
;
res
=
register_key_defvalueA
(
clsid_key
,
progid_keyname
,
list
->
progid
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
res
=
RegCreateKeyExA
(
HKEY_CLASSES_ROOT
,
list
->
progid
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
progid_key
,
NULL
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
res
=
register_key_defvalueW
(
progid_key
,
clsid_keyname
,
buf
);
RegCloseKey
(
progid_key
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
}
if
(
list
->
viprogid
)
{
res
=
register_key_defvalueA
(
clsid_key
,
viprogid_keyname
,
list
->
viprogid
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
res
=
register_progid
(
buf
,
list
->
viprogid
,
list
->
progid
,
list
->
name
,
list
->
progid_extra
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_clsid_key
;
}
error_close_clsid_key:
RegCloseKey
(
clsid_key
);
}
error_close_coclass_key:
RegCloseKey
(
coclass_key
);
error_return:
return
res
!=
ERROR_SUCCESS
?
HRESULT_FROM_WIN32
(
res
)
:
S_OK
;
}
/***********************************************************************
* unregister_coclasses
*/
static
HRESULT
unregister_coclasses
(
struct
regsvr_coclass
const
*
list
)
{
LONG
res
=
ERROR_SUCCESS
;
HKEY
coclass_key
;
res
=
RegOpenKeyExW
(
HKEY_CLASSES_ROOT
,
clsid_keyname
,
0
,
KEY_READ
|
KEY_WRITE
,
&
coclass_key
);
if
(
res
==
ERROR_FILE_NOT_FOUND
)
return
S_OK
;
if
(
res
!=
ERROR_SUCCESS
)
goto
error_return
;
for
(;
res
==
ERROR_SUCCESS
&&
list
->
clsid
;
++
list
)
{
WCHAR
buf
[
39
];
StringFromGUID2
(
list
->
clsid
,
buf
,
39
);
res
=
RegDeleteTreeW
(
coclass_key
,
buf
);
if
(
res
==
ERROR_FILE_NOT_FOUND
)
res
=
ERROR_SUCCESS
;
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_coclass_key
;
if
(
list
->
progid
)
{
res
=
RegDeleteTreeA
(
HKEY_CLASSES_ROOT
,
list
->
progid
);
if
(
res
==
ERROR_FILE_NOT_FOUND
)
res
=
ERROR_SUCCESS
;
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_coclass_key
;
}
if
(
list
->
viprogid
)
{
res
=
RegDeleteTreeA
(
HKEY_CLASSES_ROOT
,
list
->
viprogid
);
if
(
res
==
ERROR_FILE_NOT_FOUND
)
res
=
ERROR_SUCCESS
;
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_coclass_key
;
}
}
error_close_coclass_key:
RegCloseKey
(
coclass_key
);
error_return:
return
res
!=
ERROR_SUCCESS
?
HRESULT_FROM_WIN32
(
res
)
:
S_OK
;
}
/**********************************************************************
* register_namespace_extensions
*/
static
WCHAR
*
get_namespace_key
(
struct
regsvr_namespace
const
*
list
)
{
static
const
WCHAR
wszExplorerKey
[]
=
{
'S'
,
'o'
,
'f'
,
't'
,
'w'
,
'a'
,
'r'
,
'e'
,
'\\'
,
'M'
,
'i'
,
'c'
,
'r'
,
'o'
,
's'
,
'o'
,
'f'
,
't'
,
'\\'
,
'W'
,
'i'
,
'n'
,
'd'
,
'o'
,
'w'
,
's'
,
'\\'
,
'C'
,
'u'
,
'r'
,
'r'
,
'e'
,
'n'
,
't'
,
'V'
,
'e'
,
'r'
,
's'
,
'i'
,
'o'
,
'n'
,
'\\'
,
'E'
,
'x'
,
'p'
,
'l'
,
'o'
,
'r'
,
'e'
,
'r'
,
'\\'
,
0
};
static
const
WCHAR
wszNamespace
[]
=
{
'\\'
,
'N'
,
'a'
,
'm'
,
'e'
,
's'
,
'p'
,
'a'
,
'c'
,
'e'
,
'\\'
,
0
};
WCHAR
*
pwszKey
,
*
pwszCLSID
;
pwszKey
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
wszExplorerKey
)
+
sizeof
(
wszNamespace
)
+
sizeof
(
WCHAR
)
*
(
lstrlenW
(
list
->
parent
)
+
CHARS_IN_GUID
));
if
(
!
pwszKey
)
return
NULL
;
lstrcpyW
(
pwszKey
,
wszExplorerKey
);
lstrcatW
(
pwszKey
,
list
->
parent
);
lstrcatW
(
pwszKey
,
wszNamespace
);
if
(
FAILED
(
StringFromCLSID
(
list
->
clsid
,
&
pwszCLSID
)))
{
HeapFree
(
GetProcessHeap
(),
0
,
pwszKey
);
return
NULL
;
}
lstrcatW
(
pwszKey
,
pwszCLSID
);
CoTaskMemFree
(
pwszCLSID
);
return
pwszKey
;
}
static
HRESULT
register_namespace_extensions
(
struct
regsvr_namespace
const
*
list
)
{
WCHAR
*
pwszKey
;
HKEY
hKey
;
for
(;
list
->
clsid
;
list
++
)
{
pwszKey
=
get_namespace_key
(
list
);
/* Create the key and set the value. */
if
(
pwszKey
&&
ERROR_SUCCESS
==
RegCreateKeyExW
(
HKEY_LOCAL_MACHINE
,
pwszKey
,
0
,
NULL
,
0
,
KEY_WRITE
,
NULL
,
&
hKey
,
NULL
))
{
RegSetValueExW
(
hKey
,
NULL
,
0
,
REG_SZ
,
(
const
BYTE
*
)
list
->
value
,
sizeof
(
WCHAR
)
*
(
lstrlenW
(
list
->
value
)
+
1
));
RegCloseKey
(
hKey
);
}
HeapFree
(
GetProcessHeap
(),
0
,
pwszKey
);
}
return
S_OK
;
}
static
HRESULT
unregister_namespace_extensions
(
struct
regsvr_namespace
const
*
list
)
{
WCHAR
*
pwszKey
;
for
(;
list
->
clsid
;
list
++
)
{
pwszKey
=
get_namespace_key
(
list
);
RegDeleteKeyW
(
HKEY_LOCAL_MACHINE
,
pwszKey
);
HeapFree
(
GetProcessHeap
(),
0
,
pwszKey
);
}
return
S_OK
;
}
/***********************************************************************
* regsvr_key_guid
*/
static
LONG
register_key_guid
(
HKEY
base
,
WCHAR
const
*
name
,
GUID
const
*
guid
)
{
WCHAR
buf
[
39
];
StringFromGUID2
(
guid
,
buf
,
39
);
return
register_key_defvalueW
(
base
,
name
,
buf
);
}
/***********************************************************************
* regsvr_key_defvalueW
*/
static
LONG
register_key_defvalueW
(
HKEY
base
,
WCHAR
const
*
name
,
WCHAR
const
*
value
)
{
LONG
res
;
HKEY
key
;
res
=
RegCreateKeyExW
(
base
,
name
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
key
,
NULL
);
if
(
res
!=
ERROR_SUCCESS
)
return
res
;
res
=
RegSetValueExW
(
key
,
NULL
,
0
,
REG_SZ
,
(
CONST
BYTE
*
)
value
,
(
lstrlenW
(
value
)
+
1
)
*
sizeof
(
WCHAR
));
RegCloseKey
(
key
);
return
res
;
}
/***********************************************************************
* regsvr_key_defvalueA
*/
static
LONG
register_key_defvalueA
(
HKEY
base
,
WCHAR
const
*
name
,
char
const
*
value
)
{
LONG
res
;
HKEY
key
;
res
=
RegCreateKeyExW
(
base
,
name
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
key
,
NULL
);
if
(
res
!=
ERROR_SUCCESS
)
return
res
;
res
=
RegSetValueExA
(
key
,
NULL
,
0
,
REG_SZ
,
(
CONST
BYTE
*
)
value
,
lstrlenA
(
value
)
+
1
);
RegCloseKey
(
key
);
return
res
;
}
/***********************************************************************
* regsvr_progid
*/
static
LONG
register_progid
(
WCHAR
const
*
clsid
,
char
const
*
progid
,
char
const
*
curver_progid
,
char
const
*
name
,
char
const
*
extra
)
{
LONG
res
;
HKEY
progid_key
;
res
=
RegCreateKeyExA
(
HKEY_CLASSES_ROOT
,
progid
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
progid_key
,
NULL
);
if
(
res
!=
ERROR_SUCCESS
)
return
res
;
if
(
name
)
{
res
=
RegSetValueExA
(
progid_key
,
NULL
,
0
,
REG_SZ
,
(
CONST
BYTE
*
)
name
,
strlen
(
name
)
+
1
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_progid_key
;
}
if
(
clsid
)
{
res
=
register_key_defvalueW
(
progid_key
,
clsid_keyname
,
clsid
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_progid_key
;
}
if
(
curver_progid
)
{
res
=
register_key_defvalueA
(
progid_key
,
curver_keyname
,
curver_progid
);
if
(
res
!=
ERROR_SUCCESS
)
goto
error_close_progid_key
;
}
if
(
extra
)
{
HKEY
extra_key
;
res
=
RegCreateKeyExA
(
progid_key
,
extra
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
extra_key
,
NULL
);
if
(
res
==
ERROR_SUCCESS
)
RegCloseKey
(
extra_key
);
}
error_close_progid_key:
RegCloseKey
(
progid_key
);
return
res
;
}
/***********************************************************************
* coclass list
*/
static
GUID
const
CLSID_Desktop
=
{
0x00021400
,
0x0000
,
0x0000
,
{
0xC0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x46
}
};
static
GUID
const
CLSID_Shortcut
=
{
0x00021401
,
0x0000
,
0x0000
,
{
0xC0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x46
}
};
static
struct
regsvr_coclass
const
coclass_list
[]
=
{
{
&
CLSID_Desktop
,
"Desktop"
,
IDS_DESKTOP
,
NULL
,
"shell32.dll"
,
"Apartment"
},
{
&
CLSID_DragDropHelper
,
"Shell Drag and Drop Helper"
,
0
,
NULL
,
"shell32.dll"
,
"Apartment"
},
{
&
CLSID_MyComputer
,
"My Computer"
,
IDS_MYCOMPUTER
,
NULL
,
"shell32.dll"
,
"Apartment"
},
{
&
CLSID_NetworkPlaces
,
"My Network Places"
,
0
,
NULL
,
"shell32.dll"
,
"Apartment"
},
{
&
CLSID_Shortcut
,
"Shortcut"
,
0
,
NULL
,
"shell32.dll"
,
"Apartment"
,
SHELLEX_MAYCHANGEDEFAULTMENU
},
{
&
CLSID_AutoComplete
,
"AutoComplete"
,
0
,
NULL
,
"shell32.dll"
,
"Apartment"
,
},
{
&
CLSID_UnixFolder
,
"/"
,
0
,
NULL
,
"shell32.dll"
,
"Apartment"
,
SHELLFOLDER_WANTSFORPARSING
},
{
&
CLSID_UnixDosFolder
,
"/"
,
0
,
NULL
,
"shell32.dll"
,
"Apartment"
,
SHELLFOLDER_WANTSFORPARSING
|
SHELLFOLDER_ATTRIBUTES
|
SHELLFOLDER_CALLFORATTRIBUTES
,
SFGAO_FILESYSANCESTOR
|
SFGAO_FOLDER
|
SFGAO_HASSUBFOLDER
,
SFGAO_FILESYSTEM
},
{
&
CLSID_FolderShortcut
,
"Foldershortcut"
,
0
,
NULL
,
"shell32.dll"
,
"Apartment"
,
SHELLFOLDER_ATTRIBUTES
|
SHELLFOLDER_CALLFORATTRIBUTES
,
SFGAO_FILESYSTEM
|
SFGAO_FOLDER
|
SFGAO_LINK
,
SFGAO_HASSUBFOLDER
|
SFGAO_FILESYSTEM
|
SFGAO_FOLDER
|
SFGAO_FILESYSANCESTOR
},
{
&
CLSID_MyDocuments
,
"My Documents"
,
IDS_PERSONAL
,
NULL
,
"shell32.dll"
,
"Apartment"
,
SHELLFOLDER_WANTSFORPARSING
|
SHELLFOLDER_ATTRIBUTES
|
SHELLFOLDER_CALLFORATTRIBUTES
,
SFGAO_FILESYSANCESTOR
|
SFGAO_FOLDER
|
SFGAO_HASSUBFOLDER
,
SFGAO_FILESYSTEM
},
{
&
CLSID_RecycleBin
,
"Trash"
,
IDS_RECYCLEBIN_FOLDER_NAME
,
NULL
,
"shell32.dll"
,
"Apartment"
,
SHELLFOLDER_ATTRIBUTES
,
SFGAO_FOLDER
|
SFGAO_DROPTARGET
|
SFGAO_HASPROPSHEET
,
0
,
NULL
,
NULL
,
NULL
,
NULL
,
IDI_SHELL_FULL_RECYCLE_BIN
},
{
&
CLSID_ShellFSFolder
,
"Shell File System Folder"
,
0
,
NULL
,
"shell32.dll"
,
"Apartment"
},
{
&
CLSID_ShellFolderViewOC
,
"Microsoft Shell Folder View Router"
,
0
,
NULL
,
"shell32.dll"
,
"Apartment"
},
{
&
CLSID_QueryAssociations
,
"Query file associations"
,
0
,
NULL
,
"shell32.dll"
,
"Apartment"
},
{
&
CLSID_ControlPanel
,
"Control Panel"
,
IDS_CONTROLPANEL
,
NULL
,
"shell32.dll"
,
"Apartment"
,
SHELLFOLDER_WANTSFORDISPLAY
|
SHELLFOLDER_ATTRIBUTES
|
SHELLFOLDER_HIDEASDELETE
,
SFGAO_FOLDER
|
SFGAO_HASSUBFOLDER
,
},
{
&
CLSID_Printers
,
"Printers and Faxes"
,
0
,
NULL
,
"shell32.dll"
,
"Apartment"
},
{
&
CLSID_ExplorerBrowser
,
"Explorer Browser"
,
0
,
NULL
,
"shell32.dll"
,
"Apartment"
},
{
&
CLSID_KnownFolderManager
,
"Known Folder Manager"
,
0
,
NULL
,
"shell32.dll"
,
"Apartment"
},
{
&
CLSID_Shell
,
"Shell Automation Service"
,
0
,
NULL
,
"shell32.dll"
,
"Apartment"
,
0
,
0
,
0
,
NULL
,
"Shell.Application.1"
,
"Shell.Application"
},
{
NULL
}
/* list terminator */
};
/***********************************************************************
* interface list
*/
static
struct
regsvr_interface
const
interface_list
[]
=
{
{
NULL
}
/* list terminator */
};
/***********************************************************************
* namespace extensions list
*/
static
const
WCHAR
wszDesktop
[]
=
{
'D'
,
'e'
,
's'
,
'k'
,
't'
,
'o'
,
'p'
,
0
};
static
const
WCHAR
wszSlash
[]
=
{
'/'
,
0
};
static
const
WCHAR
wszMyDocuments
[]
=
{
'M'
,
'y'
,
' '
,
'D'
,
'o'
,
'c'
,
'u'
,
'm'
,
'e'
,
'n'
,
't'
,
's'
,
0
};
static
const
WCHAR
wszRecycleBin
[]
=
{
'T'
,
'r'
,
'a'
,
's'
,
'h'
,
0
};
static
const
WCHAR
wszMyComputer
[]
=
{
'M'
,
'y'
,
'C'
,
'o'
,
'm'
,
'p'
,
'u'
,
't'
,
'e'
,
'r'
,
0
};
static
const
WCHAR
wszControlPanel
[]
=
{
'C'
,
'o'
,
'n'
,
't'
,
'r'
,
'o'
,
'l'
,
' '
,
'P'
,
'a'
,
'n'
,
'e'
,
'l'
,
0
};
static
struct
regsvr_namespace
const
namespace_extensions_list
[]
=
{
{
&
CLSID_UnixDosFolder
,
wszDesktop
,
wszSlash
},
{
&
CLSID_MyDocuments
,
wszDesktop
,
wszMyDocuments
},
{
&
CLSID_RecycleBin
,
wszDesktop
,
wszRecycleBin
},
{
&
CLSID_ControlPanel
,
wszMyComputer
,
wszControlPanel
},
{
NULL
}
};
/***********************************************************************
* DllRegisterServer (SHELL32.@)
*/
HRESULT
WINAPI
DllRegisterServer
(
void
)
{
HRESULT
hr
;
ITypeLib
*
tl
;
static
const
WCHAR
wszShell32
[]
=
{
's'
,
'h'
,
'e'
,
'l'
,
'l'
,
'3'
,
'2'
,
'.'
,
'd'
,
'l'
,
'l'
,
0
};
TRACE
(
"
\n
"
);
hr
=
register_coclasses
(
coclass_list
);
if
(
SUCCEEDED
(
hr
))
hr
=
register_interfaces
(
interface_list
);
if
(
SUCCEEDED
(
hr
))
hr
=
SHELL_RegisterShellFolders
();
if
(
SUCCEEDED
(
hr
))
hr
=
register_namespace_extensions
(
namespace_extensions_list
);
if
(
SUCCEEDED
(
hr
))
{
hr
=
LoadTypeLibEx
(
wszShell32
,
REGKIND_REGISTER
,
&
tl
);
if
(
SUCCEEDED
(
hr
))
ITypeLib_Release
(
tl
);
}
return
hr
;
}
/***********************************************************************
* DllUnregisterServer (SHELL32.@)
*/
HRESULT
WINAPI
DllUnregisterServer
(
void
)
{
HRESULT
hr
;
TRACE
(
"
\n
"
);
hr
=
unregister_coclasses
(
coclass_list
);
if
(
SUCCEEDED
(
hr
))
hr
=
unregister_interfaces
(
interface_list
);
if
(
SUCCEEDED
(
hr
))
hr
=
unregister_namespace_extensions
(
namespace_extensions_list
);
if
(
SUCCEEDED
(
hr
))
hr
=
UnRegisterTypeLib
(
&
LIBID_Shell32
,
1
,
0
,
LOCALE_SYSTEM_DEFAULT
,
SYS_WIN32
);
return
hr
;
}
dlls/shell32/shell32.rc
View file @
2afe205e
...
...
@@ -263,6 +263,9 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
/* @makedep: shell32_tlb.tlb */
1 TYPELIB shell32_tlb.tlb
/* @makedep: shell32.rgs */
1 WINE_REGISTRY shell32.rgs
shv_accel ACCELERATORS
BEGIN
VK_F5, FCIDM_SHVIEW_REFRESH, VIRTKEY
...
...
dlls/shell32/shell32.rgs
0 → 100644
View file @
2afe205e
HKCR
{
NoRemove CLSID
{
'{00021400-0000-0000-C000-000000000046}' { val LocalizedString = s '@%MODULE%,-20' }
'{20D04FE0-3AEA-1069-A2D8-08002B30309D}' { val LocalizedString = s '@%MODULE%,-21' }
'{21EC2020-3AEA-1069-A2DD-08002B30309D}' { val LocalizedString = s '@%MODULE%,-22' }
'{450D8FBA-AD25-11D0-98A8-0800361B1103}' { val LocalizedString = s '@%MODULE%,-46' }
'{645FF040-5081-101B-9F08-00AA002F954E}'
{
val LocalizedString = s '@%MODULE%,-8964'
DefaultIcon = s '@%MODULE%,-33'
}
'{00021401-0000-0000-C000-000000000046}' { shellex { MayChangeDefaultMenu } }
}
}
HKLM
{
NoRemove Software
{
NoRemove Microsoft
{
NoRemove Windows
{
NoRemove CurrentVersion
{
NoRemove Explorer
{
NoRemove Desktop
{
NoRemove Namespace
{
'{450D8FBA-AD25-11D0-98A8-0800361B1103}' = s 'My Documents'
'{645FF040-5081-101B-9F08-00AA002F954E}' = s 'Trash'
'{9D20AAE8-0625-44B0-9CA7-71889C2254D9}' = s '/'
}
}
NoRemove MyComputer
{
NoRemove Namespace
{
'{21EC2020-3AEA-1069-A2DD-08002B30309D}' = s 'Control Panel'
}
}
}
}
}
}
}
}
dlls/shell32/shell32_classes.idl
0 → 100644
View file @
2afe205e
/*
*
Coclasses
for
shell32
*
*
Copyright
2011
Alexandre
Julliard
*
*
This
library
is
free
software
; you can redistribute it and/or
*
modify
it
under
the
terms
of
the
GNU
Lesser
General
Public
*
License
as
published
by
the
Free
Software
Foundation
; either
*
version
2.1
of
the
License
,
or
(
at
your
option
)
any
later
version
.
*
*
This
library
is
distributed
in
the
hope
that
it
will
be
useful
,
*
but
WITHOUT
ANY
WARRANTY
; without even the implied warranty of
*
MERCHANTABILITY
or
FITNESS
FOR
A
PARTICULAR
PURPOSE
.
See
the
GNU
*
Lesser
General
Public
License
for
more
details
.
*
*
You
should
have
received
a
copy
of
the
GNU
Lesser
General
Public
*
License
along
with
this
library
; if not, write to the Free Software
*
Foundation
,
Inc
.
,
51
Franklin
St
,
Fifth
Floor
,
Boston
,
MA
02110
-
1301
,
USA
*/
[
helpstring
(
"Shell Automation Service"
),
progid
(
"Shell.Application.1"
),
vi_progid
(
"Shell.Application"
),
threading
(
apartment
),
uuid
(
13709620
-
c279
-
11
ce
-
a49e
-
444553540000
)
]
coclass
Shell
{
interface
IShellDispatch
; }
[
helpstring
(
"Printers and Faxes"
),
threading
(
apartment
),
uuid
(
2227
a280
-
3
aea
-
1069
-
a2de
-
08002b30309
d
)
]
coclass
Printers
{
interface
IShellFolder2
; }
[
helpstring
(
"Explorer Browser"
),
threading
(
apartment
),
uuid
(
71
f96385
-
ddd6
-
48
d3
-
a0c1
-
ae06e8b055fb
)
]
coclass
ExplorerBrowser
{
interface
IExplorerBrowser
; }
[
helpstring
(
"Known Folder Manager"
),
threading
(
apartment
),
uuid
(
4
df0c730
-
df9d
-
4
ae3
-
9153
-
aa6b82e9795a
)
]
coclass
KnownFolderManager
{
interface
IKnownFolderManager
; }
[
helpstring
(
"Microsoft Shell Folder View Router"
),
threading
(
apartment
),
uuid
(
9b
a05971
-
f6a8
-
11
cf
-
a442
-
00
a0c90a8f39
)
]
coclass
ShellFolderViewOC
{
}
[
helpstring
(
"Query file associations"
),
threading
(
apartment
),
uuid
(
a07034fd
-
6
caa
-
4954
-
ac3f
-
97
a27216f98a
)
]
coclass
QueryAssociations
{
interface
IQueryAssociations
; }
[
helpstring
(
"Shell Drag and Drop Helper"
),
threading
(
apartment
),
uuid
(
4657278
a
-
411b
-
11
d2
-
839
a
-
00
c04fd918d0
)
]
coclass
DragDropHelper
{
interface
IDropTargetHelper
; }
[
threading
(
apartment
),
uuid
(
00b
b2763
-
6
a77
-
11
d0
-
a535
-
00
c04fd7d062
)
]
coclass
AutoComplete
{
interface
IAutoComplete2
; }
[
helpstring
(
"Shell File System Folder"
),
threading
(
apartment
),
uuid
(
f3364ba0
-
65b9
-
11
ce
-
a9ba
-
00
aa004ae837
)
]
coclass
ShellFSFolder
{
interface
IShellFolder2
; }
[
helpstring
(
"My Network Places"
),
threading
(
apartment
),
uuid
(
208
d2c60
-
3
aea
-
1069
-
a2d7
-
08002b30309
d
)
]
coclass
NetworkPlaces
{
interface
IShellFolder2
; }
[
helpstring
(
"Desktop"
),
threading
(
apartment
),
uuid
(
00021400
-
0000
-
0000
-
c000
-
000000000046
)
]
coclass
ShellDesktop
{
interface
IShellFolder2
; }
[
helpstring
(
"Shortcut"
),
threading
(
apartment
),
uuid
(
00021401
-
0000
-
0000
-
c000
-
000000000046
)
]
coclass
ShellLink
{
interface
IShellLinkW
; }
[
helpstring
(
"My Computer"
),
threading
(
apartment
),
uuid
(
20
d04fe0
-
3
aea
-
1069
-
a2d8
-
08002b30309
d
)
]
coclass
MyComputer
{
interface
IShellFolder2
; }
[
threading
(
apartment
),
uuid
(
0
afaced1
-
e828
-
11
d1
-
9187
-
b532f1e9575d
)
]
coclass
FolderShortcut
{
interface
IShellFolder2
; }
[
helpstring
(
"/"
),
threading
(
apartment
),
uuid
(
cc702eb2
-
7
dc5
-
11
d9
-
c687
-
0004238
a01cd
)
]
coclass
UnixFolder
{
interface
IShellFolder2
; }
[
helpstring
(
"/"
),
threading
(
apartment
),
uuid
(
9
d20aae8
-
0625
-
44b0
-
9
ca7
-
71889
c2254d9
)
]
coclass
UnixDosFolder
{
interface
IShellFolder2
; }
[
helpstring
(
"My Documents"
),
threading
(
apartment
),
uuid
(
450
d8fba
-
ad25
-
11
d0
-
98
a8
-
0800361b1103
)
]
coclass
MyDocuments
{
interface
IShellFolder2
; }
[
helpstring
(
"Trash"
),
threading
(
apartment
),
uuid
(
645
ff040
-
5081
-
101b
-
9
f08
-
00
aa002f954e
)
]
coclass
RecycleBin
{
interface
IShellFolder2
; }
[
helpstring
(
"Control Panel"
),
threading
(
apartment
),
uuid
(
21
ec2020
-
3
aea
-
1069
-
a2dd
-
08002b30309
d
)
]
coclass
ControlPanel
{
interface
IShellFolder2
; }
dlls/shell32/shell32_main.c
View file @
2afe205e
...
...
@@ -37,6 +37,7 @@
#include "winuser.h"
#include "wingdi.h"
#include "shlobj.h"
#include "rpcproxy.h"
#include "shlwapi.h"
#include "propsys.h"
...
...
@@ -45,6 +46,8 @@
#include "shell32_main.h"
#include "version.h"
#include "shresdef.h"
#include "initguid.h"
#include "shfldr.h"
#include "wine/debug.h"
#include "wine/unicode.h"
...
...
@@ -1231,6 +1234,24 @@ HRESULT WINAPI DllCanUnloadNow(void)
}
/***********************************************************************
* DllRegisterServer (SHELL32.@)
*/
HRESULT
WINAPI
DllRegisterServer
(
void
)
{
HRESULT
hr
=
__wine_register_resources
(
shell32_hInstance
,
NULL
);
if
(
SUCCEEDED
(
hr
))
hr
=
SHELL_RegisterShellFolders
();
return
hr
;
}
/***********************************************************************
* DllUnregisterServer (SHELL32.@)
*/
HRESULT
WINAPI
DllUnregisterServer
(
void
)
{
return
__wine_unregister_resources
(
shell32_hInstance
,
NULL
);
}
/***********************************************************************
* ExtractVersionResource16W (SHELL32.@)
*/
BOOL
WINAPI
ExtractVersionResource16W
(
LPWSTR
s
,
DWORD
d
)
...
...
dlls/shell32/shellpath.c
View file @
2afe205e
...
...
@@ -2726,6 +2726,77 @@ static HRESULT create_extra_folders(void)
}
/******************************************************************************
* set_folder_attributes
*
* Set the various folder attributes registry keys.
*/
static
HRESULT
set_folder_attributes
(
void
)
{
static
const
WCHAR
clsidW
[]
=
{
'C'
,
'L'
,
'S'
,
'I'
,
'D'
,
'\\'
,
0
};
static
const
WCHAR
shellfolderW
[]
=
{
'\\'
,
'S'
,
'h'
,
'e'
,
'l'
,
'l'
,
'F'
,
'o'
,
'l'
,
'd'
,
'e'
,
'r'
,
0
};
static
const
WCHAR
wfparsingW
[]
=
{
'W'
,
'a'
,
'n'
,
't'
,
's'
,
'F'
,
'O'
,
'R'
,
'P'
,
'A'
,
'R'
,
'S'
,
'I'
,
'N'
,
'G'
,
0
};
static
const
WCHAR
wfdisplayW
[]
=
{
'W'
,
'a'
,
'n'
,
't'
,
's'
,
'F'
,
'O'
,
'R'
,
'D'
,
'I'
,
'S'
,
'P'
,
'L'
,
'A'
,
'Y'
,
0
};
static
const
WCHAR
hideasdeleteW
[]
=
{
'H'
,
'i'
,
'd'
,
'e'
,
'A'
,
's'
,
'D'
,
'e'
,
'l'
,
'e'
,
't'
,
'e'
,
'P'
,
'e'
,
'r'
,
'U'
,
's'
,
'e'
,
'r'
,
0
};
static
const
WCHAR
attributesW
[]
=
{
'A'
,
't'
,
't'
,
'r'
,
'i'
,
'b'
,
'u'
,
't'
,
'e'
,
's'
,
0
};
static
const
WCHAR
cfattributesW
[]
=
{
'C'
,
'a'
,
'l'
,
'l'
,
'F'
,
'o'
,
'r'
,
'A'
,
't'
,
't'
,
'r'
,
'i'
,
'b'
,
'u'
,
't'
,
'e'
,
's'
,
0
};
static
const
WCHAR
emptyW
[]
=
{
0
};
static
const
struct
{
const
CLSID
*
clsid
;
BOOL
wfparsing
:
1
;
BOOL
wfdisplay
:
1
;
BOOL
hideasdel
:
1
;
DWORD
attr
;
DWORD
call_for_attr
;
}
folders
[]
=
{
{
&
CLSID_UnixFolder
,
TRUE
,
FALSE
,
FALSE
},
{
&
CLSID_UnixDosFolder
,
TRUE
,
FALSE
,
FALSE
,
SFGAO_FILESYSANCESTOR
|
SFGAO_FOLDER
|
SFGAO_HASSUBFOLDER
,
SFGAO_FILESYSTEM
},
{
&
CLSID_FolderShortcut
,
FALSE
,
FALSE
,
FALSE
,
SFGAO_FILESYSTEM
|
SFGAO_FOLDER
|
SFGAO_LINK
,
SFGAO_HASSUBFOLDER
|
SFGAO_FILESYSTEM
|
SFGAO_FOLDER
|
SFGAO_FILESYSANCESTOR
},
{
&
CLSID_MyDocuments
,
TRUE
,
FALSE
,
FALSE
,
SFGAO_FILESYSANCESTOR
|
SFGAO_FOLDER
|
SFGAO_HASSUBFOLDER
,
SFGAO_FILESYSTEM
},
{
&
CLSID_RecycleBin
,
FALSE
,
FALSE
,
FALSE
,
SFGAO_FOLDER
|
SFGAO_DROPTARGET
|
SFGAO_HASPROPSHEET
},
{
&
CLSID_ControlPanel
,
FALSE
,
TRUE
,
TRUE
,
SFGAO_FOLDER
|
SFGAO_HASSUBFOLDER
}
};
unsigned
int
i
;
WCHAR
buffer
[
39
+
(
sizeof
(
clsidW
)
+
sizeof
(
shellfolderW
))
/
sizeof
(
WCHAR
)];
LONG
res
;
HKEY
hkey
;
for
(
i
=
0
;
i
<
sizeof
(
folders
)
/
sizeof
(
folders
[
0
]);
i
++
)
{
strcpyW
(
buffer
,
clsidW
);
StringFromGUID2
(
folders
[
i
].
clsid
,
buffer
+
strlenW
(
buffer
),
39
);
strcatW
(
buffer
,
shellfolderW
);
res
=
RegCreateKeyExW
(
HKEY_CLASSES_ROOT
,
buffer
,
0
,
NULL
,
0
,
KEY_READ
|
KEY_WRITE
,
NULL
,
&
hkey
,
NULL
);
if
(
res
)
return
HRESULT_FROM_WIN32
(
res
);
if
(
folders
[
i
].
wfparsing
)
res
=
RegSetValueExW
(
hkey
,
wfparsingW
,
0
,
REG_SZ
,
(
const
BYTE
*
)
emptyW
,
sizeof
(
emptyW
)
);
if
(
folders
[
i
].
wfdisplay
)
res
=
RegSetValueExW
(
hkey
,
wfdisplayW
,
0
,
REG_SZ
,
(
const
BYTE
*
)
emptyW
,
sizeof
(
emptyW
)
);
if
(
folders
[
i
].
hideasdel
)
res
=
RegSetValueExW
(
hkey
,
hideasdeleteW
,
0
,
REG_SZ
,
(
const
BYTE
*
)
emptyW
,
sizeof
(
emptyW
)
);
if
(
folders
[
i
].
attr
)
res
=
RegSetValueExW
(
hkey
,
attributesW
,
0
,
REG_DWORD
,
(
const
BYTE
*
)
&
folders
[
i
].
attr
,
sizeof
(
DWORD
));
if
(
folders
[
i
].
call_for_attr
)
res
=
RegSetValueExW
(
hkey
,
cfattributesW
,
0
,
REG_DWORD
,
(
const
BYTE
*
)
&
folders
[
i
].
call_for_attr
,
sizeof
(
DWORD
));
RegCloseKey
(
hkey
);
}
return
S_OK
;
}
/* Register the default values in the registry, as some apps seem to depend
* on their presence. The set registered was taken from Windows XP.
*/
...
...
@@ -2746,6 +2817,8 @@ HRESULT SHELL_RegisterShellFolders(void)
hr
=
_SHRegisterCommonShellFolders
();
if
(
SUCCEEDED
(
hr
))
hr
=
create_extra_folders
();
if
(
SUCCEEDED
(
hr
))
hr
=
set_folder_attributes
();
return
hr
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment