Added possibly working thumbnail shell integration

Branch_1.5.0
Nathan Crawford 2009-05-22 21:15:56 +00:00
rodzic 7e317eae6d
commit 507292fe89
4 zmienionych plików z 192 dodań i 12 usunięć

Wyświetl plik

@ -1,23 +1,167 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Runtime.InteropServices;
namespace embroideryThumbs namespace embroideryThumbs
{ {
public class PESThumbnail //[Guid("69EA0D51-1BD4-4c6e-9AE0-B13C915A59E3")]
//public interface EmbThumbnailInterface
//{
// //COM visible function go here
//}
[StructLayout(LayoutKind.Sequential)]
public struct SIZE
{ {
//public HRESULT QueryInterface() public int cx;
//{ public int cy;
//} public SIZE(int cx, int cy)
//public UInt64 AddRef() {
//{ this.cx = cx;
this.cy = cy;
}
}
//} [ComImport, Guid("0000010c-0000-0000-c000-000000000046"),
//public UInt64 Release() InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
//{ public interface IPersist
{
[PreserveSig]
void GetClassID(out Guid pClassID);
}
//} [ComImport, Guid("0000010b-0000-0000-C000-000000000046"),
//public HRESULT Extract(HBITMAP InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPersistFile : IPersist
{
//new void GetClassID(out Guid pClassID);
[PreserveSig]
int IsDirty();
[PreserveSig]
void Load([In, MarshalAs(UnmanagedType.LPWStr)]
string pszFileName, uint dwMode);
[PreserveSig]
void Save([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName,
[In, MarshalAs(UnmanagedType.Bool)] bool fRemember);
[PreserveSig]
void SaveCompleted([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName);
[PreserveSig]
void GetCurFile([In, MarshalAs(UnmanagedType.LPWStr)] string ppszFileName);
}
[ComImportAttribute()]
[GuidAttribute("BB2E617C-0920-11d1-9A0B-00C04FC2D6C1")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
interface IExtractImage
{
void GetLocation(
[Out, MarshalAs(UnmanagedType.LPWStr)]
StringBuilder pszPathBuffer,
int cch,
ref int pdwPriority,
ref SIZE prgSize,
int dwRecClrDepth,
ref int pdwFlags);
void Extract(out IntPtr phBmpThumbnail);
}
//[Guid("xxxx"),
//InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
//public interface IExtractImage2
//{
// // from IExtractImage
// void Extract();
// void GetLocation();
// HRESULT GetDateStamp([Out] System.Runtime.InteropServices.ComTypes.FILETIME* pDateStamp);
//}
[Guid("EA7D5329-E9D7-49fb-9F55-A12D1A2ADB5D"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface EmbThumbnailEvents
{
}
[Guid("7E3EF3E8-39D4-4150-9EFF-58C71A1F4F9E"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(EmbThumbnailEvents))]
public class EmbThumbnail : IPersistFile, IExtractImage
{
PesFile.PesFile designFile;
public void GetClassID(out Guid pClassID)
{
// not implemented, but won't compile without this
pClassID = new Guid("7E3EF3E8-39D4-4150-9EFF-58C71A1F4F9E");
}
public int IsDirty()
{
return 0;
}
public void Load([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName, uint dwMode)
{
if(pszFileName.Substring(pszFileName.Length - 4).ToLower() == ".pes")
{
designFile = new PesFile.PesFile(pszFileName);
}
}
public void Save([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName, [In, MarshalAs(UnmanagedType.Bool)] bool fRemember)
{
//not implemented
}
public void SaveCompleted([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName)
{
//not implemented
}
public void GetCurFile([In, MarshalAs(UnmanagedType.LPWStr)] string ppszFileName)
{
//not implemented
}
public void GetLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszPathBuffer, int cch, ref int pdwPriority, ref SIZE prgSize, int dwRecClrDepth, ref int pdwFlags)
{
//not implemented
}
public unsafe void Extract(out IntPtr phBmpThumbnail)
{
System.Drawing.Bitmap designBitmap = designFile.designToBitmap(3, false, 0);
IntPtr hBmp = designBitmap.GetHbitmap();
phBmpThumbnail = new IntPtr();
// Assuming you already have hBmp as the handle to your Bitmap object...
if (IntPtr.Size == 4)
{
int* pBuffer = (int*)phBmpThumbnail.ToPointer();
*pBuffer = hBmp.ToInt32();
// IMO, casting back to (void*) is not necessary.
// I guess just for formality, that pBuffer points
// to an object, not an int. :)
phBmpThumbnail = new IntPtr((void*)pBuffer);
}
else // 8-bytes, or 64-bit
{
long* pBuffer = (long*)phBmpThumbnail.ToPointer();
*pBuffer = hBmp.ToInt64();
phBmpThumbnail = new IntPtr((void*)pBuffer);
}
}
} }
} }

Wyświetl plik

@ -17,7 +17,7 @@ using System.Runtime.InteropServices;
// Setting ComVisible to false makes the types in this assembly not visible // Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from // to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type. // COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)] [assembly: ComVisible(true)]
// The following GUID is for the ID of the typelib if this project is exposed to COM // The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("36115830-3226-4c7d-9abc-937cc8932cf6")] [assembly: Guid("36115830-3226-4c7d-9abc-937cc8932cf6")]

Wyświetl plik

@ -18,6 +18,8 @@
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<RegisterForComInterop>true</RegisterForComInterop>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
@ -37,6 +39,12 @@
<Compile Include="PESThumbnail.cs" /> <Compile Include="PESThumbnail.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\PesFile\PesFile.csproj">
<Project>{66EF662E-F52C-4104-9C15-A14266D8F3B8}</Project>
<Name>PesFile</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

Wyświetl plik

@ -84,6 +84,7 @@ Section "Associate with .PES files"
WriteRegStr HKCR ".pes" "backup_val" $1 WriteRegStr HKCR ".pes" "backup_val" $1
"${Index}-NoBackup:" "${Index}-NoBackup:"
WriteRegStr HKCR ".pes" "" "EmbroideryDesign" WriteRegStr HKCR ".pes" "" "EmbroideryDesign"
WriteRegStr HKCR ".pes" "PerceivedType" "image"
ReadRegStr $0 HKCR "EmbroideryDesign" "" ReadRegStr $0 HKCR "EmbroideryDesign" ""
StrCmp $0 "" 0 "${Index}-Skip" StrCmp $0 "" 0 "${Index}-Skip"
WriteRegStr HKCR "EmbroideryDesign" "" "Embroidery Design File" WriteRegStr HKCR "EmbroideryDesign" "" "Embroidery Design File"
@ -91,6 +92,33 @@ Section "Associate with .PES files"
WriteRegStr HKCR "EmbroideryDesign\DefaultIcon" "" "$INSTDIR\embroideryReader.exe,0" WriteRegStr HKCR "EmbroideryDesign\DefaultIcon" "" "$INSTDIR\embroideryReader.exe,0"
"${Index}-Skip:" "${Index}-Skip:"
WriteRegStr HKCR "EmbroideryDesign\shell\open\command" "" '$INSTDIR\embroideryReader.exe "%1"' WriteRegStr HKCR "EmbroideryDesign\shell\open\command" "" '$INSTDIR\embroideryReader.exe "%1"'
# Tell shell to use this for thumbnails
//StrCmp $DoThumbs 0 +3
WriteRegStr HKCR ".pes\ShellEx" "" ""
WriteRegStr HKCR ".pes\ShellEx\{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}" "" "{7E3EF3E8-39D4-4150-9EFF-58C71A1F4F9E}"
# Add thumbnail extractor classes
WriteRegStr HKCR "PESIcon.Extractor" "" "Embroidery Design Thumbnail Extractor"
WriteRegStr HKCR "PESIcon.Extractor\CLSID" "" "{7E3EF3E8-39D4-4150-9EFF-58C71A1F4F9E}"
WriteRegStr HKCR "PESIcon.Extractor\CurVer" "" "PESIcon.Extractor.1"
WriteRegStr HKCR "PESIcon.Extractor.1" "" "Embroidery Design Thumbnail Extractor"
WriteRegStr HKCR "PESIcon.Extractor.1\CLSID" "" "{7E3EF3E8-39D4-4150-9EFF-58C71A1F4F9E}"
# Add CLSID
WriteRegStr HKCR "CLSID\{7E3EF3E8-39D4-4150-9EFF-58C71A1F4F9E}" "" "Embroidery Design Thumbnail Extractor"
WriteRegStr HKCR "CLSID\{7E3EF3E8-39D4-4150-9EFF-58C71A1F4F9E}\InProcServer32" "" "$INSTDIR\embroideryThumbs.dll"
WriteRegStr HKCR "CLSID\{7E3EF3E8-39D4-4150-9EFF-58C71A1F4F9E}\InProcServer32" "ThreadingModel" "Apartment"
WriteRegStr HKCR "CLSID\{7E3EF3E8-39D4-4150-9EFF-58C71A1F4F9E}\ProgId" "" "PESIcon.Extractor.1"
WriteRegStr HKCR "CLSID\{7E3EF3E8-39D4-4150-9EFF-58C71A1F4F9E}\VersionIndependantProgId" "" "PESIcon.Extractor"
# Add to shell approved extensions list
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved" "{7E3EF3E8-39D4-4150-9EFF-58C71A1F4F9E}" "Embroidery Design Thumbnail Extractor"
# Cause explorer shell to reload settings
#System::Call "shell32::SHChangeNotify(i,i,i,i) (${SHCNE_ASSOCCHANGED}, ${SHCNF_FLUSH}, 0, 0)"
System::Call 'Shell32::SHChangeNotify(i 0x8000000, i 0, i 0, i 0)' System::Call 'Shell32::SHChangeNotify(i 0x8000000, i 0, i 0, i 0)'
!undef Index !undef Index