although it would be better to detect the real windows version. OSVersion() gets affected by compatibility mode, which is not the desired effect in this case. but thats your homework.
Code: Select all
Import "OleAut32.lib"
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
__SysAllocString_(String.p-unicode) As "_SysAllocString"
__SysFreeString_(*String) As "_SysFreeString"
CompilerElse
__SysAllocString_(String.p-unicode) As "SysAllocString"
__SysFreeString_(*String) As "SysFreeString"
CompilerEndIf
EndImport
Procedure$ ShellImageDimensions(FileName$)
Protected Result$, OSVersion, PathPart$, FilePart$, CoInit, *IShellDispatch.IShellDispatch, *SysPathPart, NameSpaceVariant.VARIANT, *Folder.Folder, *FolderItem.FolderItem, ItemDetailsColumn, ItemDetailsVariant.VARIANT, *ItemDetailsBSTR, ItemDetailsBSTRLength, ItemDetailsBSTROffset
OSVersion = OSVersion()
If OSVersion >= #PB_OS_Windows_Vista
ItemDetailsColumn = 31
ElseIf OSVersion >= #PB_OS_Windows_XP
ItemDetailsColumn = 26
EndIf
If ItemDetailsColumn
PathPart$ = GetPathPart(FileName$)
If PathPart$
FilePart$ = GetFilePart(FileName$)
If FilePart$
CoInit = CoInitializeEx_(0, #COINIT_APARTMENTTHREADED | #COINIT_DISABLE_OLE1DDE)
If CoInit = #S_OK Or CoInit = #S_FALSE Or CoInit & $FFFFFFFF = #RPC_E_CHANGED_MODE & $FFFFFFFF
If CoCreateInstance_(?CLSID_Shell, 0, #CLSCTX_INPROC_HANDLER | #CLSCTX_INPROC_SERVER | #CLSCTX_LOCAL_SERVER | #CLSCTX_REMOTE_SERVER, ?IID_IShellDispatch, @*IShellDispatch) = #ERROR_SUCCESS
*SysPathPart = __SysAllocString_(PathPart$)
If *SysPathPart
NameSpaceVariant\vt = #VT_BSTR
NameSpaceVariant\bstrVal = *SysPathPart
If *IShellDispatch\NameSpace(@NameSpaceVariant, @*Folder) = #ERROR_SUCCESS
If *Folder\ParseName(FilePart$, @*FolderItem) = #ERROR_SUCCESS
ItemDetailsVariant\vt = #VT_DISPATCH
ItemDetailsVariant\pdispVal = *FolderItem
If *Folder\GetDetailsOf(@ItemDetailsVariant, ItemDetailsColumn, @*ItemDetailsBSTR) = #ERROR_SUCCESS
If ItemDetailsColumn = 31
ItemDetailsBSTROffset = 2
EndIf
ItemDetailsBSTRLength = PeekL(*ItemDetailsBSTR - SizeOf(Long)) / 2
If ItemDetailsBSTRLength > ItemDetailsBSTROffset
Result$ = PeekS(*ItemDetailsBSTR + ItemDetailsBSTROffset, ItemDetailsBSTRLength - ItemDetailsBSTROffset, #PB_Unicode)
EndIf
EndIf
*FolderItem\Release()
EndIf
*Folder\Release()
EndIf
__SysFreeString_(*SysPathPart)
EndIf
*IShellDispatch\Release()
EndIf
If CoInit & $FFFFFFFF <> #RPC_E_CHANGED_MODE & $FFFFFFFF
CoUninitialize_()
EndIf
EndIf
EndIf
EndIf
EndIf
ProcedureReturn Result$
DataSection
CLSID_Shell:
Data.l $13709620
Data.w $C279, $11CE
Data.b $A4, $9E, $44, $45, $53, $54, $00, $00
IID_IShellDispatch:
Data.l $D8F015C0
Data.w $C278, $11CE
Data.b $A4, $9E, $44, $45, $53, $54, $00, $00
EndDataSection
EndProcedure
ImageDimensions$ = ShellImageDimensions(#PB_Compiler_Home+"Examples\Sources\Data\Geebee2.bmp")
Debug ImageDimensions$
Debug "Width: "+StringField(ImageDimensions$, 1, " x ")
Debug "Height: "+StringField(ImageDimensions$, 2, " x ")
nco2k