Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
e2051cd0
Commit
e2051cd0
authored
Aug 15, 1999
by
Juergen Schmied
Committed by
Alexandre Julliard
Aug 15, 1999
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implemented SHGetFileInfo better.
parent
05043584
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
178 additions
and
119 deletions
+178
-119
shell32_main.c
dlls/shell32/shell32_main.c
+178
-119
No files found.
dlls/shell32/shell32_main.c
View file @
e2051cd0
...
@@ -30,6 +30,7 @@
...
@@ -30,6 +30,7 @@
DECLARE_DEBUG_CHANNEL
(
exec
)
DECLARE_DEBUG_CHANNEL
(
exec
)
DECLARE_DEBUG_CHANNEL
(
shell
)
DECLARE_DEBUG_CHANNEL
(
shell
)
#define MORE_DEBUG 1
/*************************************************************************
/*************************************************************************
* CommandLineToArgvW [SHELL32.7]
* CommandLineToArgvW [SHELL32.7]
*/
*/
...
@@ -100,97 +101,90 @@ void WINAPI Control_RunDLL( HWND hwnd, LPCVOID code, LPCSTR cmd, DWORD arg4 )
...
@@ -100,97 +101,90 @@ void WINAPI Control_RunDLL( HWND hwnd, LPCVOID code, LPCSTR cmd, DWORD arg4 )
DWORD
WINAPI
SHGetFileInfoA
(
LPCSTR
path
,
DWORD
dwFileAttributes
,
DWORD
WINAPI
SHGetFileInfoA
(
LPCSTR
path
,
DWORD
dwFileAttributes
,
SHFILEINFOA
*
psfi
,
UINT
sizeofpsfi
,
SHFILEINFOA
*
psfi
,
UINT
sizeofpsfi
,
UINT
flags
)
UINT
flags
)
{
CHAR
szTemp
[
MAX_PATH
];
{
LPPIDLDATA
pData
;
char
szLoaction
[
MAX_PATH
];
LPITEMIDLIST
pPidlTemp
=
NULL
;
int
iIndex
;
DWORD
ret
=
0
,
dwfa
=
dwFileAttributes
;
DWORD
ret
=
TRUE
,
dwAttributes
=
0
;
IShellFolder
*
psfParent
=
NULL
;
IExtractIcon
*
pei
=
NULL
;
LPITEMIDLIST
pidlLast
,
pidl
=
NULL
;
HRESULT
hr
=
S_OK
;
TRACE_
(
shell
)(
"(%s,0x%lx,%p,0x%x,0x%x)
\n
"
,
TRACE_
(
shell
)(
"(%s,0x%lx,%p,0x%x,0x%x)
\n
"
,
path
,
dwFileAttributes
,
psfi
,
sizeofpsfi
,
flags
);
(
flags
&
SHGFI_PIDL
)
?
"pidl"
:
path
,
dwFileAttributes
,
psfi
,
sizeofpsfi
,
flags
);
#ifdef MORE_DEBUG
ZeroMemory
(
psfi
,
sizeof
(
SHFILEINFOA
));
#endif
if
((
flags
&
SHGFI_USEFILEATTRIBUTES
)
&&
(
flags
&
(
SHGFI_ATTRIBUTES
|
SHGFI_EXETYPE
|
SHGFI_PIDL
)))
return
FALSE
;
/* translate the pidl to a path*/
/* translate the path into a pidl only when SHGFI_USEFILEATTRIBUTES in not specified
the pidl functions fail on not existing file names */
if
(
flags
&
SHGFI_PIDL
)
if
(
flags
&
SHGFI_PIDL
)
{
pPidlTemp
=
(
LPCITEMIDLIST
)
path
;
{
SHGetPathFromIDListA
(
pPidlTemp
,
szTemp
);
pidl
=
(
LPCITEMIDLIST
)
path
;
TRACE_
(
shell
)(
"pidl=%p is %s
\n
"
,
path
,
szTemp
);
}
}
else
else
if
(
!
(
flags
&
SHGFI_USEFILEATTRIBUTES
))
{
strcpy
(
szTemp
,
path
);
{
TRACE_
(
shell
)(
"path=%s
\n
"
,
szTemp
);
hr
=
SHILCreateFromPathA
(
path
,
&
pidl
,
&
dwAttributes
);
/* note: the attributes in ISF::ParseDisplayName are not implemented */
}
}
if
(
flags
&
SHGFI_ATTRIBUTES
)
/* get the parent shellfolder */
{
if
(
flags
&
SHGFI_PIDL
)
if
(
pidl
)
{
{
/*
hr
=
SHBindToParent
(
pidl
,
&
IID_IShellFolder
,
(
LPVOID
*
)
&
psfParent
,
&
pidlLast
);
* We have to test for the desktop folder first because ILGetDataPointer returns
* NULL on the desktop folder.
*/
if
(
_ILIsDesktop
((
LPCITEMIDLIST
)
path
))
{
psfi
->
dwAttributes
=
0xb0000154
;
ret
=
TRUE
;
}
}
else
{
pData
=
_ILGetDataPointer
((
LPCITEMIDLIST
)
path
);
switch
(
pData
->
type
)
/* get the attributes of the child */
{
case
PT_DESKTOP
:
if
(
SUCCEEDED
(
hr
)
&&
(
flags
&
SHGFI_ATTRIBUTES
))
psfi
->
dwAttributes
=
0xb0000154
;
{
case
PT_MYCOMP
:
if
(
!
(
flags
&
SHGFI_ATTR_SPECIFIED
))
psfi
->
dwAttributes
=
0xb0000154
;
{
case
PT_SPECIAL
:
psfi
->
dwAttributes
=
0xffffffff
;
psfi
->
dwAttributes
=
0xa0000000
;
case
PT_DRIVE
:
psfi
->
dwAttributes
=
0xf0000144
;
case
PT_FOLDER
:
psfi
->
dwAttributes
=
0xe0000177
;
case
PT_VALUE
:
psfi
->
dwAttributes
=
0x40000177
;
}
}
ret
=
TRUE
;
IShellFolder_GetAttributesOf
(
psfParent
,
1
,
&
pidlLast
,
&
(
psfi
->
dwAttributes
))
;
}
}
/* get the displayname */
if
(
SUCCEEDED
(
hr
)
&&
(
flags
&
SHGFI_DISPLAYNAME
))
{
if
(
flags
&
SHGFI_USEFILEATTRIBUTES
)
{
strcpy
(
psfi
->
szDisplayName
,
PathFindFilenameA
(
path
));
}
}
else
else
{
if
(
!
(
flags
&
SHGFI_USEFILEATTRIBUTES
))
{
dwfa
=
GetFileAttributesA
(
szTemp
);
STRRET
str
;
hr
=
IShellFolder_GetDisplayNameOf
(
psfParent
,
pidlLast
,
SHGDN_INFOLDER
,
&
str
);
psfi
->
dwAttributes
=
SFGAO_FILESYSTEM
;
StrRetToStrNA
(
psfi
->
szDisplayName
,
MAX_PATH
,
&
str
,
pidlLast
);
if
(
dwfa
==
FILE_ATTRIBUTE_DIRECTORY
)
psfi
->
dwAttributes
|=
SFGAO_FOLDER
|
SFGAO_HASSUBFOLDER
;
ret
=
TRUE
;
}
}
WARN_
(
shell
)(
"file attributes, semi-stub
\n
"
);
}
}
if
(
flags
&
SHGFI_DISPLAYNAME
)
/* get the type name */
if
(
SUCCEEDED
(
hr
)
&&
(
flags
&
SHGFI_TYPENAME
))
{
{
if
(
flags
&
SHGFI_PIDL
)
if
(
_ILIsValue
(
pidlLast
)
)
{
{
_ILSimpleGetText
(
ILFindLastID
(
pPidlTemp
),
psfi
->
szDisplayName
,
MAX_PATH
);
char
sTemp
[
64
];
}
if
(
_ILGetExtension
(
pidlLast
,
sTemp
,
64
))
else
{
if
(
!
(
HCR_MapTypeToValue
(
sTemp
,
sTemp
,
64
,
TRUE
)
&&
HCR_MapTypeToValue
(
sTemp
,
psfi
->
szTypeName
,
80
,
FALSE
)))
{
{
lstrcpynA
(
psfi
->
szDisplayName
,
PathFindFilenameA
(
path
),
MAX_PATH
);
lstrcpynA
(
psfi
->
szTypeName
,
sTemp
,
74
);
strcat
(
psfi
->
szTypeName
,
"-file"
);
}
}
TRACE_
(
shell
)(
"displayname=%s
\n
"
,
psfi
->
szDisplayName
);
ret
=
TRUE
;
}
}
if
(
flags
&
SHGFI_TYPENAME
)
{
FIXME_
(
shell
)(
"get the file type, stub
\n
"
);
strcpy
(
psfi
->
szTypeName
,
"FIXME: Type"
);
ret
=
TRUE
;
}
}
else
if
(
flags
&
SHGFI_ICONLOCATION
)
{
{
FIXME_
(
shell
)(
"location of icon, stub
\n
"
);
strcpy
(
psfi
->
szTypeName
,
"Folder"
);
strcpy
(
psfi
->
szDisplayName
,
""
);
}
ret
=
TRUE
;
}
}
if
(
flags
&
SHGFI_EXETYPE
)
/* ### icons ###*/
FIXME_
(
shell
)(
"type of executable, stub
\n
"
);
if
(
flags
&
SHGFI_LINKOVERLAY
)
if
(
flags
&
SHGFI_LINKOVERLAY
)
FIXME_
(
shell
)(
"set icon to link, stub
\n
"
);
FIXME_
(
shell
)(
"set icon to link, stub
\n
"
);
...
@@ -203,47 +197,88 @@ DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes,
...
@@ -203,47 +197,88 @@ DWORD WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes,
if
(
flags
&
SHGFI_SHELLICONSIZE
)
if
(
flags
&
SHGFI_SHELLICONSIZE
)
FIXME_
(
shell
)(
"set icon to shell size, stub
\n
"
);
FIXME_
(
shell
)(
"set icon to shell size, stub
\n
"
);
if
(
flags
&
SHGFI_USEFILEATTRIBUTES
)
/* get the iconlocation */
FIXME_
(
shell
)(
"use the dwFileAttributes, stub
\n
"
);
if
(
SUCCEEDED
(
hr
)
&&
(
flags
&
SHGFI_ICONLOCATION
))
{
UINT
uDummy
,
uFlags
;
hr
=
IShellFolder_GetUIObjectOf
(
psfParent
,
0
,
1
,
&
pidlLast
,
&
IID_IExtractIconA
,
&
uDummy
,
(
LPVOID
*
)
&
pei
);
if
(
flags
&
(
SHGFI_UNKNOWN1
|
SHGFI_UNKNOWN2
|
SHGFI_UNKNOWN3
))
if
(
SUCCEEDED
(
hr
))
FIXME_
(
shell
)(
"unknown attribute!
\n
"
);
{
hr
=
IExtractIconA_GetIconLocation
(
pei
,
0
,
szLoaction
,
MAX_PATH
,
&
iIndex
,
&
uFlags
);
/* fixme what to do with the index? */
if
(
flags
&
SHGFI_ICON
)
if
(
uFlags
!=
GIL_NOTFILENAME
)
{
FIXME_
(
shell
)(
"icon handle
\n
"
);
strcpy
(
psfi
->
szDisplayName
,
szLoaction
);
if
(
flags
&
SHGFI_SMALLICON
)
{
TRACE_
(
shell
)(
"set to small icon
\n
"
);
psfi
->
hIcon
=
pImageList_GetIcon
(
ShellSmallIconList
,
32
,
ILD_NORMAL
);
ret
=
(
DWORD
)
ShellSmallIconList
;
}
else
else
{
TRACE_
(
shell
)(
"set to big icon
\n
"
)
;
ret
=
FALSE
;
psfi
->
hIcon
=
pImageList_GetIcon
(
ShellBigIconList
,
32
,
ILD_NORMAL
);
ret
=
(
DWORD
)
ShellBigIconList
;
IExtractIconA_Release
(
pei
)
;
}
}
}
}
if
(
flags
&
SHGFI_SYSICONINDEX
)
/* get icon index (or load icon)*/
{
IShellFolder
*
sf
;
if
(
SUCCEEDED
(
hr
)
&&
(
flags
&
(
SHGFI_ICON
|
SHGFI_SYSICONINDEX
)))
if
(
!
pPidlTemp
)
{
{
pPidlTemp
=
ILCreateFromPathA
(
szTemp
);
if
(
flags
&
SHGFI_USEFILEATTRIBUTES
)
{
char
sTemp
[
MAX_PATH
];
char
*
szExt
;
DWORD
dwNr
=
0
;
lstrcpynA
(
sTemp
,
path
,
MAX_PATH
);
szExt
=
(
LPSTR
)
PathFindExtensionA
(
sTemp
);
if
(
szExt
&&
HCR_MapTypeToValue
(
szExt
,
sTemp
,
MAX_PATH
,
TRUE
)
&&
HCR_GetDefaultIcon
(
sTemp
,
sTemp
,
MAX_PATH
,
&
dwNr
))
{
if
(
!
strcmp
(
"%1"
,
sTemp
))
/* icon is in the file */
{
strcpy
(
sTemp
,
path
);
}
}
if
(
SUCCEEDED
(
SHGetDesktopFolder
(
&
sf
)))
/* FIXME: if sTemp contains a valid filename, get the icon
{
psfi
->
iIcon
=
SHMapPIDLToSystemImageListIndex
(
sf
,
pPidlTemp
,
0
);
from there, index is in dwNr
IShellFolder_Release
(
sf
);
*/
psfi
->
iIcon
=
2
;
}
else
/* default icon */
{
psfi
->
iIcon
=
0
;
}
}
TRACE_
(
shell
)(
"-- SYSICONINDEX %i
\n
"
,
psfi
->
iIcon
);
if
(
flags
&
SHGFI_SMALLICON
)
{
TRACE_
(
shell
)(
"set to small icon
\n
"
);
ret
=
(
DWORD
)
ShellSmallIconList
;
}
}
else
else
{
TRACE_
(
shell
)(
"set to big icon
\n
"
);
{
ret
=
(
DWORD
)
ShellBigIconList
;
if
(
!
(
PidlToSicIndex
(
psfParent
,
pidlLast
,
(
flags
&&
SHGFI_LARGEICON
),
&
(
psfi
->
iIcon
))))
{
ret
=
FALSE
;
}
}
}
}
if
(
ret
)
{
ret
=
(
DWORD
)
((
flags
&&
SHGFI_LARGEICON
)
?
ShellBigIconList
:
ShellSmallIconList
);
}
}
/* icon handle */
if
(
SUCCEEDED
(
hr
)
&&
(
flags
&
SHGFI_ICON
))
psfi
->
hIcon
=
pImageList_GetIcon
((
flags
&&
SHGFI_LARGEICON
)
?
ShellBigIconList
:
ShellSmallIconList
,
psfi
->
iIcon
,
ILD_NORMAL
);
if
(
flags
&
SHGFI_EXETYPE
)
FIXME_
(
shell
)(
"type of executable, stub
\n
"
);
if
(
flags
&
(
SHGFI_UNKNOWN1
|
SHGFI_UNKNOWN2
|
SHGFI_UNKNOWN3
))
FIXME_
(
shell
)(
"unknown attribute!
\n
"
);
if
(
psfParent
)
IShellFolder_Release
(
psfParent
);
if
(
hr
!=
S_OK
)
ret
=
FALSE
;
#ifdef MORE_DEBUG
TRACE_
(
shell
)
(
"icon=0x%08x index=0x%08x attr=0x%08lx name=%s type=%s
\n
"
,
psfi
->
hIcon
,
psfi
->
iIcon
,
psfi
->
dwAttributes
,
psfi
->
szDisplayName
,
psfi
->
szTypeName
);
#endif
return
ret
;
return
ret
;
}
}
...
@@ -719,43 +754,58 @@ LPVOID (WINAPI *pDPA_DeletePtr) (const HDPA hdpa, INT i);
...
@@ -719,43 +754,58 @@ LPVOID (WINAPI *pDPA_DeletePtr) (const HDPA hdpa, INT i);
HICON
(
WINAPI
*
pLookupIconIdFromDirectoryEx
)(
LPBYTE
dir
,
BOOL
bIcon
,
INT
width
,
INT
height
,
UINT
cFlag
);
HICON
(
WINAPI
*
pLookupIconIdFromDirectoryEx
)(
LPBYTE
dir
,
BOOL
bIcon
,
INT
width
,
INT
height
,
UINT
cFlag
);
HICON
(
WINAPI
*
pCreateIconFromResourceEx
)(
LPBYTE
bits
,
UINT
cbSize
,
BOOL
bIcon
,
DWORD
dwVersion
,
INT
width
,
INT
height
,
UINT
cFlag
);
HICON
(
WINAPI
*
pCreateIconFromResourceEx
)(
LPBYTE
bits
,
UINT
cbSize
,
BOOL
bIcon
,
DWORD
dwVersion
,
INT
width
,
INT
height
,
UINT
cFlag
);
static
BOOL
bShell32IsInitialized
=
0
;
/* ole2 */
HRESULT
(
WINAPI
*
pOleInitialize
)(
LPVOID
reserved
);
void
(
WINAPI
*
pOleUninitialize
)(
void
);
HRESULT
(
WINAPI
*
pDoDragDrop
)(
IDataObject
*
pDataObject
,
IDropSource
*
pDropSource
,
DWORD
dwOKEffect
,
DWORD
*
pdwEffect
);
HRESULT
(
WINAPI
*
pRegisterDragDrop
)(
HWND
hwnd
,
IDropTarget
*
pDropTarget
);
HRESULT
(
WINAPI
*
pRevokeDragDrop
)(
HWND
hwnd
);
static
HINSTANCE
hComctl32
;
static
HINSTANCE
hComctl32
;
static
HINSTANCE
hOle32
;
static
INT
shell32_RefCount
=
0
;
static
INT
shell32_RefCount
=
0
;
INT
shell32_ObjCount
=
0
;
INT
shell32_ObjCount
=
0
;
HINSTANCE
shell32_hInstance
;
HINSTANCE
shell32_hInstance
;
HIMAGELIST
ShellSmallIconList
=
0
;
HIMAGELIST
ShellSmallIconList
=
0
;
HIMAGELIST
ShellBigIconList
=
0
;
HIMAGELIST
ShellBigIconList
=
0
;
HDPA
sic_hdpa
=
0
;
/*************************************************************************
/*************************************************************************
* SHELL32 LibMain
* SHELL32 LibMain
*
*
* NOTES
* calling oleinitialize here breaks sone apps.
*/
*/
BOOL
WINAPI
Shell32LibMain
(
HINSTANCE
hinstDLL
,
DWORD
fdwReason
,
LPVOID
fImpLoad
)
BOOL
WINAPI
Shell32LibMain
(
HINSTANCE
hinstDLL
,
DWORD
fdwReason
,
LPVOID
fImpLoad
)
{
HMODULE
hUser32
;
{
HMODULE
hUser32
;
TRACE_
(
shell
)(
"0x%x 0x%lx %p
\n
"
,
hinstDLL
,
fdwReason
,
fImpLoad
);
TRACE_
(
shell
)(
"0x%x 0x%lx %p
\n
"
,
hinstDLL
,
fdwReason
,
fImpLoad
);
shell32_hInstance
=
hinstDLL
;
switch
(
fdwReason
)
switch
(
fdwReason
)
{
{
case
DLL_PROCESS_ATTACH
:
case
DLL_PROCESS_ATTACH
:
if
(
!
bShell32IsInitialized
)
shell32_RefCount
++
;
if
(
shell32_hInstance
)
{
{
ERR_
(
shell
)(
"shell32.dll instantiated twice in one address space!
\n
"
);
}
shell32_hInstance
=
hinstDLL
;
hComctl32
=
LoadLibraryA
(
"COMCTL32.DLL"
);
hComctl32
=
LoadLibraryA
(
"COMCTL32.DLL"
);
hOle32
=
LoadLibraryA
(
"OLE32.DLL"
);
hUser32
=
GetModuleHandleA
(
"USER32"
);
hUser32
=
GetModuleHandleA
(
"USER32"
);
if
(
hComctl32
&&
hUser
32
)
if
(
!
hComctl32
||
!
hUser32
||
!
hOle
32
)
{
{
pDLLInitComctl
=
(
void
*
)
GetProcAddress
(
hComctl32
,
"InitCommonControlsEx"
);
ERR_
(
shell
)(
"P A N I C SHELL32 loading failed
\n
"
);
if
(
pDLLInitComctl
)
return
FALSE
;
{
pDLLInitComctl
(
NULL
);
}
}
/* comctl32 */
pDLLInitComctl
=
(
void
*
)
GetProcAddress
(
hComctl32
,
"InitCommonControlsEx"
);
pImageList_Create
=
(
void
*
)
GetProcAddress
(
hComctl32
,
"ImageList_Create"
);
pImageList_Create
=
(
void
*
)
GetProcAddress
(
hComctl32
,
"ImageList_Create"
);
pImageList_AddIcon
=
(
void
*
)
GetProcAddress
(
hComctl32
,
"ImageList_AddIcon"
);
pImageList_AddIcon
=
(
void
*
)
GetProcAddress
(
hComctl32
,
"ImageList_AddIcon"
);
pImageList_ReplaceIcon
=
(
void
*
)
GetProcAddress
(
hComctl32
,
"ImageList_ReplaceIcon"
);
pImageList_ReplaceIcon
=
(
void
*
)
GetProcAddress
(
hComctl32
,
"ImageList_ReplaceIcon"
);
...
@@ -763,8 +813,6 @@ BOOL WINAPI Shell32LibMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
...
@@ -763,8 +813,6 @@ BOOL WINAPI Shell32LibMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
pImageList_GetImageCount
=
(
void
*
)
GetProcAddress
(
hComctl32
,
"ImageList_GetImageCount"
);
pImageList_GetImageCount
=
(
void
*
)
GetProcAddress
(
hComctl32
,
"ImageList_GetImageCount"
);
pImageList_Draw
=
(
void
*
)
GetProcAddress
(
hComctl32
,
"ImageList_Draw"
);
pImageList_Draw
=
(
void
*
)
GetProcAddress
(
hComctl32
,
"ImageList_Draw"
);
pImageList_SetBkColor
=
(
void
*
)
GetProcAddress
(
hComctl32
,
"ImageList_SetBkColor"
);
pImageList_SetBkColor
=
(
void
*
)
GetProcAddress
(
hComctl32
,
"ImageList_SetBkColor"
);
/* imports by ordinal, pray that it works*/
pCOMCTL32_Alloc
=
(
void
*
)
GetProcAddress
(
hComctl32
,
(
LPCSTR
)
71L
);
pCOMCTL32_Alloc
=
(
void
*
)
GetProcAddress
(
hComctl32
,
(
LPCSTR
)
71L
);
pCOMCTL32_Free
=
(
void
*
)
GetProcAddress
(
hComctl32
,
(
LPCSTR
)
73L
);
pCOMCTL32_Free
=
(
void
*
)
GetProcAddress
(
hComctl32
,
(
LPCSTR
)
73L
);
pDPA_Create
=
(
void
*
)
GetProcAddress
(
hComctl32
,
(
LPCSTR
)
328L
);
pDPA_Create
=
(
void
*
)
GetProcAddress
(
hComctl32
,
(
LPCSTR
)
328L
);
...
@@ -777,15 +825,21 @@ BOOL WINAPI Shell32LibMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
...
@@ -777,15 +825,21 @@ BOOL WINAPI Shell32LibMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
/* user32 */
/* user32 */
pLookupIconIdFromDirectoryEx
=
(
void
*
)
GetProcAddress
(
hUser32
,
"LookupIconIdFromDirectoryEx"
);
pLookupIconIdFromDirectoryEx
=
(
void
*
)
GetProcAddress
(
hUser32
,
"LookupIconIdFromDirectoryEx"
);
pCreateIconFromResourceEx
=
(
void
*
)
GetProcAddress
(
hUser32
,
"CreateIconFromResourceEx"
);
pCreateIconFromResourceEx
=
(
void
*
)
GetProcAddress
(
hUser32
,
"CreateIconFromResourceEx"
);
/* ole2 */
pOleInitialize
=
(
void
*
)
GetProcAddress
(
hOle32
,
"OleInitialize"
);
pOleUninitialize
=
(
void
*
)
GetProcAddress
(
hOle32
,
"OleUninitialize"
);
pDoDragDrop
=
(
void
*
)
GetProcAddress
(
hOle32
,
"DoDragDrop"
);
pRegisterDragDrop
=
(
void
*
)
GetProcAddress
(
hOle32
,
"RegisterDragDrop"
);
pRevokeDragDrop
=
(
void
*
)
GetProcAddress
(
hOle32
,
"RevokeDragDrop"
);
/* initialize the common controls */
if
(
pDLLInitComctl
)
{
pDLLInitComctl
(
NULL
);
}
}
else
{
ERR_
(
shell
)(
"P A N I C SHELL32 loading failed
\n
"
);
return
FALSE
;
}
SIC_Initialize
();
SIC_Initialize
();
bShell32IsInitialized
=
TRUE
;
}
shell32_RefCount
++
;
break
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_ATTACH
:
...
@@ -798,26 +852,31 @@ BOOL WINAPI Shell32LibMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
...
@@ -798,26 +852,31 @@ BOOL WINAPI Shell32LibMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
case
DLL_PROCESS_DETACH
:
case
DLL_PROCESS_DETACH
:
shell32_RefCount
--
;
shell32_RefCount
--
;
pOleUninitialize
();
FreeLibrary
(
hOle32
);
FreeLibrary
(
hComctl32
);
if
(
!
shell32_RefCount
)
if
(
!
shell32_RefCount
)
{
{
bShell32IsInitialized
=
FALSE
;
shell32_hInstance
=
0
;
if
(
pdesktopfolder
)
if
(
pdesktopfolder
)
{
IShellFolder_Release
(
pdesktopfolder
);
{
IShellFolder_Release
(
pdesktopfolder
);
pdesktopfolder
=
NULL
;
pdesktopfolder
=
NULL
;
}
}
SIC_Destroy
();
SIC_Destroy
();
FreeLibrary
(
hComctl32
);
/* this one is here to check if AddRef/Release is balanced */
/* this one is here to check if AddRef/Release is balanced */
if
(
shell32_ObjCount
)
if
(
shell32_ObjCount
)
{
WARN_
(
shell
)(
"leaving with %u objects left (memory leak)
\n
"
,
shell32_ObjCount
);
{
WARN_
(
shell
)(
"leaving with %u objects left (memory leak)
\n
"
,
shell32_ObjCount
);
}
}
}
}
TRACE_
(
shell
)(
"refcount=%u objcount=%u
\n
"
,
shell32_RefCount
,
shell32_ObjCount
);
TRACE_
(
shell
)(
"refcount=%u objcount=%u
\n
"
,
shell32_RefCount
,
shell32_ObjCount
);
break
;
break
;
}
}
return
TRUE
;
return
TRUE
;
}
}
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