use Win32::API; use Data::Dumper; use strict; use warnings; # http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shgetfileinfo.asp # DWORD_PTR SHGetFileInfo( # LPCTSTR pszPath, # DWORD dwFileAttributes, # SHFILEINFO *psfi, # UINT cbFileInfo, # UINT uFlags # ); # typedef struct _SHFILEINFO { # HICON hIcon; # int iIcon; # DWORD dwAttributes; # TCHAR szDisplayName[MAX_PATH]; # TCHAR szTypeName[80]; # } SHFILEINFO; sub FILE_ATTRIBUTE_NORMAL { 0x00000080 } sub SHGFI_ICONLOCATION { 4096 } sub DWORD_SIZE { 4 } my $shell32 = 'shell32.dll'; my $pszPath = 'test.exe'; #my $dwFileAttributes = FILE_ATTRIBUTE_NORMAL; my $dwFileAttributes = 0; # typedef struct _SHFILEINFO { # HICON hIcon; # int iIcon; # DWORD dwAttributes; # TCHAR szDisplayName[MAX_PATH]; # TCHAR szTypeName[80]; # } SHFILEINFO; # -- - - # Method #1 Win32::API::Struct->typedef( 'SHFILEINFO', qw( HICON hIcon; int iIcon; DWORD dwAttributes; TCHAR szDisplayName[255]; TCHAR szTypeName[80]; ) ); #my $fileinfo = Win32::API->Import($shell32, 'DWORD SHGetFileInfo( LPCTSTR pszPath, DWORD dwFileAttributes, SHFILEINFO *psfi, UINT cbFileInfo, UINT uFlags)'); #my $SHFILEINFO = Win32::API::Struct->new( 'SHFILEINFO' ); #print Dumper($SHFILEINFO); #my $cbFileInfo = $SHFILEINFO->sizeof; # -- - - # Method #2 my $SHFILEINFO = pack("LiLCC"); my $cbFileInfo = length($SHFILEINFO); # ---- my $uFlags = SHGFI_ICONLOCATION; my $SHGetFileInfo = new Win32::API($shell32, 'SHGetFileInfo', 'PNPII', 'N') || die $^E; my $dword_p = $SHGetFileInfo->Call( $pszPath, $dwFileAttributes, $SHFILEINFO, $cbFileInfo, $uFlags, ) || die $^E; # For Method #1 #my $dword_p = SHGetFileInfo( # $pszPath, # $dwFileAttributes, # $SHFILEINFO, # $cbFileInfo, # $uFlags, #) || die $^E; #print "DD: " . $SHFILEINFO->{szDisplayName} . "\n"; # ------ print Dumper($SHFILEINFO);