Full Code of tonyfederer/OutlookFileDrag for AI

master b9197a6baa5b cached
22 files
243.0 KB
59.1k tokens
131 symbols
1 requests
Download .txt
Showing preview only (253K chars total). Download the full file or copy to clipboard to get everything.
Repository: tonyfederer/OutlookFileDrag
Branch: master
Commit: b9197a6baa5b
Files: 22
Total size: 243.0 KB

Directory structure:
gitextract_r8lm3glj/

├── .gitignore
├── LICENSE
├── License.rtf
├── OutlookFileDrag/
│   ├── App.config
│   ├── DataObjectHelper.cs
│   ├── DragDropHook.cs
│   ├── FileUtility.cs
│   ├── FormatEtcEnumerator.cs
│   ├── NativeMethods.cs
│   ├── OutlookDataObject.cs
│   ├── OutlookDragSource.cs
│   ├── OutlookFileDrag.csproj
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── ThisAddIn.Designer.cs
│   ├── ThisAddIn.Designer.xml
│   ├── ThisAddIn.cs
│   └── packages.config
├── OutlookFileDrag.sln
├── OutlookFileDragSetup/
│   └── OutlookFileDragSetup.vdproj
├── OutlookFileDragSetup_x64/
│   └── OutlookFileDragSetup_x64.vdproj
├── Readme.md
└── _config.yml

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUNIT
*.VisualState.xml
TestResult.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
**/Properties/launchSettings.json

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk 
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# JetBrains Rider
.idea/
*.sln.iml

# CodeRush
.cr/

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output 
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

================================================
FILE: LICENSE
================================================
Copyright (c) 2018 Tony Federer 

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: OutlookFileDrag/App.config
================================================
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false" />
  </configSections>
  <!-- Configure log4net logging -->
  <log4net>
    <root>
      <level value="INFO" />
      <appender-ref ref="RollingFileAppender" />
    </root>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="${APPDATA}\OutlookFileDrag\OutlookFileDrag.log" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="1" />
      <maximumFileSize value="10MB" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
  </log4net>
  <appSettings>
    <!-- Sets the cleanup timer interval in minutes -->
    <add key="CleanupTimerInterval" value="60" />
    <!-- Sets the temp file expiration in minutes -->
    <add key="TempFileExpiration" value="60" />
  </appSettings>
</configuration>

================================================
FILE: OutlookFileDrag/DataObjectHelper.cs
================================================
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using log4net;

namespace OutlookFileDrag
{
    static class DataObjectHelper
    {
        private static ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        internal static int GetClipboardFormat(string name)
        {
            var format = System.Windows.Forms.DataFormats.GetFormat(name);
            if (format == null)
                return 0;
            else
                return format.Id;
        }

        internal static bool GetDataPresent(NativeMethods.IDataObject data, string formatName)
        {
            //Check if data is present
            log.DebugFormat("Get data present: {0}", formatName);
            FORMATETC format = new FORMATETC();
            format.cfFormat = (short)GetClipboardFormat(formatName);
            format.dwAspect = DVASPECT.DVASPECT_CONTENT;
            format.lindex = -1;
            format.ptd = IntPtr.Zero;
            format.tymed = TYMED.TYMED_ISTREAM | TYMED.TYMED_ISTORAGE | TYMED.TYMED_HGLOBAL;

            return data.QueryGetData(format) == NativeMethods.S_OK;
        }

        internal static void SetDropFiles(ref STGMEDIUM medium, string[] filenames)
        {
            //Create DROPFILES structure
            NativeMethods.DROPFILES dropFiles = new NativeMethods.DROPFILES();
            dropFiles.pFiles = Marshal.SizeOf(dropFiles);
            dropFiles.fWide = true;     //Unicode

            //Get null-separated list of filenames terminated with double null
            string filenameList = string.Join("\0", filenames) + "\0\0";
            byte[] filenameBytes = System.Text.Encoding.Unicode.GetBytes(filenameList);

            //Allocate global memory and get pointer
            int dataLength = Marshal.SizeOf(dropFiles) + filenameBytes.Length;
            IntPtr ptrDropFiles = Marshal.AllocHGlobal(dataLength);

            //Copy DROPFILES structure to global memory.
            Marshal.StructureToPtr(dropFiles, ptrDropFiles, true);

            //Copy filenames to memory after DROPFILES structure
            IntPtr ptrFiles = IntPtr.Add(ptrDropFiles, Marshal.SizeOf(dropFiles));
            Marshal.Copy(filenameBytes, 0, ptrFiles, filenameBytes.Length);
            
            //Load structure into medium
            medium.unionmember = ptrDropFiles;
            medium.tymed = TYMED.TYMED_HGLOBAL;
            medium.pUnkForRelease = IntPtr.Zero;        //HGLOBAL to be released by caller
        }

        internal static string[] GetFilenames(NativeMethods.IDataObject data)
        {
            log.Debug("Getfilenames");

            //Try Unicode first
            string[] filenames = GetFilenamesUnicode(data);

            //If Unicode returns null, try ANSI
            if (filenames == null)
                filenames = GetFilenamesAnsi(data);

            return filenames;
        }

        internal static string[] GetFilenamesAnsi(NativeMethods.IDataObject data)
        {
            log.Debug("Getting filenames (ANSI)");
            IntPtr ptrFgd = IntPtr.Zero;
            STGMEDIUM medium = new STGMEDIUM();

            try
            {
                //Define FileGroupDescriptor format
                FORMATETC format = new FORMATETC();
                format.cfFormat = (short)GetClipboardFormat("FileGroupDescriptor");
                format.dwAspect = DVASPECT.DVASPECT_CONTENT;
                format.lindex = -1;
                format.ptd = IntPtr.Zero;
                format.tymed = TYMED.TYMED_ISTREAM | TYMED.TYMED_ISTORAGE | TYMED.TYMED_HGLOBAL;

                //Query if format exists in data
                if (data.QueryGetData(format) != NativeMethods.S_OK)
                {
                    log.Debug("No filenames found");
                    return null;
                }

                //Get data into medium
                int retVal = data.GetData(format, out medium);
                if (retVal != NativeMethods.S_OK)
                    throw new Exception(string.Format("Could not get FileGroupDescriptor format.  Error returned: {0}", retVal));

                //Read medium into byte array
                log.Debug("Reading structure into memory stream");
                byte[] bytes;
                using (MemoryStream stream = new MemoryStream())
                {
                    DataObjectHelper.ReadMediumIntoStream(medium, stream);
                    bytes = new byte[stream.Length];
                    stream.Seek(0, SeekOrigin.Begin);
                    stream.Read(bytes, 0, bytes.Length);
                }

                //Copy byte array into unmanaged memory
                log.Debug("Copying structure into unmanaged memory");
                ptrFgd = Marshal.AllocHGlobal(bytes.Length);
                Marshal.Copy(bytes, 0, ptrFgd, bytes.Length);

                //Marshal unmanaged memory to a FILEGROUPDESCRIPTORA struct
                log.Debug("Marshaling unmanaged memory into FILEGROUPDESCRIPTORA struct");
                NativeMethods.FILEGROUPDESCRIPTORA fgd = (NativeMethods.FILEGROUPDESCRIPTORA)Marshal.PtrToStructure(ptrFgd, typeof(NativeMethods.FILEGROUPDESCRIPTORA));
                log.Debug(string.Format("Files found: {0}", fgd.cItems));

                //Create an array to store file names
                string[] filenames = new string[fgd.cItems];

                //Get the pointer to the first file descriptor
                IntPtr fdPtr = IntPtr.Add(ptrFgd, sizeof(uint));

                //Loop for the number of files acording to the file group descriptor
                for (int fdIndex = 0; fdIndex < fgd.cItems; fdIndex++)
                {
                    log.DebugFormat("Filenames found: {0}", string.Join(", ", filenames));

                    //Marshal pointer to a FILEDESCRIPTORA struct
                    NativeMethods.FILEDESCRIPTORA fd = (NativeMethods.FILEDESCRIPTORA)Marshal.PtrToStructure(fdPtr, typeof(NativeMethods.FILEDESCRIPTORA));

                    //Get filename of file descriptor and put in array
                    filenames[fdIndex] = fd.cFileName;

                    //Move the file descriptor pointer to the next file descriptor
                    fdPtr = IntPtr.Add(fdPtr, Marshal.SizeOf(fd));
                }

                log.DebugFormat("Filenames found: {0}", string.Join(", ", filenames));

                return filenames;

            }
            finally
            {
                //Release all unmanaged objects
                Marshal.FreeHGlobal(ptrFgd);
                if (medium.pUnkForRelease == null)
                    NativeMethods.ReleaseStgMedium(ref medium);
            }
        }

        internal static string[] GetFilenamesUnicode(NativeMethods.IDataObject data)
        {
            log.Debug("Getting filenames (Unicode)");
            IntPtr ptrFgd = IntPtr.Zero;
            STGMEDIUM medium = new STGMEDIUM();
            try
            {
                //Define FileGroupDescriptorW format
                FORMATETC format = new FORMATETC();
                format.cfFormat = (short)GetClipboardFormat("FileGroupDescriptorW");
                format.dwAspect = DVASPECT.DVASPECT_CONTENT;
                format.lindex = -1;
                format.ptd = IntPtr.Zero;
                format.tymed = TYMED.TYMED_ISTREAM | TYMED.TYMED_ISTORAGE | TYMED.TYMED_HGLOBAL;

                //Query if format exists in data
                if (data.QueryGetData(format) != NativeMethods.S_OK)
                {
                    log.Debug("No filenames found");
                    return null;
                }

                //Get data into medium
                int retVal = data.GetData(format, out medium);
                if (retVal != NativeMethods.S_OK)
                    throw new Exception(string.Format("Could not get FileGroupDescriptorW format.  Error returned: {0}", retVal));

                //Read medium into byte array
                log.Debug("Reading structure into memory stream");
                byte[] bytes;
                using (MemoryStream stream = new MemoryStream())
                {
                    DataObjectHelper.ReadMediumIntoStream(medium, stream);
                    bytes = new byte[stream.Length];
                    stream.Seek(0, SeekOrigin.Begin);
                    stream.Read(bytes, 0, bytes.Length);
                }
                
                //Copy byte array into unmanaged memory
                log.Debug("Copying structure into unmanaged memory");
                ptrFgd = Marshal.AllocHGlobal(bytes.Length);
                Marshal.Copy(bytes, 0, ptrFgd, bytes.Length);

                //Marshal unmanaged memory to a FILEGROUPDESCRIPTORW struct
                log.Debug("Marshaling unmanaged memory into FILEGROUPDESCRIPTORW struct");
                NativeMethods.FILEGROUPDESCRIPTORW fgd = (NativeMethods.FILEGROUPDESCRIPTORW)Marshal.PtrToStructure(ptrFgd, typeof(NativeMethods.FILEGROUPDESCRIPTORW));
                log.Debug(string.Format("Files found: {0}", fgd.cItems));

                //Create an array to store file names
                string[] filenames = new string[fgd.cItems];

                //Get the pointer to the first file descriptor
                IntPtr ptrFd = IntPtr.Add(ptrFgd, sizeof(uint));

                //Loop for the number of files acording to the file group descriptor
                for (int fdIndex = 0; fdIndex < fgd.cItems; fdIndex++)
                {
                    log.DebugFormat("Getting filename {0}", fdIndex);

                    //Marshal pointer to a FILEDESCRIPTORW struct
                    NativeMethods.FILEDESCRIPTORW fd = (NativeMethods.FILEDESCRIPTORW)Marshal.PtrToStructure(ptrFd, typeof(NativeMethods.FILEDESCRIPTORW));

                    //Get filename of file descriptor and put in array
                    filenames[fdIndex] = fd.cFileName;

                    //Move the file descriptor pointer to the next file descriptor
                    ptrFd = IntPtr.Add(ptrFd, Marshal.SizeOf(fd));
                }

                log.DebugFormat("Filenames found: {0}", string.Join(", ", filenames));
                return filenames;

            }
            finally
            {
                //Release all unmanaged objects
                Marshal.FreeHGlobal(ptrFgd);
                if (medium.pUnkForRelease == null)
                    NativeMethods.ReleaseStgMedium(ref medium);
            }
        }

        internal static void ReadFileContents(NativeMethods.IDataObject data, int index, Stream stream)
        {
            STGMEDIUM medium = new STGMEDIUM();            
            try
            {
                //Define FileContents format
                FORMATETC format = new FORMATETC();
                format.cfFormat = (short)GetClipboardFormat("FileContents");
                format.dwAspect = DVASPECT.DVASPECT_CONTENT;
                format.lindex = index;
                format.ptd = IntPtr.Zero;
                format.tymed = TYMED.TYMED_ISTREAM | TYMED.TYMED_ISTORAGE | TYMED.TYMED_HGLOBAL;

                //Get data
                int retVal = data.GetData(format, out medium);
                if (retVal != NativeMethods.S_OK)
                    throw new Exception(string.Format("Could not get FileContents format.  Error returned: {0}", retVal));

                //Read medium into stream
                ReadMediumIntoStream(medium, stream);
            }
            finally
            {
                //Release all unmanaged objects
                if (medium.pUnkForRelease == null)
                    NativeMethods.ReleaseStgMedium(ref medium);
            }
        }

        internal static void ReadMediumIntoStream(STGMEDIUM medium, Stream stream)
        {
            switch (medium.tymed)
            {
                case TYMED.TYMED_ISTREAM:
                    ReadIStreamIntoStream(medium.unionmember, stream);
                    break;
                case TYMED.TYMED_ISTORAGE:
                    ReadIStorageIntoStream(medium.unionmember, stream);
                    break;
                case TYMED.TYMED_HGLOBAL:
                    ReadHGlobalIntoStream(medium.unionmember, stream);
                    break;
                default:
                    throw new NotImplementedException(string.Format("Cannot read medium type {0}", medium.tymed));
            }
        }

        private static void ReadIStorageIntoStream(IntPtr handle, Stream stream)
        {
            //To handle a IStorage it needs to be written into a second unmanaged memory mapped storage 
            //and then the data can be read from memory into a managed byte and returned as a MemoryStream

            NativeMethods.ILockBytes iLockBytes = null;
            NativeMethods.IStorage iStorageNew = null;
            IntPtr ptrRead = IntPtr.Zero;
            try
            {
                //Marshal pointer to an IStorage object
                NativeMethods.IStorage iStorage = (NativeMethods.IStorage)Marshal.GetObjectForIUnknown(handle);

                //Create an ILockBytes object on a HGlobal, then create a IStorage object on top of the ILockBytes object
                iLockBytes = NativeMethods.CreateILockBytesOnHGlobal(IntPtr.Zero, true);
                iStorageNew = NativeMethods.StgCreateDocfileOnILockBytes(iLockBytes, 0x00001012, 0);

                //Copy the IStorage object into the new IStorage object
                iStorage.CopyTo(0, null, IntPtr.Zero, iStorageNew);
                iLockBytes.Flush();
                iStorageNew.Commit(0);

                //Get length of ILockBytes byte array
                System.Runtime.InteropServices.ComTypes.STATSTG stat = new System.Runtime.InteropServices.ComTypes.STATSTG();
                iLockBytes.Stat(out stat, 1);
                long length = stat.cbSize;

                //Read bytes into stream
                ptrRead = Marshal.AllocCoTaskMem(sizeof(int));
                byte[] buffer = new byte[4096];     //4 KB buffer
                int offset = 0;
                int bytesRead;
                while (true)
                {
                    iLockBytes.ReadAt(offset, buffer, buffer.Length, ptrRead);
                    bytesRead = Marshal.ReadInt32(ptrRead);
                    if (bytesRead == 0)
                        break;
                    stream.Write(buffer, 0, bytesRead);
                    offset += bytesRead;
                }
            }
            finally
            {
                //Release all unmanaged objects
                Marshal.FreeCoTaskMem(ptrRead);
                if (iStorageNew != null)
                    Marshal.ReleaseComObject(iStorageNew);
                if (iLockBytes != null)
                    Marshal.ReleaseComObject(iLockBytes);
            }
        }

        private static void ReadIStreamIntoStream(IntPtr handle, Stream stream)
        {
            IntPtr ptrRead = IntPtr.Zero;
            try
            {
                //Marshal pointer to an IStream object
                IStream iStream = (IStream)Marshal.GetObjectForIUnknown(handle);

                //Create pointer to integer that stores # of bytes read
                ptrRead = Marshal.AllocCoTaskMem(sizeof(int));

                //Copy IStream into managed stream in chunks
                byte[] buffer = new byte[4096];     //4 KB buffer
                int bytesRead;
                while (true)
                {
                    iStream.Read(buffer, buffer.Length, ptrRead);
                    bytesRead = Marshal.ReadInt32(ptrRead);
                    if (bytesRead == 0)
                        break;
                    else
                        stream.Write(buffer, 0, bytesRead);
                }
            }
            finally
            {
                //Release all unmanaged objects
                Marshal.FreeCoTaskMem(ptrRead);
            }

        }

        private static void ReadHGlobalIntoStream(IntPtr handle, Stream stream)
        {
            //Lock HGlobal so it cannot be moved or discarded
            IntPtr source = NativeMethods.GlobalLock(handle);

            if (source == IntPtr.Zero)
                throw new Exception(string.Format("Unable to lock hglobal {0}", source.ToString()));
            try
            {
                //Get size of HGlobal
                int length = NativeMethods.GlobalSize(handle);

                //Copy HGlobal into managed stream in chunks
                byte[] buffer = new byte[4096];     //4 KB buffer
                int bytesToCopy;
                for(int offset = 0; offset < length; offset += buffer.Length)
                {
                    //Copy buffer length or remaining length, whichever is smaller
                    bytesToCopy = Math.Min(buffer.Length, length - offset);
                    Marshal.Copy(source, buffer, 0, bytesToCopy);
                    stream.Write(buffer, 0, bytesToCopy);
                }
            }
            finally
            {
                //Release all unmanaged objects
                NativeMethods.GlobalUnlock(handle);
            }
        }
    }
}


================================================
FILE: OutlookFileDrag/DragDropHook.cs
================================================
using System;
using EasyHook;
using log4net;

namespace OutlookFileDrag
{
    class DragDropHook : IDisposable
    {
        private static ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        private LocalHook hook;
        private bool disposed = false;
        private bool isHooked = false;

        public DragDropHook()
        {
            try
            {
                //Hook OLE drag and drop event
                log.Info("Creating hook for DoDragDrop method of ole32.dll");
                hook = EasyHook.LocalHook.Create(EasyHook.LocalHook.GetProcAddress("ole32.dll", "DoDragDrop"),
                    new NativeMethods.DragDropDelegate(DragDropHook.DoDragDropHook), null);
            }
            catch (Exception ex)
            {
                log.Error("Error creating hook", ex);
                throw;
            }
        }

        public bool IsHooked
        {
            get
            {
                return isHooked;
            }
        }

        public void Start()
        {
            try
            {
                if (isHooked)
                    return;

                log.Info("Starting hook");
                //Hook current (UI) thread
                hook.ThreadACL.SetInclusiveACL(new Int32[] { 0 });
                isHooked = true;
            }
            catch (Exception ex)
            {
                log.Error("Error starting hook", ex);
                throw;
            }
        }

        public void Stop()
        {
            try
            {
                if (!isHooked)
                    return;

                log.Info("Stopping hook");
                //Stop hooking all threads
                hook.ThreadACL.SetInclusiveACL(new Int32[] { });
                isHooked = false;
                log.Info("Stopped hook");
            }
            catch (Exception ex)
            {
                log.Error("Error stopping hook", ex);
                throw;
            }
        }

        public static int DoDragDropHook(NativeMethods.IDataObject pDataObj, IntPtr pDropSource, uint dwOKEffects, out uint pdwEffect)
        {
            try
            {
                log.Info("Drag started");
                if (!DataObjectHelper.GetDataPresent(pDataObj, "FileGroupDescriptorW") && !DataObjectHelper.GetDataPresent(pDataObj, "FileGroupDescriptor"))
                {
                    log.Info("No virtual files found -- continuing original drag");
                    return NativeMethods.DoDragDrop(pDataObj, pDropSource, dwOKEffects, out pdwEffect);
                }

                //Start new drag
                log.Info("Virtual files found -- starting new drag adding CF_HDROP format");
                log.InfoFormat("Files: {0}", string.Join(",", DataObjectHelper.GetFilenames(pDataObj)));

                OutlookDataObject newDataObj = new OutlookDataObject(pDataObj);
                int result = NativeMethods.DoDragDrop(newDataObj, pDropSource, dwOKEffects, out pdwEffect);

                //If files were dropped and drop effect was "move", then override to "copy" so original item is not deleted
                if (newDataObj.FilesDropped && pdwEffect == NativeMethods.DROPEFFECT_MOVE)
                    pdwEffect = NativeMethods.DROPEFFECT_COPY;

                //Get result
                log.InfoFormat("DoDragDrop effect: {0} result: {1}", pdwEffect, result);
                return result;
            }
            catch (Exception ex)
            {
                log.Warn("Dragging error", ex);
                pdwEffect = NativeMethods.DROPEFFECT_NONE;
                return NativeMethods.DRAGDROP_S_CANCEL;
            }
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposed)
                return;

            if (disposing)
            {
                hook.Dispose();
            }

            disposed = true;
        }
    }

}


================================================
FILE: OutlookFileDrag/FileUtility.cs
================================================
using System;
using System.IO;
using log4net;

namespace OutlookFileDrag
{
    static class FileUtility
    {
        private static ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        public static string GetTempPath()
        {
            log.Debug("Getting temp path");
            string path = Path.Combine(Path.GetTempPath(), "OutlookFileDrag", Guid.NewGuid().ToString());
            if (!System.IO.Directory.Exists(path))
                System.IO.Directory.CreateDirectory(path);
            log.DebugFormat("Temp path: {0}", path);
            return path;
        }

        public static void CleanupTempPath(int tempFileExpiration)
        {
            log.Debug("Cleaning up temp path");
            string path = Path.Combine(Path.GetTempPath(), "OutlookFileDrag");
            log.InfoFormat("Temp path: {0}", path);
            if (!System.IO.Directory.Exists(path))
            {
                log.Info("Temp path does not exist");
                return;
            }

            var dirInfo = new DirectoryInfo(path);
            foreach(DirectoryInfo subfolder in dirInfo.GetDirectories())
            {
                //If folder was created before expiration window, delete it
                if (subfolder.CreationTime < DateTime.Now.AddMinutes(tempFileExpiration))
                    try
                    {
                        log.InfoFormat("Deleting temp folder: {0}", subfolder.FullName);
                        subfolder.Delete(true);
                    }
                    catch
                    {
                        log.WarnFormat("Could not delete temp folder: {0}", subfolder.FullName);
                    }
            }
        }

        public static string GetUniqueFilename(string filename)
        {
            string filenameNoExt;
            string ext;

            //If filename is too long, truncate filename
            if (filename.Length >= NativeMethods.MAX_PATH)
            {
                ext = Path.GetExtension(filename);
                filename = filename.Substring(0, NativeMethods.MAX_PATH - ext.Length - 1) + ext;
            }
            
            //If file does not exist, use original filename
            if (!File.Exists(filename))
                return filename;

            //Try appending number to filename until unique filename is found
            filenameNoExt = Path.Combine(Path.GetDirectoryName(filename), Path.GetFileNameWithoutExtension(filename));
            ext = Path.GetExtension(filename);

            for (int index = 1; index < 1024; index++)
            {
                string newFilename = string.Format("{0} ({1}){2}", filenameNoExt, index, ext);

                //If new filename is too long, truncate new filename
                if (newFilename.Length > NativeMethods.MAX_PATH)
                {
                    newFilename = string.Format("{0} ({1}){2}", filenameNoExt.Substring(0, NativeMethods.MAX_PATH - ext.Length - 8), index, ext);
                }

                if (!File.Exists(newFilename))
                    return newFilename;
            }

            //If no unique filename could be found, throw exception
            throw new Exception(string.Format("Could not generate unique filename for file {0}", filename));
        }


    }
}


================================================
FILE: OutlookFileDrag/FormatEtcEnumerator.cs
================================================
using System.Runtime.InteropServices.ComTypes;

namespace OutlookFileDrag
{
    class FormatEtcEnumerator : IEnumFORMATETC 
    {
        private FORMATETC[] formats;
        private int index = 0;

        public FormatEtcEnumerator(FORMATETC[] formats)
        {
            this.formats = formats;
        }

        public void Clone(out IEnumFORMATETC newEnum)
        {
            //Create new enumerators
            newEnum = new FormatEtcEnumerator(formats);
        }

        public int Next(int celt, FORMATETC[] rgelt, int[] pceltFetched)
        {
            //Fetch number of requested formats
            int fetchCount = 0;
            for (int i = 0; i < celt; i++)
            {
                //If index is past end of formats, stop
                if (index > formats.Length - 1)
                    break;

                //Set format
                rgelt[i] = formats[index];
                fetchCount++;
                index++;
            }

            //Set number of formats fetched
            if (pceltFetched != null && pceltFetched.Length > 0)
                pceltFetched[0] = fetchCount;

            //Return S_OK if all requested formats were returned; otherwise, return S_FALSE
            return (fetchCount == celt ? NativeMethods.S_OK : NativeMethods.S_FALSE);
        }

        public int Reset()
        {
            //Set format index back to 0
            index = 0;
            return NativeMethods.S_OK;
        }

        public int Skip(int celt)
        {
            //Check if incremented index is past end of formats
            if (index + celt > formats.Length - 1)
                return NativeMethods.S_FALSE;
            else
            {
                //Increment index and return
                index += celt;
                return NativeMethods.S_OK;
            }
        }
    }
}


================================================
FILE: OutlookFileDrag/NativeMethods.cs
================================================
using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;

namespace OutlookFileDrag
{
    static class NativeMethods
    {
        public const int S_OK = 0;
        public const int S_FALSE = 1;

        public const short CF_TEXT = 1;
        public const short CF_UNICODETEXT = 13;
        public const short CF_HDROP = 15;

        public const int DATA_S_SAMEFORMATETC = 0x00040130;

        public const int DRAGDROP_S_DROP = 0x00040100;
        public const int DRAGDROP_S_CANCEL = 0x00040101;
        public const int DRAGDROP_S_USEDEFAULTCURSORS = 0x00040102;

        public const uint DROPEFFECT_NONE = 0;
        public const uint DROPEFFECT_COPY = 1;
        public const uint DROPEFFECT_MOVE = 2;
        public const uint DROPEFFECT_LINK = 4;
        public const uint DROPEFFECT_SCROLL = 0x80000000;

        public const int DV_E_LINDEX = unchecked((int)0x80040068);
        public const int DV_E_FORMATETC = unchecked((int)0x80040064);
        public const int DV_E_TYMED = unchecked((int)0x80040069);
        public const int DV_E_DVASPECT = unchecked((int)0x8004006B);

        public const int E_INVALIDARG = unchecked((int)0x80070057);
        public const int E_FAIL = unchecked((int)0x80004005);
        public const int E_NOTIMPL = unchecked((int)0x80004001);
        public const int E_OUTOFMEMORY = unchecked((int)0x8007000E);
        public const int E_UNSPEC = E_FAIL;
        public const int E_UNEXPECTED = unchecked((int)0x8000FFFF);

        public const int MAX_PATH = 260;

        [DllImport("ole32.dll")]
        public static extern int DoDragDrop(NativeMethods.IDataObject pDataObj, IntPtr pDropSource, uint dwOKEffects, out uint pdwEffect);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr GlobalLock(IntPtr handle);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern bool GlobalUnlock(IntPtr handle);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern int GlobalSize(IntPtr handle);

        [DllImport("ole32.dll", PreserveSig = false)]
        public static extern ILockBytes CreateILockBytesOnHGlobal(IntPtr hGlobal, bool fDeleteOnRelease);

        [DllImport("ole32.dll", CharSet = CharSet.Unicode, PreserveSig = false)]
        public static extern IStorage StgCreateDocfileOnILockBytes(ILockBytes plkbyt, uint grfMode, uint reserved);

        [DllImport("ole32.dll")]
        internal static extern void ReleaseStgMedium(ref STGMEDIUM medium);

        [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("0000000B-0000-0000-C000-000000000046")]
        public interface IStorage
        {
            [return: MarshalAs(UnmanagedType.Interface)]
            IStream CreateStream([In, MarshalAs(UnmanagedType.BStr)] string pwcsName, [In, MarshalAs(UnmanagedType.U4)] int grfMode, [In, MarshalAs(UnmanagedType.U4)] int reserved1, [In, MarshalAs(UnmanagedType.U4)] int reserved2);
            [return: MarshalAs(UnmanagedType.Interface)]
            IStream OpenStream([In, MarshalAs(UnmanagedType.BStr)] string pwcsName, IntPtr reserved1, [In, MarshalAs(UnmanagedType.U4)] int grfMode, [In, MarshalAs(UnmanagedType.U4)] int reserved2);
            [return: MarshalAs(UnmanagedType.Interface)]
            IStorage CreateStorage([In, MarshalAs(UnmanagedType.BStr)] string pwcsName, [In, MarshalAs(UnmanagedType.U4)] int grfMode, [In, MarshalAs(UnmanagedType.U4)] int reserved1, [In, MarshalAs(UnmanagedType.U4)] int reserved2);
            [return: MarshalAs(UnmanagedType.Interface)]
            IStorage OpenStorage([In, MarshalAs(UnmanagedType.BStr)] string pwcsName, IntPtr pstgPriority, [In, MarshalAs(UnmanagedType.U4)] int grfMode, IntPtr snbExclude, [In, MarshalAs(UnmanagedType.U4)] int reserved);
            void CopyTo(int ciidExclude, [In, MarshalAs(UnmanagedType.LPArray)] Guid[] pIIDExclude, IntPtr snbExclude, [In, MarshalAs(UnmanagedType.Interface)] IStorage stgDest);
            void MoveElementTo([In, MarshalAs(UnmanagedType.BStr)] string pwcsName, [In, MarshalAs(UnmanagedType.Interface)] IStorage stgDest, [In, MarshalAs(UnmanagedType.BStr)] string pwcsNewName, [In, MarshalAs(UnmanagedType.U4)] int grfFlags);
            void Commit(int grfCommitFlags);
            void Revert();
            void EnumElements([In, MarshalAs(UnmanagedType.U4)] int reserved1, IntPtr reserved2, [In, MarshalAs(UnmanagedType.U4)] int reserved3, [MarshalAs(UnmanagedType.Interface)] out object ppVal);
            void DestroyElement([In, MarshalAs(UnmanagedType.BStr)] string pwcsName);
            void RenameElement([In, MarshalAs(UnmanagedType.BStr)] string pwcsOldName, [In, MarshalAs(UnmanagedType.BStr)] string pwcsNewName);
            void SetElementTimes([In, MarshalAs(UnmanagedType.BStr)] string pwcsName, [In] System.Runtime.InteropServices.ComTypes.FILETIME pctime, [In] System.Runtime.InteropServices.ComTypes.FILETIME patime, [In] System.Runtime.InteropServices.ComTypes.FILETIME pmtime);
            void SetClass([In] ref Guid clsid);
            void SetStateBits(int grfStateBits, int grfMask);
            void Stat([Out]out System.Runtime.InteropServices.ComTypes.STATSTG pStatStg, int grfStatFlag);
        }

        [ComImport, Guid("0000000A-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        public interface ILockBytes
        {
            void ReadAt([In, MarshalAs(UnmanagedType.U8)] long ulOffset, [Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] pv, [In, MarshalAs(UnmanagedType.U4)] int cb, IntPtr pcbRead);
            void WriteAt([In, MarshalAs(UnmanagedType.U8)] long ulOffset, IntPtr pv, [In, MarshalAs(UnmanagedType.U4)] int cb, [Out, MarshalAs(UnmanagedType.LPArray)] int[] pcbWritten);
            void Flush();
            void SetSize([In, MarshalAs(UnmanagedType.U8)] long cb);
            void LockRegion([In, MarshalAs(UnmanagedType.U8)] long libOffset, [In, MarshalAs(UnmanagedType.U8)] long cb, [In, MarshalAs(UnmanagedType.U4)] int dwLockType);
            void UnlockRegion([In, MarshalAs(UnmanagedType.U8)] long libOffset, [In, MarshalAs(UnmanagedType.U8)] long cb, [In, MarshalAs(UnmanagedType.U4)] int dwLockType);
            void Stat([Out]out System.Runtime.InteropServices.ComTypes.STATSTG pstatstg, [In, MarshalAs(UnmanagedType.U4)] int grfStatFlag);
        }

        [ComImport, Guid("0000010E-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IDataObject
        {
            [PreserveSig]
            int GetData([In] ref FORMATETC format, out STGMEDIUM medium);
            [PreserveSig]
            int GetDataHere([In] ref FORMATETC format, ref STGMEDIUM medium);
            [PreserveSig]
            int QueryGetData([In] ref FORMATETC format);
            [PreserveSig]
            int GetCanonicalFormatEtc([In] ref FORMATETC formatIn, out FORMATETC formatOut);
            [PreserveSig]
            int SetData([In] ref FORMATETC formatIn, [In] ref STGMEDIUM medium, [MarshalAs(UnmanagedType.Bool)] bool release);
            [PreserveSig]
            int EnumFormatEtc(DATADIR direction, out System.Runtime.InteropServices.ComTypes.IEnumFORMATETC ppenumFormatEtc);
            [PreserveSig]
            int DAdvise([In] ref FORMATETC pFormatetc, ADVF advf, IAdviseSink adviseSink, out int connection);
            [PreserveSig]
            int DUnadvise(int connection);
            [PreserveSig]
            int EnumDAdvise(out IEnumSTATDATA enumAdvise);
        }

        [ComImport, Guid("00000121-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IDropSource
        {
            [PreserveSig]
            int QueryContinueDrag([MarshalAs(UnmanagedType.Bool)] bool fEscapePressed, int grfKeyState);
            [PreserveSig]
            int GiveFeedback(int dwEffect);
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public sealed class FILEGROUPDESCRIPTORA
        {
            public uint cItems;
            //public FILEDESCRIPTORA[] fgd;
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public sealed class FILEDESCRIPTORA
        {
            public uint dwFlags;
            public Guid clsid;
            public SIZEL sizel;
            public POINTL pointl;
            public uint dwFileAttributes;
            public System.Runtime.InteropServices.ComTypes.FILETIME ftCreationTime;
            public System.Runtime.InteropServices.ComTypes.FILETIME ftLastAccessTime;
            public System.Runtime.InteropServices.ComTypes.FILETIME ftLastWriteTime;
            public uint nFileSizeHigh;
            public uint nFileSizeLow;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string cFileName;
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public sealed class FILEGROUPDESCRIPTORW
        {
            public uint cItems;
            //public FILEDESCRIPTORW[] fgd;
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public sealed class FILEDESCRIPTORW
        {
            public uint dwFlags;
            public Guid clsid;
            public SIZEL sizel;
            public POINTL pointl;
            public uint dwFileAttributes;
            public System.Runtime.InteropServices.ComTypes.FILETIME ftCreationTime;
            public System.Runtime.InteropServices.ComTypes.FILETIME ftLastAccessTime;
            public System.Runtime.InteropServices.ComTypes.FILETIME ftLastWriteTime;
            public uint nFileSizeHigh;
            public uint nFileSizeLow;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string cFileName;
        }

        [StructLayout(LayoutKind.Sequential)]
        public sealed class POINTL
        {
            public int x;
            public int y;
        }

        [StructLayout(LayoutKind.Sequential)]
        public sealed class SIZEL
        {
            public int cx;
            public int cy;
        }

        [StructLayout(LayoutKind.Sequential)]
        public sealed class DROPFILES
        {
            public int pFiles;
            public int X;
            public int Y;
            public bool fNC;
            public bool fWide;
        }
    
        [UnmanagedFunctionPointer(CallingConvention.StdCall, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.I4)]
        public delegate int DragDropDelegate(NativeMethods.IDataObject pDataObj, IntPtr pDropSource, uint dwOKEffects, out uint pdwEffect);

    }
}


================================================
FILE: OutlookFileDrag/OutlookDataObject.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using log4net;

namespace OutlookFileDrag
{
    //Class that wraps Outlook data object and adds support for CF_HDROP format
    class OutlookDataObject : NativeMethods.IDataObject, ICustomQueryInterface  
    {
        private NativeMethods.IDataObject innerData;
        private string[] tempFilenames;
        private static ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        public bool FilesDropped { get; private set; }

        public OutlookDataObject(NativeMethods.IDataObject innerData)
        {
            this.innerData = innerData;
        }

        public int EnumFormatEtc(DATADIR direction, out IEnumFORMATETC ppenumFormatEtc)
        {
            IEnumFORMATETC origEnum = null;
            try
            {
                log.DebugFormat("IDataObject.EnumFormatEtc called -- direction {0}", direction);
                switch (direction)
                {
                    case DATADIR.DATADIR_GET:
                        //Get original enumerator
                        int result = innerData.EnumFormatEtc(direction, out origEnum);
                        if (result != NativeMethods.S_OK)
                        {
                            ppenumFormatEtc = null;
                            return result;
                        }

                        //Enumerate original formats
                        List<FORMATETC> formats = new List<FORMATETC>();
                        FORMATETC[] buffer = new FORMATETC[] { new FORMATETC() };
                        while (origEnum.Next(1, buffer, null) == NativeMethods.S_OK)
                        {
                            //Convert format from short to unsigned short
                            ushort cfFormat = (ushort) buffer[0].cfFormat;

                            //Do not return text formats -- some applications try to get text before files
                            if (cfFormat != NativeMethods.CF_TEXT && cfFormat != NativeMethods.CF_UNICODETEXT && cfFormat != (ushort)DataObjectHelper.GetClipboardFormat("Csv"))
                                formats.Add(buffer[0]);
                        }

                        //Add CF_HDROP format
                        FORMATETC format = new FORMATETC();
                        format.cfFormat = NativeMethods.CF_HDROP;
                        format.dwAspect = DVASPECT.DVASPECT_CONTENT;
                        format.lindex = -1;
                        format.ptd = IntPtr.Zero;
                        format.tymed = TYMED.TYMED_HGLOBAL;
                        formats.Add(format);

                        //Return new enumerator for available formats
                        ppenumFormatEtc = new FormatEtcEnumerator(formats.ToArray());
                        return NativeMethods.S_OK;

                    case DATADIR.DATADIR_SET:
                        //Return original enumerator
                        return innerData.EnumFormatEtc(direction, out ppenumFormatEtc);
                    default:
                        //Invalid direction
                        ppenumFormatEtc = null;
                        return NativeMethods.E_INVALIDARG;
                }

            }
            catch (Exception ex)
            {
                log.Error("Exception in IDataObject.EnumFormatEtc", ex);
                ppenumFormatEtc = null;
                return NativeMethods.E_UNEXPECTED;
            }
            finally
            {
                //Release all unmanaged objects
                if (origEnum != null)
                    Marshal.ReleaseComObject(origEnum);
            }
        }

        public int GetCanonicalFormatEtc(ref FORMATETC formatIn, out FORMATETC formatOut)
        {
            try
            {
                log.DebugFormat("IDataObject.GetCanonicalFormatEtc called -- cfFormat {0} dwAspect {1} lindex {2} ptd {3} tymed {4}", formatIn.cfFormat, formatIn.dwAspect, formatIn.lindex, formatIn.ptd, formatIn.tymed);
                if (formatIn.cfFormat == NativeMethods.CF_HDROP)
                {
                    //Copy input format to output format
                    formatOut = new FORMATETC();
                    formatOut.cfFormat = formatIn.cfFormat;
                    formatOut.dwAspect = formatIn.dwAspect;
                    formatOut.lindex = formatIn.lindex;
                    formatOut.ptd = IntPtr.Zero;
                    formatOut.tymed = formatIn.tymed;
                    
                    return NativeMethods.DATA_S_SAMEFORMATETC;
                }
                else
                    return innerData.GetCanonicalFormatEtc(formatIn, out formatOut);
            }
            catch (Exception ex)
            {
                log.Error("Exception in IDataObject.GetCanonicalFormatEtc", ex);
                formatOut = new FORMATETC();
                return NativeMethods.E_UNEXPECTED;
            }
        }

        public int GetData(ref FORMATETC format, out STGMEDIUM medium)
        {
            try
            {
                //Get data into passed medium
                log.DebugFormat("IDataObject.GetData called -- cfFormat {0} dwAspect {1} lindex {2} ptd {3} tymed {4}", format.cfFormat, format.dwAspect, format.lindex, format.ptd, format.tymed);
                log.DebugFormat("Format name: {0}", System.Windows.Forms.DataFormats.GetFormat((ushort)format.cfFormat).Name);

                if (format.cfFormat == NativeMethods.CF_HDROP)
                {
                    medium = new STGMEDIUM();

                    //Validate index
                    if (format.lindex != -1)
                        return NativeMethods.DV_E_LINDEX;
                    //Validate medium type
                    if (!format.tymed.HasFlag(TYMED.TYMED_HGLOBAL))
                        return NativeMethods.DV_E_TYMED;
                    //Validate DV aspect
                    if (format.dwAspect != DVASPECT.DVASPECT_CONTENT)
                        return NativeMethods.DV_E_DVASPECT;

                    //Extract files if not already extracted
                    if (tempFilenames == null)
                        ExtractFiles();

                    //Get list of dropped files
                    log.Debug("Setting drop files");
                    DataObjectHelper.SetDropFiles(ref medium, tempFilenames);
                    FilesDropped = true;
                    return NativeMethods.S_OK;
                }
                else if (format.cfFormat == NativeMethods.CF_TEXT || format.cfFormat == NativeMethods.CF_UNICODETEXT || format.cfFormat == (ushort)DataObjectHelper.GetClipboardFormat("Csv"))
                {
                    //Do not return text formats -- some applications try to get text before files
                    medium = new STGMEDIUM();
                    return NativeMethods.DV_E_FORMATETC;
                }
                else
                {
                    int result =  innerData.GetData(format, out medium);
                    log.DebugFormat("Result: {0}", result);
                    return result;
                }

            }
            catch (Exception ex)
            {
                log.Error("Exception in IDataObject.GetData", ex);
                medium = new STGMEDIUM();
                return NativeMethods.E_UNEXPECTED;
            }
        }

        public int GetDataHere(ref FORMATETC format, ref STGMEDIUM medium)
        {
            log.DebugFormat("IDataObject.QueryGetData called -- cfFormat {0} dwAspect {1} lindex {2} ptd {3} tymed {4}", format.cfFormat, format.dwAspect, format.lindex, format.ptd, format.tymed);
            return NativeMethods.E_NOTIMPL;
        }

        public int QueryGetData(ref FORMATETC format)
        {
            try
            {
                log.DebugFormat("IDataObject.QueryGetData called -- cfFormat {0} dwAspect {1} lindex {2} ptd {3} tymed {4}", format.cfFormat, format.dwAspect, format.lindex, format.ptd, format.tymed);
                log.DebugFormat("Format name: {0}", System.Windows.Forms.DataFormats.GetFormat((ushort)format.cfFormat).Name);
                if (format.cfFormat == NativeMethods.CF_HDROP)
                {
                    //Validate index
                    if (format.lindex != -1)
                        return NativeMethods.DV_E_LINDEX;
                    //Validate medium type
                    if (!format.tymed.HasFlag(TYMED.TYMED_HGLOBAL))
                        return NativeMethods.DV_E_TYMED;
                    //Validate DV aspect
                    if (format.dwAspect != DVASPECT.DVASPECT_CONTENT)
                        return NativeMethods.DV_E_DVASPECT;

                    log.DebugFormat("IDataObject.QueryGetData result: {0}", NativeMethods.S_OK);
                    return NativeMethods.S_OK;
                }
                else if (format.cfFormat == NativeMethods.CF_TEXT || format.cfFormat == NativeMethods.CF_UNICODETEXT || format.cfFormat == (ushort)DataObjectHelper.GetClipboardFormat("Csv"))
                {
                    //Do not return text formats -- some applications try to get text before files
                    return NativeMethods.DV_E_FORMATETC;
                }
                else
                {
                    int result = innerData.QueryGetData(format);
                    log.DebugFormat("Result: {0}", result);
                    return result;
                }

            }
            catch (Exception ex)
            {
                log.Error("Exception in IDataObject.QueryGetData", ex);
                return NativeMethods.E_UNEXPECTED;
            }
        }

        public int SetData(ref FORMATETC formatIn, ref STGMEDIUM medium, bool release)
        {
            try
            {
                log.DebugFormat("IDataObject.SetData called -- cfFormat {0} dwAspect {1} lindex {2} ptd {3} tymed {4}", formatIn.cfFormat, formatIn.dwAspect, formatIn.lindex, formatIn.ptd, formatIn.tymed);
                log.DebugFormat("Format name: {0}", System.Windows.Forms.DataFormats.GetFormat((ushort)formatIn.cfFormat).Name);
                int result = innerData.SetData(formatIn, medium, release);
                log.DebugFormat("Result: {0}", result);
                return result;

            }
            catch (Exception ex)
            {
                log.Error("Exception in IDataObject.SetData", ex);
                return NativeMethods.E_UNEXPECTED;
            }
        }

        public int DAdvise(ref FORMATETC pFormatetc, ADVF advf, IAdviseSink adviseSink, out int connection)
        {
            return innerData.DAdvise(pFormatetc, advf, adviseSink, out connection);
        }

        public int DUnadvise(int connection)
        {
            return innerData.DUnadvise(connection);
        }

        public int EnumDAdvise(out IEnumSTATDATA enumAdvise)
        {
            return innerData.EnumDAdvise(out enumAdvise);
        }

        private void ExtractFiles()
        {
            //Get filenames being dragged
            log.Debug("Getting filenames");
            string[] filenames = DataObjectHelper.GetFilenames(this.innerData);
            log.DebugFormat("Filenames: {0}", string.Join(",", filenames));

            //Get temporary folder
            log.Debug("Creating temp folder");
            string tempPath = FileUtility.GetTempPath();
            log.DebugFormat("Temp folder: {0}", tempPath);

            //Save files to temporary directory
            tempFilenames = new string[filenames.Length];
            for (int fileIndex = 0; fileIndex < filenames.Length; fileIndex++)
            {
                tempFilenames[fileIndex] = FileUtility.GetUniqueFilename(Path.Combine(tempPath, filenames[fileIndex]));
                log.DebugFormat("Extracting file {0}", filenames[fileIndex]);
                using (FileStream fs = new FileStream(tempFilenames[fileIndex], FileMode.Create))
                {
                    DataObjectHelper.ReadFileContents(this.innerData, fileIndex, fs);
                }
            }
        }

        public CustomQueryInterfaceResult GetInterface(ref Guid iid, out IntPtr ppv)
        {
            ppv = IntPtr.Zero;
            try
            {
                log.DebugFormat("Get COM interface {0}", iid);

                //For IDataObject interface, use interface on this object
                if (iid == new Guid("0000010E-0000-0000-C000-000000000046"))
                {
                    log.DebugFormat("Interface handled");
                    return CustomQueryInterfaceResult.NotHandled;
                }

                else
                {
                    //For all other interfaces, use interface on original object
                    IntPtr pUnk = Marshal.GetIUnknownForObject(this.innerData);
                    int retVal = Marshal.QueryInterface(pUnk, ref iid, out ppv);
                    if (retVal == NativeMethods.S_OK)
                    {
                        log.DebugFormat("Interface handled by inner object");
                        return CustomQueryInterfaceResult.Handled;
                    }
                    else
                    {
                        log.DebugFormat("Interface not handled by inner object");
                        return CustomQueryInterfaceResult.Failed;
                    }
                }

            }
            catch (Exception ex)
            {
                log.Error("Exception in ICustomQueryInterface", ex);
                return CustomQueryInterfaceResult.Failed;
            }

        }
    }
}


================================================
FILE: OutlookFileDrag/OutlookDragSource.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using log4net;

namespace OutlookFileDrag
{
    class OutlookDragSource : NativeMethods.IDropSource, ICustomQueryInterface
    {
        private IntPtr innerData;
        private static ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        public OutlookDragSource(IntPtr innerData)
        {
            this.innerData = innerData;
        }


        public CustomQueryInterfaceResult GetInterface(ref Guid iid, out IntPtr ppv)
        {
            ppv = IntPtr.Zero;
            try
            {
                log.DebugFormat("Get COM interface {0}", iid);

                //For all other interfaces, use interface on original object
                //IntPtr pUnk = Marshal.GetIUnknownForObject(this.innerData);
                IntPtr pUnk = this.innerData;
                int retVal = Marshal.QueryInterface(pUnk, ref iid, out ppv);
                if (retVal == NativeMethods.S_OK)
                {
                    log.DebugFormat("Interface handled by inner object");
                    return CustomQueryInterfaceResult.Handled;
                }
                else
                {
                    log.DebugFormat("Interface not handled by inner object");
                    return CustomQueryInterfaceResult.Failed;
                }

            }
            catch (Exception ex)
            {
                log.Error("Exception in ICustomQueryInterface", ex);
                return CustomQueryInterfaceResult.Failed;
            }

        }

        public int QueryContinueDrag([MarshalAs(UnmanagedType.Bool)] bool fEscapePressed, int grfKeyState)
        {
            throw new NotImplementedException();
        }

        public int GiveFeedback(int dwEffect)
        {
            throw new NotImplementedException();
        }
    }
}


================================================
FILE: OutlookFileDrag/OutlookFileDrag.csproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <!--
    This section defines project-level properties.

    AssemblyName
      Name of the output assembly.
    Configuration
      Specifies a default value for debug.
    OutputType
      Must be "Library" for VSTO.
    Platform
      Specifies what CPU the output of this project can run on.
    NoStandardLibraries
      Set to "false" for VSTO.
    RootNamespace
      In C#, this specifies the namespace given to new files. In VB, all objects are
      wrapped in this namespace at runtime.
  -->
  <PropertyGroup>
    <ProjectTypeGuids>{BAA0C2D2-18E2-41B9-852F-F413020CAA33};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{88E6522A-C68B-42C8-8B5E-9C959BA6C415}</ProjectGuid>
    <OutputType>Library</OutputType>
    <NoStandardLibraries>false</NoStandardLibraries>
    <RootNamespace>OutlookFileDrag</RootNamespace>
    <AssemblyName>OutlookFileDrag</AssemblyName>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <DefineConstants>VSTO40</DefineConstants>
    <TargetFrameworkProfile />
    <BootstrapperEnabled>true</BootstrapperEnabled>
    <PublishUrl>publish\</PublishUrl>
    <InstallUrl />
    <TargetCulture>en</TargetCulture>
    <ApplicationVersion>1.0.0.0</ApplicationVersion>
    <AutoIncrementApplicationRevision>true</AutoIncrementApplicationRevision>
    <UpdateEnabled>true</UpdateEnabled>
    <UpdateInterval>7</UpdateInterval>
    <UpdateIntervalUnits>days</UpdateIntervalUnits>
    <IsWebBootstrapper>False</IsWebBootstrapper>
    <ProductName>OutlookFileDrag</ProductName>
    <PublisherName />
    <SupportUrl />
    <FriendlyName>OutlookFileDrag</FriendlyName>
    <OfficeApplicationDescription />
    <LoadBehavior>3</LoadBehavior>
  </PropertyGroup>
  <ItemGroup>
    <BootstrapperPackage Include=".NETFramework,Version=v4.0">
      <Visible>False</Visible>
      <ProductName>Microsoft .NET Framework 4 %28x86 and x64%29</ProductName>
      <Install>true</Install>
    </BootstrapperPackage>
    <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
      <Visible>False</Visible>
      <ProductName>.NET Framework 3.5 SP1</ProductName>
      <Install>false</Install>
    </BootstrapperPackage>
    <BootstrapperPackage Include="Microsoft.VSTORuntime.4.0">
      <Visible>False</Visible>
      <ProductName>Microsoft Visual Studio 2010 Tools for Office Runtime %28x86 and x64%29</ProductName>
      <Install>true</Install>
    </BootstrapperPackage>
    <BootstrapperPackage Include="Microsoft.Windows.Installer.4.5">
      <Visible>False</Visible>
      <ProductName>Windows Installer 4.5</ProductName>
      <Install>true</Install>
    </BootstrapperPackage>
  </ItemGroup>
  <PropertyGroup>
    <!--
      OfficeApplication
        Add-in host application
    -->
    <OfficeApplication>Outlook</OfficeApplication>
  </PropertyGroup>
  <!--
    This section defines properties that are set when the "Debug" configuration is selected.

    DebugSymbols
      If "true", create symbols (.pdb). If "false", do not create symbols.
    DefineConstants
      Constants defined for the preprocessor.
    EnableUnmanagedDebugging
      If "true", starting the debugger will attach both managed and unmanaged debuggers.
    Optimize
      If "true", optimize the build output. If "false", do not optimize.
    OutputPath
      Output path of project relative to the project file.
    WarningLevel
      Warning level for the compiler.
  -->
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
    <DefineConstants>$(DefineConstants);DEBUG;TRACE</DefineConstants>
    <WarningLevel>4</WarningLevel>
    <PlatformTarget>AnyCPU</PlatformTarget>
  </PropertyGroup>
  <!--
    This section defines properties that are set when the "Release" configuration is selected.

    DebugSymbols
      If "true", create symbols (.pdb). If "false", do not create symbols.
    DefineConstants
      Constants defined for the preprocessor.
    EnableUnmanagedDebugging
      If "true", starting the debugger will attach both managed and unmanaged debuggers.
    Optimize
      If "true", optimize the build output. If "false", do not optimize.
    OutputPath
      Output path of project relative to the project file.
    WarningLevel
      Warning level for the compiler.
  -->
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
    <DefineConstants>$(DefineConstants);TRACE</DefineConstants>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <!--
    This section specifies references for the project.
  -->
  <ItemGroup>
    <Reference Include="Accessibility" />
    <Reference Include="EasyHook, Version=2.7.6578.0, Culture=neutral, PublicKeyToken=4b580fca19d0b0c5, processorArchitecture=MSIL">
      <HintPath>..\packages\EasyHook.2.7.6578.1\lib\net40\EasyHook.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
      <HintPath>..\packages\log4net.2.0.8\lib\net40-full\log4net.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.ComponentModel.DataAnnotations" />
    <Reference Include="System.configuration" />
    <Reference Include="System.Data" />
    <Reference Include="System.Data.Entity" />
    <Reference Include="System.Drawing" />
    <Reference Include="System.Runtime.Remoting" />
    <Reference Include="System.Web.Extensions" />
    <Reference Include="System.Windows.Forms" />
    <Reference Include="System.Xml" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>
  <ItemGroup>
    <Reference Include="Microsoft.Office.Tools.v4.0.Framework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
    <Reference Include="Microsoft.VisualStudio.Tools.Applications.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
    <Reference Include="Microsoft.Office.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
    <Reference Include="Microsoft.Office.Tools.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
    <Reference Include="Microsoft.Office.Tools.Outlook, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
  </ItemGroup>
  <ItemGroup>
    <Reference Include="Microsoft.Office.Tools.Common.v4.0.Utilities, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <Private>True</Private>
    </Reference>
    <Reference Include="Microsoft.Office.Tools.Outlook.v4.0.Utilities, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <Private>True</Private>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Reference Include="Office, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c">
      <Private>False</Private>
      <EmbedInteropTypes>true</EmbedInteropTypes>
    </Reference>
    <Reference Include="Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c">
      <Private>False</Private>
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </Reference>
    <Reference Include="stdole, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
      <Private>False</Private>
    </Reference>
  </ItemGroup>
  <!--
    This section defines the user source files that are part of the project.
     
    A "Compile" element specifies a source file to compile.
    An "EmbeddedResource" element specifies an .resx file for embedded resources.
    A "None" element specifies a file that is not to be passed to the compiler (for instance, 
    a text file or XML file).
    The "AppDesigner" element specifies the directory where the application properties files
    can be found.
  -->
  <ItemGroup>
    <Compile Include="DragDropHook.cs" />
    <Compile Include="DataObjectHelper.cs" />
    <Compile Include="FileUtility.cs" />
    <Compile Include="FormatEtcEnumerator.cs" />
    <Compile Include="NativeMethods.cs" />
    <Compile Include="OutlookDataObject.cs" />
    <Compile Include="Properties\AssemblyInfo.cs">
      <SubType>Code</SubType>
    </Compile>
    <None Include="App.config">
      <SubType>Designer</SubType>
    </None>
    <None Include="OutlookFileDrag.pfx" />
    <None Include="packages.config">
      <SubType>Designer</SubType>
    </None>
    <Compile Include="ThisAddIn.cs">
      <SubType>Code</SubType>
    </Compile>
    <None Include="ThisAddIn.Designer.xml">
      <DependentUpon>ThisAddIn.cs</DependentUpon>
    </None>
    <Compile Include="ThisAddIn.Designer.cs">
      <DependentUpon>ThisAddIn.Designer.xml</DependentUpon>
    </Compile>
    <AppDesigner Include="Properties\" />
  </ItemGroup>
  <ItemGroup>
    <None Include="EasyHook32.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Include="EasyHook64.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
  <PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
  </PropertyGroup>
  <PropertyGroup>
    <SignManifests>true</SignManifests>
  </PropertyGroup>
  <PropertyGroup>
    <ManifestKeyFile>
    </ManifestKeyFile>
  </PropertyGroup>
  <PropertyGroup>
    <ManifestCertificateThumbprint>6EA39ECAD013020F956462F4CBF07570C217A1CF</ManifestCertificateThumbprint>
  </PropertyGroup>
  <!-- Include the build rules for a C# project. -->
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <!-- Include additional build rules for an Office application add-in. -->
  <Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
  <!-- This section defines VSTO properties that describe the host-changeable project properties. -->
  <ProjectExtensions>
    <VisualStudio>
      <FlavorProperties GUID="{BAA0C2D2-18E2-41B9-852F-F413020CAA33}">
        <ProjectProperties HostName="Outlook" HostPackage="{29A7B9D7-A7F1-4328-8EF0-6B2D1A56B2C1}" OfficeVersion="15.0" VstxVersion="4.0" ApplicationType="Outlook" Language="cs" TemplatesPath="" DebugInfoExeName="#Software\Microsoft\Office\16.0\Outlook\InstallRoot\Path#outlook.exe" AddItemTemplatesGuid="{A58A78EB-1C92-4DDD-80CF-E8BD872ABFC4}" />
        <Host Name="Outlook" GeneratedCodeNamespace="OutlookFileDrag" IconIndex="0">
          <HostItem Name="ThisAddIn" Code="ThisAddIn.cs" CanonicalName="AddIn" CanActivate="false" IconIndex="1" Blueprint="ThisAddIn.Designer.xml" GeneratedCode="ThisAddIn.Designer.cs" />
        </Host>
      </FlavorProperties>
    </VisualStudio>
  </ProjectExtensions>
</Project>

================================================
FILE: OutlookFileDrag/Properties/AssemblyInfo.cs
================================================
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Outlook File Drag")]
[assembly: AssemblyDescription("Drag and drop Outlook items and attachments as files into any application")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Tony Federer")]
[assembly: AssemblyProduct("Outlook File Drag")]
[assembly: AssemblyCopyright("Copyright © 2019-2020 Tony Federer")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 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 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("282559d2-06f7-407f-9007-89f9e6fa5aa4")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.11.0")]
[assembly: AssemblyFileVersion("1.0.11.0")]



================================================
FILE: OutlookFileDrag/ThisAddIn.Designer.cs
================================================
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

#pragma warning disable 414
namespace OutlookFileDrag {
    
    
    /// 
    [Microsoft.VisualStudio.Tools.Applications.Runtime.StartupObjectAttribute(0)]
    [global::System.Security.Permissions.PermissionSetAttribute(global::System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
    public sealed partial class ThisAddIn : Microsoft.Office.Tools.Outlook.OutlookAddInBase {
        
        internal Microsoft.Office.Tools.CustomTaskPaneCollection CustomTaskPanes;
        
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
        private global::System.Object missing = global::System.Type.Missing;
        
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
        internal Microsoft.Office.Interop.Outlook.Application Application;
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
        public ThisAddIn(global::Microsoft.Office.Tools.Outlook.Factory factory, global::System.IServiceProvider serviceProvider) : 
                base(factory, serviceProvider, "AddIn", "ThisAddIn") {
            Globals.Factory = factory;
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
        protected override void Initialize() {
            base.Initialize();
            this.Application = this.GetHostItem<Microsoft.Office.Interop.Outlook.Application>(typeof(Microsoft.Office.Interop.Outlook.Application), "Application");
            Globals.ThisAddIn = this;
            global::System.Windows.Forms.Application.EnableVisualStyles();
            this.InitializeCachedData();
            this.InitializeControls();
            this.InitializeComponents();
            this.InitializeData();
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
        protected override void FinishInitialization() {
            this.InternalStartup();
            this.OnStartup();
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
        protected override void InitializeDataBindings() {
            this.BeginInitialization();
            this.BindToData();
            this.EndInitialization();
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
        private void InitializeCachedData() {
            if ((this.DataHost == null)) {
                return;
            }
            if (this.DataHost.IsCacheInitialized) {
                this.DataHost.FillCachedData(this);
            }
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
        private void InitializeData() {
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
        private void BindToData() {
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
        private void StartCaching(string MemberName) {
            this.DataHost.StartCaching(this, MemberName);
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
        private void StopCaching(string MemberName) {
            this.DataHost.StopCaching(this, MemberName);
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
        private bool IsCached(string MemberName) {
            return this.DataHost.IsCached(this, MemberName);
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
        private void BeginInitialization() {
            this.BeginInit();
            this.CustomTaskPanes.BeginInit();
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
        private void EndInitialization() {
            this.CustomTaskPanes.EndInit();
            this.EndInit();
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
        private void InitializeControls() {
            this.CustomTaskPanes = Globals.Factory.CreateCustomTaskPaneCollection(null, null, "CustomTaskPanes", "CustomTaskPanes", this);
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
        private void InitializeComponents() {
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
        private bool NeedsFill(string MemberName) {
            return this.DataHost.NeedsFill(this, MemberName);
        }
        
        /// 
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Never)]
        protected override void OnShutdown() {
            this.CustomTaskPanes.Dispose();
            base.OnShutdown();
        }
    }
    
    /// 
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
    internal sealed partial class Globals {
        
        /// 
        private Globals() {
        }
        
        private static ThisAddIn _ThisAddIn;
        
        private static global::Microsoft.Office.Tools.Outlook.Factory _factory;
        
        private static ThisRibbonCollection _ThisRibbonCollection;
        
        private static ThisFormRegionCollection _ThisFormRegionCollection;
        
        internal static ThisAddIn ThisAddIn {
            get {
                return _ThisAddIn;
            }
            set {
                if ((_ThisAddIn == null)) {
                    _ThisAddIn = value;
                }
                else {
                    throw new System.NotSupportedException();
                }
            }
        }
        
        internal static global::Microsoft.Office.Tools.Outlook.Factory Factory {
            get {
                return _factory;
            }
            set {
                if ((_factory == null)) {
                    _factory = value;
                }
                else {
                    throw new System.NotSupportedException();
                }
            }
        }
        
        internal static ThisRibbonCollection Ribbons {
            get {
                if ((_ThisRibbonCollection == null)) {
                    _ThisRibbonCollection = new ThisRibbonCollection(_factory.GetRibbonFactory());
                }
                return _ThisRibbonCollection;
            }
        }
        
        internal static ThisFormRegionCollection FormRegions {
            get {
                if ((_ThisFormRegionCollection == null)) {
                    _ThisFormRegionCollection = new ThisFormRegionCollection(Globals.ThisAddIn.GetFormRegions());
                }
                return _ThisFormRegionCollection;
            }
        }
    }
    
    /// 
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Tools.Office.ProgrammingModel.dll", "14.0.0.0")]
    internal sealed partial class ThisRibbonCollection : Microsoft.Office.Tools.Ribbon.RibbonCollectionBase {
        
        /// 
        internal ThisRibbonCollection(global::Microsoft.Office.Tools.Ribbon.RibbonFactory factory) : 
                base(factory) {
        }
        
        internal ThisRibbonCollection this[Microsoft.Office.Interop.Outlook.Inspector inspector] {
            get {
                return this.GetRibbonContextCollection<ThisRibbonCollection>(inspector);
            }
        }
        
        internal ThisRibbonCollection this[Microsoft.Office.Interop.Outlook.Explorer explorer] {
            get {
                return this.GetRibbonContextCollection<ThisRibbonCollection>(explorer);
            }
        }
    }
    
    /// 
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    internal sealed partial class ThisFormRegionCollection : Microsoft.Office.Tools.Outlook.FormRegionCollectionBase {
        
        /// 
        public ThisFormRegionCollection(System.Collections.Generic.IList<Microsoft.Office.Tools.Outlook.IFormRegion> list) : 
                base(list) {
        }
        
        internal WindowFormRegionCollection this[Microsoft.Office.Interop.Outlook.Explorer explorer] {
            get {
                return ((WindowFormRegionCollection)(Globals.ThisAddIn.GetFormRegions(explorer, typeof(WindowFormRegionCollection))));
            }
        }
        
        internal WindowFormRegionCollection this[Microsoft.Office.Interop.Outlook.Inspector inspector] {
            get {
                return ((WindowFormRegionCollection)(Globals.ThisAddIn.GetFormRegions(inspector, typeof(WindowFormRegionCollection))));
            }
        }
    }
    
    /// 
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    internal sealed partial class WindowFormRegionCollection : Microsoft.Office.Tools.Outlook.FormRegionCollectionBase {
        
        /// 
        public WindowFormRegionCollection(System.Collections.Generic.IList<Microsoft.Office.Tools.Outlook.IFormRegion> list) : 
                base(list) {
        }
    }
}


================================================
FILE: OutlookFileDrag/ThisAddIn.Designer.xml
================================================
<hostitem:hostItem hostitem:baseType="Microsoft.Office.Tools.Outlook.OutlookAddInBase" hostitem:namespace="OutlookDragAddin" hostitem:className="ThisAddIn" hostitem:identifier="ThisAddIn" hostitem:primaryCookie="AddIn" hostitem:master="true" hostitem:factoryType="Microsoft.Office.Tools.Outlook.Factory" hostitem:startupIndex="0" xmlns:hostitem="http://schemas.microsoft.com/2004/VisualStudio/Tools/Applications/HostItem.xsd">
  <hostitem:hostObject hostitem:name="Application" hostitem:identifier="Application" hostitem:type="Microsoft.Office.Interop.Outlook.Application" hostitem:cookie="Application" hostitem:modifier="Internal" />
  <hostitem:hostControl hostitem:name="CustomTaskPanes" hostitem:identifier="CustomTaskPanes" hostitem:type="Microsoft.Office.Tools.CustomTaskPaneCollection" hostitem:primaryCookie="CustomTaskPanes" hostitem:modifier="Internal" />
</hostitem:hostItem>

================================================
FILE: OutlookFileDrag/ThisAddIn.cs
================================================
using System;
using System.Reflection;
using log4net;

namespace OutlookFileDrag
{
    public partial class ThisAddIn
    {
        private static ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        private System.Threading.Timer cleanupTimer;
        private DragDropHook hook;

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            //Configure logging
            log4net.Config.XmlConfigurator.Configure();

            try
            {                
                log.Info("Add-in startup");

                //Log version, OS version, Outlook version, and language
                log.InfoFormat("Version: {0}", Assembly.GetExecutingAssembly().GetName().Version.ToString());
                log.InfoFormat("OS: {0} {1}", Environment.OSVersion, Environment.Is64BitOperatingSystem ? "x64" : "x86");
                log.InfoFormat("Outlook version: {0} {1}", this.Application.Version, Environment.Is64BitProcess ? "x64" : "x86");
                log.InfoFormat("Language: {0}", Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI));

                //Set up exception handlers
                System.Windows.Forms.Application.ThreadException += Application_ThreadException;
                AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

                //Start cleanup timer
                int cleanupTimerInterval = int.Parse(System.Configuration.ConfigurationManager.AppSettings["CleanupTimerInterval"]);
                log.InfoFormat("Starting cleanup timer -- run every {0} minutes", cleanupTimerInterval);
                cleanupTimer = new System.Threading.Timer(CleanupTimer_Callback, null, 0, cleanupTimerInterval * 60 * 1000);

                //Start hook;
                hook = new DragDropHook();
                hook.Start();
            }
            catch (Exception ex)
            {
                log.Fatal("Fatal error", ex);
                if (hook != null)
                    hook.Stop();
            }
        }

        private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            log.Fatal("Appdomain exception", (Exception)e.ExceptionObject);
        }

        private void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            log.Fatal("Application thread exception", e.Exception);
        }

        private void CleanupTimer_Callback(object state)
        {
            try
            {
                int tempFileExpiration = int.Parse(System.Configuration.ConfigurationManager.AppSettings["TempFileExpiration"]);
                log.InfoFormat("Cleaning up temp files older than {0} minutes", tempFileExpiration);
                FileUtility.CleanupTempPath(tempFileExpiration);
            }
            catch (Exception ex)
            {
                log.Error("Error cleaning up temp files", ex);
            }
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
            // Note: Outlook no longer raises this event. If you have code that 
            //    must run when Outlook shuts down, see http://go.microsoft.com/fwlink/?LinkId=506785

            try
            {
                log.Info("Add-in shutdown");
                if (hook != null)
                    hook.Stop();
            }
            catch (Exception ex)
            {
                log.Fatal("Fatal error", ex);
            }
        }

        #region VSTO generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }

        #endregion
    }
}


================================================
FILE: OutlookFileDrag/packages.config
================================================
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EasyHook" version="2.7.6578.1" targetFramework="net40" />
  <package id="log4net" version="2.0.8" targetFramework="net40" />
</packages>

================================================
FILE: OutlookFileDrag.sln
================================================

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OutlookFileDrag", "OutlookFileDrag\OutlookFileDrag.csproj", "{88E6522A-C68B-42C8-8B5E-9C959BA6C415}"
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "OutlookFileDragSetup_x64", "OutlookFileDragSetup_x64\OutlookFileDragSetup_x64.vdproj", "{B42086D0-8877-4CF2-B3FE-C19210CD683D}"
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "OutlookFileDragSetup", "OutlookFileDragSetup\OutlookFileDragSetup.vdproj", "{0EF72B7A-7619-4572-A1C1-B31938BC6954}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Documents", "Documents", "{7A072433-B080-41DB-A449-19F4B547610B}"
	ProjectSection(SolutionItems) = preProject
		LICENSE = LICENSE
		License.rtf = License.rtf
		Readme.md = Readme.md
	EndProjectSection
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		CD_ROM|Any CPU = CD_ROM|Any CPU
		Debug|Any CPU = Debug|Any CPU
		DVD-5|Any CPU = DVD-5|Any CPU
		Release|Any CPU = Release|Any CPU
		SingleImage|Any CPU = SingleImage|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{88E6522A-C68B-42C8-8B5E-9C959BA6C415}.CD_ROM|Any CPU.ActiveCfg = Release|Any CPU
		{88E6522A-C68B-42C8-8B5E-9C959BA6C415}.CD_ROM|Any CPU.Build.0 = Release|Any CPU
		{88E6522A-C68B-42C8-8B5E-9C959BA6C415}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{88E6522A-C68B-42C8-8B5E-9C959BA6C415}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{88E6522A-C68B-42C8-8B5E-9C959BA6C415}.DVD-5|Any CPU.ActiveCfg = Debug|Any CPU
		{88E6522A-C68B-42C8-8B5E-9C959BA6C415}.DVD-5|Any CPU.Build.0 = Debug|Any CPU
		{88E6522A-C68B-42C8-8B5E-9C959BA6C415}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{88E6522A-C68B-42C8-8B5E-9C959BA6C415}.Release|Any CPU.Build.0 = Release|Any CPU
		{88E6522A-C68B-42C8-8B5E-9C959BA6C415}.SingleImage|Any CPU.ActiveCfg = Release|Any CPU
		{88E6522A-C68B-42C8-8B5E-9C959BA6C415}.SingleImage|Any CPU.Build.0 = Release|Any CPU
		{B42086D0-8877-4CF2-B3FE-C19210CD683D}.CD_ROM|Any CPU.ActiveCfg = Release
		{B42086D0-8877-4CF2-B3FE-C19210CD683D}.CD_ROM|Any CPU.Build.0 = Release
		{B42086D0-8877-4CF2-B3FE-C19210CD683D}.Debug|Any CPU.ActiveCfg = Debug
		{B42086D0-8877-4CF2-B3FE-C19210CD683D}.Debug|Any CPU.Build.0 = Debug
		{B42086D0-8877-4CF2-B3FE-C19210CD683D}.DVD-5|Any CPU.ActiveCfg = Debug
		{B42086D0-8877-4CF2-B3FE-C19210CD683D}.DVD-5|Any CPU.Build.0 = Debug
		{B42086D0-8877-4CF2-B3FE-C19210CD683D}.Release|Any CPU.ActiveCfg = Release
		{B42086D0-8877-4CF2-B3FE-C19210CD683D}.Release|Any CPU.Build.0 = Release
		{B42086D0-8877-4CF2-B3FE-C19210CD683D}.SingleImage|Any CPU.ActiveCfg = Release
		{B42086D0-8877-4CF2-B3FE-C19210CD683D}.SingleImage|Any CPU.Build.0 = Release
		{0EF72B7A-7619-4572-A1C1-B31938BC6954}.CD_ROM|Any CPU.ActiveCfg = Release
		{0EF72B7A-7619-4572-A1C1-B31938BC6954}.CD_ROM|Any CPU.Build.0 = Release
		{0EF72B7A-7619-4572-A1C1-B31938BC6954}.Debug|Any CPU.ActiveCfg = Debug
		{0EF72B7A-7619-4572-A1C1-B31938BC6954}.Debug|Any CPU.Build.0 = Debug
		{0EF72B7A-7619-4572-A1C1-B31938BC6954}.DVD-5|Any CPU.ActiveCfg = Debug
		{0EF72B7A-7619-4572-A1C1-B31938BC6954}.DVD-5|Any CPU.Build.0 = Debug
		{0EF72B7A-7619-4572-A1C1-B31938BC6954}.Release|Any CPU.ActiveCfg = Release
		{0EF72B7A-7619-4572-A1C1-B31938BC6954}.Release|Any CPU.Build.0 = Release
		{0EF72B7A-7619-4572-A1C1-B31938BC6954}.SingleImage|Any CPU.ActiveCfg = Release
		{0EF72B7A-7619-4572-A1C1-B31938BC6954}.SingleImage|Any CPU.Build.0 = Release
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
EndGlobal


================================================
FILE: OutlookFileDragSetup/OutlookFileDragSetup.vdproj
================================================
"DeployProject"
{
"VSVersion" = "3:800"
"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
"IsWebType" = "8:FALSE"
"ProjectName" = "8:OutlookFileDragSetup"
"LanguageId" = "3:1033"
"CodePage" = "3:1252"
"UILanguageId" = "3:1033"
"SccProjectName" = "8:"
"SccLocalPath" = "8:"
"SccAuxPath" = "8:"
"SccProvider" = "8:"
    "Hierarchy"
    {
        "Entry"
        {
        "MsmKey" = "8:_0A93BF555B38467ABC9AFEBDA2D4ABCC"
        "OwnerKey" = "8:_UNDEFINED"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_12FE3AC54ED17E0AB1007324ABFD58D1"
        "OwnerKey" = "8:_C3161A936F4192497A0972C3EC781BF6"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_12FE3AC54ED17E0AB1007324ABFD58D1"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_133D4E0B8AD91071625356F7F9F22C66"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_15F0BD9071B5889215577FD20EC63766"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_3DBBABF7C43171A6F7B4D8D682699556"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "OwnerKey" = "8:_UNDEFINED"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_5575AAAA0CAC3763D8DCDDD642FBD25F"
        "OwnerKey" = "8:_9B3B11113C57483FCBDDB37CB3ED5F37"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_5575AAAA0CAC3763D8DCDDD642FBD25F"
        "OwnerKey" = "8:_3DBBABF7C43171A6F7B4D8D682699556"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_5575AAAA0CAC3763D8DCDDD642FBD25F"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_591351D571FEB540A92347F0F74B55CE"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_811077B889234B5E8D92FD9440B779AD"
        "OwnerKey" = "8:_UNDEFINED"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_9B3B11113C57483FCBDDB37CB3ED5F37"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_9B3B11113C57483FCBDDB37CB3ED5F37"
        "OwnerKey" = "8:_3DBBABF7C43171A6F7B4D8D682699556"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_9CE773A8FA4242D096608C6597B170E4"
        "OwnerKey" = "8:_UNDEFINED"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_BB365CE8FF8B85A3589349A35DAB0785"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_BB365CE8FF8B85A3589349A35DAB0785"
        "OwnerKey" = "8:_133D4E0B8AD91071625356F7F9F22C66"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_C3161A936F4192497A0972C3EC781BF6"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_CE28E7CBCA9C5EDB3BD3A2F1F2116DF9"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_E81182AD22C040558214805DBCE4ACCA"
        "OwnerKey" = "8:_UNDEFINED"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_CE28E7CBCA9C5EDB3BD3A2F1F2116DF9"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_15F0BD9071B5889215577FD20EC63766"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_C3161A936F4192497A0972C3EC781BF6"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_12FE3AC54ED17E0AB1007324ABFD58D1"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_133D4E0B8AD91071625356F7F9F22C66"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_3DBBABF7C43171A6F7B4D8D682699556"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_BB365CE8FF8B85A3589349A35DAB0785"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_9B3B11113C57483FCBDDB37CB3ED5F37"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_5575AAAA0CAC3763D8DCDDD642FBD25F"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_591351D571FEB540A92347F0F74B55CE"
        "MsmSig" = "8:_UNDEFINED"
        }
    }
    "Configurations"
    {
        "Debug"
        {
        "DisplayName" = "8:Debug"
        "IsDebugOnly" = "11:TRUE"
        "IsReleaseOnly" = "11:FALSE"
        "OutputFilename" = "8:Debug\\OutlookFileDragSetup.msi"
        "PackageFilesAs" = "3:2"
        "PackageFileSize" = "3:-2147483648"
        "CabType" = "3:1"
        "Compression" = "3:2"
        "SignOutput" = "11:FALSE"
        "CertificateFile" = "8:"
        "PrivateKeyFile" = "8:"
        "TimeStampServer" = "8:"
        "InstallerBootstrapper" = "3:2"
            "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
            {
            "Enabled" = "11:TRUE"
            "PromptEnabled" = "11:TRUE"
            "PrerequisitesLocation" = "2:1"
            "Url" = "8:"
            "ComponentsUrl" = "8:"
                "Items"
                {
                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.5"
                    {
                    "Name" = "8:Microsoft .NET Framework 4.5 (x86 and x64)"
                    "ProductCode" = "8:.NETFramework,Version=v4.5"
                    }
                }
            }
        }
        "Release"
        {
        "DisplayName" = "8:Release"
        "IsDebugOnly" = "11:FALSE"
        "IsReleaseOnly" = "11:TRUE"
        "OutputFilename" = "8:Release\\OutlookFileDragSetup.msi"
        "PackageFilesAs" = "3:2"
        "PackageFileSize" = "3:-2147483648"
        "CabType" = "3:1"
        "Compression" = "3:2"
        "SignOutput" = "11:FALSE"
        "CertificateFile" = "8:"
        "PrivateKeyFile" = "8:"
        "TimeStampServer" = "8:"
        "InstallerBootstrapper" = "3:2"
            "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
            {
            "Enabled" = "11:TRUE"
            "PromptEnabled" = "11:TRUE"
            "PrerequisitesLocation" = "2:1"
            "Url" = "8:"
            "ComponentsUrl" = "8:"
                "Items"
                {
                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.5"
                    {
                    "Name" = "8:Microsoft .NET Framework 4.5 (x86 and x64)"
                    "ProductCode" = "8:.NETFramework,Version=v4.5"
                    }
                }
            }
        }
    }
    "Deployable"
    {
        "CustomAction"
        {
        }
        "DefaultFeature"
        {
        "Name" = "8:DefaultFeature"
        "Title" = "8:"
        "Description" = "8:"
        }
        "ExternalPersistence"
        {
            "LaunchCondition"
            {
                "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_44641C1530CC419BA8B9920E58E9A08E"
                {
                "Name" = "8:.NET Framework"
                "Message" = "8:[VSDNETMSG]"
                "FrameworkVersion" = "8:.NETFramework,Version=v4.5"
                "AllowLaterVersions" = "11:FALSE"
                "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=395269"
                }
            }
        }
        "File"
        {
            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_0A93BF555B38467ABC9AFEBDA2D4ABCC"
            {
            "SourcePath" = "8:..\\OutlookFileDrag\\EasyHook32.dll"
            "TargetName" = "8:EasyHook32.dll"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:FALSE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_12FE3AC54ED17E0AB1007324ABFD58D1"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Tools.Applications.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_12FE3AC54ED17E0AB1007324ABFD58D1"
                    {
                    "Name" = "8:Microsoft.VisualStudio.Tools.Applications.Runtime.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:Microsoft.VisualStudio.Tools.Applications.Runtime.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_133D4E0B8AD91071625356F7F9F22C66"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:Microsoft.Office.Tools.Outlook.v4.0.Utilities, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_133D4E0B8AD91071625356F7F9F22C66"
                    {
                    "Name" = "8:Microsoft.Office.Tools.Outlook.v4.0.Utilities.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:Microsoft.Office.Tools.Outlook.v4.0.Utilities.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_15F0BD9071B5889215577FD20EC63766"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:EasyHook, Version=2.7.6578.0, Culture=neutral, PublicKeyToken=4b580fca19d0b0c5, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_15F0BD9071B5889215577FD20EC63766"
                    {
                    "Name" = "8:EasyHook.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:EasyHook.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3DBBABF7C43171A6F7B4D8D682699556"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:Microsoft.Office.Tools.Outlook, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_3DBBABF7C43171A6F7B4D8D682699556"
                    {
                    "Name" = "8:Microsoft.Office.Tools.Outlook.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:Microsoft.Office.Tools.Outlook.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5575AAAA0CAC3763D8DCDDD642FBD25F"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:Microsoft.Office.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_5575AAAA0CAC3763D8DCDDD642FBD25F"
                    {
                    "Name" = "8:Microsoft.Office.Tools.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:Microsoft.Office.Tools.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_591351D571FEB540A92347F0F74B55CE"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:stdole, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                "ScatterAssemblies"
                {
                    "_591351D571FEB540A92347F0F74B55CE"
                    {
                    "Name" = "8:stdole.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:stdole.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_811077B889234B5E8D92FD9440B779AD"
            {
            "SourcePath" = "8:..\\License.rtf"
            "TargetName" = "8:License.rtf"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:FALSE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_9B3B11113C57483FCBDDB37CB3ED5F37"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:Microsoft.Office.Tools.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_9B3B11113C57483FCBDDB37CB3ED5F37"
                    {
                    "Name" = "8:Microsoft.Office.Tools.Common.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:Microsoft.Office.Tools.Common.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9CE773A8FA4242D096608C6597B170E4"
            {
            "SourcePath" = "8:..\\OutlookFileDrag\\bin\\Release\\OutlookFileDrag.dll.manifest"
            "TargetName" = "8:OutlookFileDrag.dll.manifest"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:FALSE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_BB365CE8FF8B85A3589349A35DAB0785"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:Microsoft.Office.Tools.Common.v4.0.Utilities, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_BB365CE8FF8B85A3589349A35DAB0785"
                    {
                    "Name" = "8:Microsoft.Office.Tools.Common.v4.0.Utilities.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:Microsoft.Office.Tools.Common.v4.0.Utilities.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C3161A936F4192497A0972C3EC781BF6"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:Microsoft.Office.Tools.v4.0.Framework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_C3161A936F4192497A0972C3EC781BF6"
                    {
                    "Name" = "8:Microsoft.Office.Tools.v4.0.Framework.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:Microsoft.Office.Tools.v4.0.Framework.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CE28E7CBCA9C5EDB3BD3A2F1F2116DF9"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_CE28E7CBCA9C5EDB3BD3A2F1F2116DF9"
                    {
                    "Name" = "8:log4net.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:log4net.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E81182AD22C040558214805DBCE4ACCA"
            {
            "SourcePath" = "8:..\\OutlookFileDrag\\bin\\Release\\OutlookFileDrag.vsto"
            "TargetName" = "8:OutlookFileDrag.vsto"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:FALSE"
            "IsolateTo" = "8:"
            }
        }
        "FileType"
        {
        }
        "Folder"
        {
            "{1525181F-901A-416C-8A58-119130FE478E}:_4C10008235FF4D1F8A1EC7E2473D78C3"
            {
            "Name" = "8:#1919"
            "AlwaysCreate" = "11:FALSE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Property" = "8:ProgramMenuFolder"
                "Folders"
                {
                }
            }
            "{3C67513D-01DD-4637-8A68-80971EB9504F}:_919F44B827474C528E0E9FF4CAE2B9AE"
            {
            "DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]"
            "Name" = "8:#1925"
            "AlwaysCreate" = "11:FALSE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Property" = "8:TARGETDIR"
                "Folders"
                {
                }
            }
            "{1525181F-901A-416C-8A58-119130FE478E}:_D44EFF1C326F4D2BADA2F7528B91CC01"
            {
            "Name" = "8:#1916"
            "AlwaysCreate" = "11:FALSE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Property" = "8:DesktopFolder"
                "Folders"
                {
                }
            }
        }
        "LaunchCondition"
        {
        }
        "Locator"
        {
        }
        "MsiBootstrapper"
        {
        "LangId" = "3:1033"
        "RequiresElevation" = "11:FALSE"
        }
        "Product"
        {
        "Name" = "8:Microsoft Visual Studio"
        "ProductName" = "8:Outlook File Drag"
        "ProductCode" = "8:{E1259659-073D-4042-AF4D-05AEDBA3C9C8}"
        "PackageCode" = "8:{82C3D368-32B5-488A-A19C-452F635E19FF}"
        "UpgradeCode" = "8:{2F626147-8F83-4FC1-9190-32AA4F25D487}"
        "AspNetVersion" = "8:4.0.30319.0"
        "RestartWWWService" = "11:FALSE"
        "RemovePreviousVersions" = "11:TRUE"
        "DetectNewerInstalledVersion" = "11:TRUE"
        "InstallAllUsers" = "11:TRUE"
        "ProductVersion" = "8:1.0.11"
        "Manufacturer" = "8:Tony Federer"
        "ARPHELPTELEPHONE" = "8:"
        "ARPHELPLINK" = "8:https://github.com/tonyfederer/OutlookFileDrag"
        "Title" = "8:Outlook File Drag Setup"
        "Subject" = "8:"
        "ARPCONTACT" = "8:Tony Federer"
        "Keywords" = "8:"
        "ARPCOMMENTS" = "8:Drag and drop Outlook items as files into any application"
        "ARPURLINFOABOUT" = "8:"
        "ARPPRODUCTICON" = "8:"
        "ARPIconIndex" = "3:0"
        "SearchPath" = "8:"
        "UseSystemSearchPath" = "11:TRUE"
        "TargetPlatform" = "3:0"
        "PreBuildEvent" = "8:"
        "PostBuildEvent" = "8:"
        "RunPostBuildEvent" = "3:0"
        }
        "Registry"
        {
            "HKLM"
            {
                "Keys"
                {
                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D4A904143A3D42869C1DE1D4F1A30D0E"
                    {
                    "Name" = "8:Software"
                    "Condition" = "8:"
                    "AlwaysCreate" = "11:FALSE"
                    "DeleteAtUninstall" = "11:FALSE"
                    "Transitive" = "11:FALSE"
                        "Keys"
                        {
                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_22D1BC2B78644122968D266BD453DE99"
                            {
                            "Name" = "8:WOW6432Node"
                            "Condition" = "8:"
                            "AlwaysCreate" = "11:FALSE"
                            "DeleteAtUninstall" = "11:FALSE"
                            "Transitive" = "11:FALSE"
                                "Keys"
                                {
                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8F27B43AF5DE476E9EE2AE86B3C2DF45"
                                    {
                                    "Name" = "8:Microsoft"
                                    "Condition" = "8:"
                                    "AlwaysCreate" = "11:FALSE"
                                    "DeleteAtUninstall" = "11:FALSE"
                                    "Transitive" = "11:FALSE"
                                        "Keys"
                                        {
                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_33EBC259BC9E4D39A94966448F31B769"
                                            {
                                            "Name" = "8:Office"
                                            "Condition" = "8:"
                                            "AlwaysCreate" = "11:FALSE"
                                            "DeleteAtUninstall" = "11:FALSE"
                                            "Transitive" = "11:FALSE"
                                                "Keys"
                                                {
                                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_4A6052B230644EAFA587141B09595C8C"
                                                    {
                                                    "Name" = "8:Outlook"
                                                    "Condition" = "8:"
                                                    "AlwaysCreate" = "11:FALSE"
                                                    "DeleteAtUninstall" = "11:FALSE"
                                                    "Transitive" = "11:FALSE"
                                                        "Keys"
                                                        {
                                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_C8B5751F82A44695AC627E9C50443F3C"
                                                            {
                                                            "Name" = "8:Addins"
                                                            "Condition" = "8:"
                                                            "AlwaysCreate" = "11:FALSE"
                                                            "DeleteAtUninstall" = "11:FALSE"
                                                            "Transitive" = "11:FALSE"
                                                                "Keys"
                                                                {
                                                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_FA680E6DBA8248D891731BA238E0099C"
                                                                    {
                                                                    "Name" = "8:OutlookFileDrag"
                                                                    "Condition" = "8:"
                                                                    "AlwaysCreate" = "11:FALSE"
                                                                    "DeleteAtUninstall" = "11:TRUE"
                                                                    "Transitive" = "11:FALSE"
                                                                        "Keys"
                                                                        {
                                                                        }
                                                                        "Values"
                                                                        {
                                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_4BB9A67E5DC4464588D3093EAA7D52D4"
                                                                            {
                                                                            "Name" = "8:Manifest"
                                                                            "Condition" = "8:"
                                                                            "Transitive" = "11:FALSE"
                                                                            "ValueTypes" = "3:1"
                                                                            "Value" = "8:file:///[TARGETDIR]OutlookFileDrag.vsto|vstolocal"
                                                                            }
                                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_602742F0760846239584275A35DA1AAB"
                                                                            {
                                                                            "Name" = "8:FriendlyName"
                                                                            "Condition" = "8:"
                                                                            "Transitive" = "11:FALSE"
                                                                            "ValueTypes" = "3:1"
                                                                            "Value" = "8:OutlookFileDrag"
                                                                            }
                                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_BDE554EC0FD5452B880DFE5E62B1F33B"
                                                                            {
                                                                            "Name" = "8:LoadBehavior"
                                                                            "Condition" = "8:"
                                                                            "Transitive" = "11:FALSE"
                                                                            "ValueTypes" = "3:3"
                                                                            "Value" = "3:3"
                                                                            }
                                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_CCB6882391414CACBFF9CA1E7D561491"
                                                                            {
                                                                            "Name" = "8:Description"
                                                                            "Condition" = "8:"
                                                                            "Transitive" = "11:FALSE"
                                                                            "ValueTypes" = "3:1"
                                                                            "Value" = "8:Drag Outlook items as files into any application"
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                                "Values"
                                                                {
                                                                }
                                                            }
                                                        }
                                                        "Values"
                                                        {
                                                        }
                                                    }
                                                }
                                                "Values"
                                                {
                                                }
                                            }
                                        }
                                        "Values"
                                        {
                                        }
                                    }
                                }
                                "Values"
                                {
                                }
                            }
                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_354F1B5F9F6E445BAE6A035E97CF0822"
                            {
                            "Name" = "8:Microsoft"
                            "Condition" = "8:"
                            "AlwaysCreate" = "11:FALSE"
                            "DeleteAtUninstall" = "11:FALSE"
                            "Transitive" = "11:FALSE"
                                "Keys"
                                {
                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_B3FBE7EA97A140C5B5B598854F9A0FAC"
                                    {
                                    "Name" = "8:Office"
                                    "Condition" = "8:"
                                    "AlwaysCreate" = "11:FALSE"
                                    "DeleteAtUninstall" = "11:FALSE"
                                    "Transitive" = "11:FALSE"
                                        "Keys"
                                        {
                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_B3827A07754641D9AD6ED474A07D3788"
                                            {
                                            "Name" = "8:Outlook"
                                            "Condition" = "8:"
                                            "AlwaysCreate" = "11:FALSE"
                                            "DeleteAtUninstall" = "11:FALSE"
                                            "Transitive" = "11:FALSE"
                                                "Keys"
                                                {
                                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_B153EB6F913F4E6B86EB8FA442B32E01"
                                                    {
                                                    "Name" = "8:Addins"
                                                    "Condition" = "8:"
                                                    "AlwaysCreate" = "11:FALSE"
                                                    "DeleteAtUninstall" = "11:FALSE"
                                                    "Transitive" = "11:FALSE"
                                                        "Keys"
                                                        {
                                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_CF568FCCF5F949B9BB57B58832FCC5E8"
                                                            {
                                                            "Name" = "8:OutlookFileDrag"
                                                            "Condition" = "8:"
                                                            "AlwaysCreate" = "11:FALSE"
                                                            "DeleteAtUninstall" = "11:TRUE"
                                                            "Transitive" = "11:FALSE"
                                                                "Keys"
                                                                {
                                                                }
                                                                "Values"
                                                                {
                                                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_0EC644502E3F48E4B628F34BDF6629EE"
                                                                    {
                                                                    "Name" = "8:Description"
                                                                    "Condition" = "8:"
                                                                    "Transitive" = "11:FALSE"
                                                                    "ValueTypes" = "3:1"
                                                                    "Value" = "8:Drag Outlook items as files into any application"
                                                                    }
                                                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_3D1BF5D39D24455DAA6C83039CAB218A"
                                                                    {
                                                                    "Name" = "8:LoadBehavior"
                                                                    "Condition" = "8:"
                                                                    "Transitive" = "11:FALSE"
                                                                    "ValueTypes" = "3:3"
                                                                    "Value" = "3:3"
                                                                    }
                                                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_C924643C1D0B486CBA80C7750F4A2F78"
                                                                    {
                                                                    "Name" = "8:FriendlyName"
                                                                    "Condition" = "8:"
                                                                    "Transitive" = "11:FALSE"
                                                                    "ValueTypes" = "3:1"
                                                                    "Value" = "8:Outlook File Drag"
                                                                    }
                                                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_FE433651CB1C4B27B454859B408DC466"
                                                                    {
                                                                    "Name" = "8:Manifest"
                                                                    "Condition" = "8:"
                                                                    "Transitive" = "11:FALSE"
                                                                    "ValueTypes" = "3:1"
                                                                    "Value" = "8:file:///[TARGETDIR]OutlookFileDrag.vsto|vstolocal"
                                                                    }
                                                                }
                                                            }
                                                        }
                                                        "Values"
                                                        {
                                                        }
                                                    }
                                                }
                                                "Values"
                                                {
                                                }
                                            }
                                        }
                                        "Values"
                                        {
                                        }
                                    }
                                }
                                "Values"
                                {
                                }
                            }
                        }
                        "Values"
                        {
                        }
                    }
                }
            }
            "HKCU"
            {
                "Keys"
                {
                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_6FAF1F902A2C40D480CF8007A399A463"
                    {
                    "Name" = "8:Software"
                    "Condition" = "8:"
                    "AlwaysCreate" = "11:FALSE"
                    "DeleteAtUninstall" = "11:FALSE"
                    "Transitive" = "11:FALSE"
                        "Keys"
                        {
                        }
                        "Values"
                        {
                        }
                    }
                }
            }
            "HKCR"
            {
                "Keys"
                {
                }
            }
            "HKU"
            {
                "Keys"
                {
                }
            }
            "HKPU"
            {
                "Keys"
                {
                }
            }
        }
        "Sequences"
        {
        }
        "Shortcut"
        {
        }
        "UserInterface"
        {
            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_2371DACEF6F94E98AF0C94614DF03E04"
            {
            "Name" = "8:#1900"
            "Sequence" = "3:1"
            "Attributes" = "3:1"
                "Dialogs"
                {
                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_26A83612205E4DBC81DBC76172D2C1F8"
                    {
                    "Sequence" = "3:100"
                    "DisplayName" = "8:Welcome"
                    "UseDynamicProperties" = "11:TRUE"
                    "IsDependency" = "11:FALSE"
                    "SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
                        "Properties"
                        {
                            "BannerBitmap"
                            {
                            "Name" = "8:BannerBitmap"
                            "DisplayName" = "8:#1001"
                            "Description" = "8:#1101"
                            "Type" = "3:8"
                            "ContextData" = "8:Bitmap"
                            "Attributes" = "3:4"
                            "Setting" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                            "CopyrightWarning"
                            {
                            "Name" = "8:CopyrightWarning"
                            "DisplayName" = "8:#1002"
                            "Description" = "8:#1102"
                            "Type" = "3:3"
                            "ContextData" = "8:"
                            "Attributes" = "3:0"
                            "Setting" = "3:2"
                            "Value" = "8:"
                            "DefaultValue" = "8:#1202"
                            "UsePlugInResources" = "11:TRUE"
                            }
                            "Welcome"
                            {
                            "Name" = "8:Welcome"
                            "DisplayName" = "8:#1003"
                            "Description" = "8:#1103"
                            "Type" = "3:3"
                            "ContextData" = "8:"
                            "Attributes" = "3:0"
                            "Setting" = "3:1"
                            "Value" = "8:#1203"
                            "DefaultValue" = "8:#1203"
                            "UsePlugInResources" = "11:TRUE"
                            }
                        }
                    }
                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_8F1EFA7475EA4E6F934BEA882EE7D273"
                    {
                    "Sequence" = "3:200"
                    "DisplayName" = "8:Installation Folder"
                    "UseDynamicProperties" = "11:TRUE"
                    "IsDependency" = "11:FALSE"
                    "SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
                        "Properties"
                        {
                            "BannerBitmap"
                            {
                            "Name" = "8:BannerBitmap"
                            "DisplayName" = "8:#1001"
                            "Description" = "8:#1101"
                            "Type" = "3:8"
                            "ContextData" = "8:Bitmap"
                            "Attributes" = "3:4"
                            "Setting" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                            "InstallAllUsersVisible"
                            {
                            "Name" = "8:InstallAllUsersVisible"
                            "DisplayName" = "8:#1059"
                            "Description" = "8:#1159"
                            "Type" = "3:5"
                            "ContextData" = "8:1;True=1;False=0"
                            "Attributes" = "3:0"
                            "Setting" = "3:0"
                            "Value" = "3:0"
                            "DefaultValue" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                        }
                    }
                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C619EF5B3A384CA2B73D88272FDCF4E6"
                    {
                    "Sequence" = "3:110"
                    "DisplayName" = "8:License Agreement"
                    "UseDynamicProperties" = "11:TRUE"
                    "IsDependency" = "11:FALSE"
                    "SourcePath" = "8:<VsdDialogDir>\\VsdLicenseDlg.wid"
                        "Properties"
                        {
                            "BannerBitmap"
                            {
                            "Name" = "8:BannerBitmap"
                            "DisplayName" = "8:#1001"
                            "Description" = "8:#1101"
                            "Type" = "3:8"
                            "ContextData" = "8:Bitmap"
                            "Attributes" = "3:4"
                            "Setting" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                            "EulaText"
                            {
                            "Name" = "8:EulaText"
                            "DisplayName" = "8:#1008"
                            "Description" = "8:#1108"
                            "Type" = "3:6"
                            "ContextData" = "8:"
                            "Attributes" = "3:0"
                            "Setting" = "3:2"
                            "Value" = "8:_811077B889234B5E8D92FD9440B779AD"
                            "UsePlugInResources" = "11:TRUE"
                            }
                            "Sunken"
                            {
                            "Name" = "8:Sunken"
                            "DisplayName" = "8:#1007"
                            "Description" = "8:#1107"
                            "Type" = "3:5"
                            "ContextData" = "8:4;True=4;False=0"
                            "Attributes" = "3:0"
                            "Setting" = "3:0"
                            "Value" = "3:4"
                            "DefaultValue" = "3:4"
                            "UsePlugInResources" = "11:TRUE"
                            }
                        }
                    }
                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F2099CB7BD9B4B7EA55AC883A3EF4D99"
                    {
                    "Sequence" = "3:300"
                    "DisplayName" = "8:Confirm Installation"
                    "UseDynamicProperties" = "11:TRUE"
                    "IsDependency" = "11:FALSE"
                    "SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
                        "Properties"
                        {
                            "BannerBitmap"
                            {
                            "Name" = "8:BannerBitmap"
                            "DisplayName" = "8:#1001"
                            "Description" = "8:#1101"
                            "Type" = "3:8"
                            "ContextData" = "8:Bitmap"
                            "Attributes" = "3:4"
                            "Setting" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                        }
                    }
                }
            }
            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_3640BE8DA10C43B08302EDBF1D242F02"
            {
            "Name" = "8:#1901"
            "Sequence" = "3:2"
            "Attributes" = "3:2"
                "Dialogs"
                {
                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_02CEF8D9F8474FFF8F7BC9850C702E5A"
                    {
                    "Sequence" = "3:100"
                    "DisplayName" = "8:Progress"
                    "UseDynamicProperties" = "11:TRUE"
                    "IsDependency" = "11:FALSE"
                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
                        "Properties"
                        {
                            "BannerBitmap"
                            {
                            "Name" = "8:BannerBitmap"
                            "DisplayName" = "8:#1001"
                            "Description" = "8:#1101"
                            "Type" = "3:8"
                            "ContextData" = "8:Bitmap"
                            "Attributes" = "3:4"
                            "Setting" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                            "ShowProgress"
                            {
                            "Name" = "8:ShowProgress"
                            "DisplayName" = "8:#1009"
                            "Description" = "8:#1109"
                            "Type" = "3:5"
                            "ContextData" = "8:1;True=1;False=0"
                            "Attributes" = "3:0"
                            "Setting" = "3:0"
                            "Value" = "3:1"
                            "DefaultValue" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                        }
                    }
                }
            }
            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_51AFB1E6343E4D1CBE228814E8E53FB7"
            {
            "Name" = "8:#1901"
            "Sequence" = "3:1"
            "Attributes" = "3:2"
                "Dialogs"
                {
                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C069CBE9F6354A4489912B7C2A93A0E7"
                    {
                    "Sequence" = "3:100"
                    "DisplayName" = "8:Progress"
                    "UseDynamicProperties" = "11:TRUE"
                    "IsDependency" = "11:FALSE"
                    "SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
                        "Properties"
                        {
                            "BannerBitmap"
                            {
                            "Name" = "8:BannerBitmap"
                            "DisplayName" = "8:#1001"
                            "Description" = "8:#1101"
                            "Type" = "3:8"
                            "ContextData" = "8:Bitmap"
                            "Attributes" = "3:4"
                            "Setting" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                            "ShowProgress"
                            {
                            "Name" = "8:ShowProgress"
                            "DisplayName" = "8:#1009"
                            "Description" = "8:#1109"
                            "Type" = "3:5"
                            "ContextData" = "8:1;True=1;False=0"
                            "Attributes" = "3:0"
                            "Setting" = "3:0"
                            "Value" = "3:1"
                            "DefaultValue" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                        }
                    }
                }
            }
            "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_6A78FCF2607F4ED4993C83C317BDF788"
            {
            "UseDynamicProperties" = "11:FALSE"
            "IsDependency" = "11:FALSE"
            "SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
            }
            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_73653059E18A46DBA5A094EB50F3F1EC"
            {
            "Name" = "8:#1900"
            "Sequence" = "3:2"
            "Attributes" = "3:1"
                "Dialogs"
                {
                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_6DAE5AFAE9644A67B0639F0C67E856E9"
                    {
                    "Sequence" = "3:300"
                    "DisplayName" = "8:Confirm Installation"
                    "UseDynamicProperties" = "11:TRUE"
                    "IsDependency" = "11:FALSE"
                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
                        "Properties"
                        {
                            "BannerBitmap"
                            {
                            "Name" = "8:BannerBitmap"
                            "DisplayName" = "8:#1001"
                            "Description" = "8:#1101"
                            "Type" = "3:8"
                            "ContextData" = "8:Bitmap"
                            "Attributes" = "3:4"
                            "Setting" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                        }
                    }
                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_B86FF87ADAFE4746BFC955ADC4623837"
                    {
                    "Sequence" = "3:110"
                    "DisplayName" = "8:License Agreement"
                    "UseDynamicProperties" = "11:TRUE"
                    "IsDependency" = "11:FALSE"
                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminLicenseDlg.wid"
                        "Properties"
                        {
                            "BannerBitmap"
                            {
                            "Name" = "8:BannerBitmap"
                            "DisplayName" = "8:#1001"
                            "Description" = "8:#1101"
                            "Type" = "3:8"
                            "ContextData" = "8:Bitmap"
                            "Attributes" = "3:4"
                            "Setting" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                            "EulaText"
                            {
                            "Name" = "8:EulaText"
                            "DisplayName" = "8:#1008"
                            "Description" = "8:#1108"
                            "Type" = "3:6"
                            "ContextData" = "8:"
                            "Attributes" = "3:0"
                            "Setting" = "3:2"
                            "Value" = "8:_811077B889234B5E8D92FD9440B779AD"
                            "UsePlugInResources" = "11:TRUE"
                            }
                            "Sunken"
                            {
                            "Name" = "8:Sunken"
                            "DisplayName" = "8:#1007"
                            "Description" = "8:#1107"
                            "Type" = "3:5"
                            "ContextData" = "8:4;True=4;False=0"
                            "Attributes" = "3:0"
                            "Setting" = "3:0"
                            "Value" = "3:4"
                            "DefaultValue" = "3:4"
                            "UsePlugInResources" = "11:TRUE"
                            }
                        }
                    }
                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C2BD515F58AE4374BDD15A00EA7FFF3D"
                    {
                    "Sequence" = "3:100"
                    "DisplayName" = "8:Welcome"
                    "UseDynamicProperties" = "11:TRUE"
                    "IsDependency" = "11:FALSE"
                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
                        "Properties"
                        {
                            "BannerBitmap"
                            {
                            "Name" = "8:BannerBitmap"
                            "DisplayName" = "8:#1001"
                            "Description" = "8:#1101"
                            "Type" = "3:8"
                            "ContextData" = "8:Bitmap"
                            "Attributes" = "3:4"
                            "Setting" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                            "CopyrightWarning"
                            {
                            "Name" = "8:CopyrightWarning"
                            "DisplayName" = "8:#1002"
                            "Description" = "8:#1102"
                            "Type" = "3:3"
                            "ContextData" = "8:"
                            "Attributes" = "3:0"
                            "Setting" = "3:1"
                            "Value" = "8:#1202"
                            "DefaultValue" = "8:#1202"
                            "UsePlugInResources" = "11:TRUE"
                            }
                            "Welcome"
                            {
                            "Name" = "8:Welcome"
                            "DisplayName" = "8:#1003"
                            "Description" = "8:#1103"
                            "Type" = "3:3"
                            "ContextData" = "8:"
                            "Attributes" = "3:0"
                            "Setting" = "3:1"
                            "Value" = "8:#1203"
                            "DefaultValue" = "8:#1203"
                            "UsePlugInResources" = "11:TRUE"
                            }
                        }
                    }
                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_FE7438441C294F67A9A2827BE22A936E"
                    {
                    "Sequence" = "3:200"
                    "DisplayName" = "8:Installation Folder"
                    "UseDynamicProperties" = "11:TRUE"
                    "IsDependency" = "11:FALSE"
                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
                        "Properties"
                        {
                            "BannerBitmap"
                            {
                            "Name" = "8:BannerBitmap"
                            "DisplayName" = "8:#1001"
                            "Description" = "8:#1101"
                            "Type" = "3:8"
                            "ContextData" = "8:Bitmap"
                            "Attributes" = "3:4"
                            "Setting" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                        }
                    }
                }
            }
            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_9BD9D3D3A44C45D39936506919F27084"
            {
            "Name" = "8:#1902"
            "Sequence" = "3:1"
            "Attributes" = "3:3"
                "Dialogs"
                {
                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E9CDCE57CC8B40A2A6B4155953836767"
                    {
                    "Sequence" = "3:100"
                    "DisplayName" = "8:Finished"
                    "UseDynamicProperties" = "11:TRUE"
                    "IsDependency" = "11:FALSE"
                    "SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
                        "Properties"
                        {
                            "BannerBitmap"
                            {
                            "Name" = "8:BannerBitmap"
                            "DisplayName" = "8:#1001"
                            "Description" = "8:#1101"
                            "Type" = "3:8"
                            "ContextData" = "8:Bitmap"
                            "Attributes" = "3:4"
                            "Setting" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                            "UpdateText"
                            {
                            "Name" = "8:UpdateText"
                            "DisplayName" = "8:#1058"
                            "Description" = "8:#1158"
                            "Type" = "3:15"
                            "ContextData" = "8:"
                            "Attributes" = "3:0"
                            "Setting" = "3:1"
                            "Value" = "8:#1258"
                            "DefaultValue" = "8:#1258"
                            "UsePlugInResources" = "11:TRUE"
                            }
                        }
                    }
                }
            }
            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_C001A743B84C4C898270AA9143A46C9F"
            {
            "Name" = "8:#1902"
            "Sequence" = "3:2"
            "Attributes" = "3:3"
                "Dialogs"
                {
                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_B8367B2F3AB14A32B53AC3C64C3815E3"
                    {
                    "Sequence" = "3:100"
                    "DisplayName" = "8:Finished"
                    "UseDynamicProperties" = "11:TRUE"
                    "IsDependency" = "11:FALSE"
                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
                        "Properties"
                        {
                            "BannerBitmap"
                            {
                            "Name" = "8:BannerBitmap"
                            "DisplayName" = "8:#1001"
                            "Description" = "8:#1101"
                            "Type" = "3:8"
                            "ContextData" = "8:Bitmap"
                            "Attributes" = "3:4"
                            "Setting" = "3:1"
                            "UsePlugInResources" = "11:TRUE"
                            }
                        }
                    }
                }
            }
            "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_C08686B031154BE19BFDEA8BAA2F4BF3"
            {
            "UseDynamicProperties" = "11:FALSE"
            "IsDependency" = "11:FALSE"
            "SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
            }
        }
        "MergeModule"
        {
        }
        "ProjectOutput"
        {
            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_54EF5F74A56C4AEE96D4330B540B4A3A"
            {
            "SourcePath" = "8:..\\OutlookFileDrag\\obj\\Debug\\OutlookFileDrag.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:FALSE"
            "IsolateTo" = "8:"
            "ProjectOutputGroupRegister" = "3:1"
            "OutputConfiguration" = "8:"
            "OutputGroupCanonicalName" = "8:Built"
            "OutputProjectGuid" = "8:{88E6522A-C68B-42C8-8B5E-9C959BA6C415}"
            "ShowKeyOutput" = "11:TRUE"
                "ExcludeFilters"
                {
                }
            }
            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_A2682E522C9745F7840F601359FBC055"
            {
            "SourcePath" = "8:"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:FALSE"
            "IsolateTo" = "8:"
            "ProjectOutputGroupRegister" = "3:1"
            "OutputConfiguration" = "8:"
            "OutputGroupCanonicalName" = "8:ContentFiles"
            "OutputProjectGuid" = "8:{88E6522A-C68B-42C8-8B5E-9C959BA6C415}"
            "ShowKeyOutput" = "11:TRUE"
                "ExcludeFilters"
                {
                }
            }
            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_F45C1AA6C44446A4BFB09062C1E0C83B"
            {
            "SourcePath" = "8:"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:FALSE"
            "IsolateTo" = "8:"
            "ProjectOutputGroupRegister" = "3:1"
            "OutputConfiguration" = "8:"
            "OutputGroupCanonicalName" = "8:Symbols"
            "OutputProjectGuid" = "8:{88E6522A-C68B-42C8-8B5E-9C959BA6C415}"
            "ShowKeyOutput" = "11:TRUE"
                "ExcludeFilters"
                {
                }
            }
        }
    }
}


================================================
FILE: OutlookFileDragSetup_x64/OutlookFileDragSetup_x64.vdproj
================================================
"DeployProject"
{
"VSVersion" = "3:800"
"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
"IsWebType" = "8:FALSE"
"ProjectName" = "8:OutlookFileDragSetup_x64"
"LanguageId" = "3:1033"
"CodePage" = "3:1252"
"UILanguageId" = "3:1033"
"SccProjectName" = "8:"
"SccLocalPath" = "8:"
"SccAuxPath" = "8:"
"SccProvider" = "8:"
    "Hierarchy"
    {
        "Entry"
        {
        "MsmKey" = "8:_12FE3AC54ED17E0AB1007324ABFD58D1"
        "OwnerKey" = "8:_C3161A936F4192497A0972C3EC781BF6"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_12FE3AC54ED17E0AB1007324ABFD58D1"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_133D4E0B8AD91071625356F7F9F22C66"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_15F0BD9071B5889215577FD20EC63766"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_3DBBABF7C43171A6F7B4D8D682699556"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "OwnerKey" = "8:_UNDEFINED"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_5575AAAA0CAC3763D8DCDDD642FBD25F"
        "OwnerKey" = "8:_9B3B11113C57483FCBDDB37CB3ED5F37"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_5575AAAA0CAC3763D8DCDDD642FBD25F"
        "OwnerKey" = "8:_3DBBABF7C43171A6F7B4D8D682699556"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_5575AAAA0CAC3763D8DCDDD642FBD25F"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_591351D571FEB540A92347F0F74B55CE"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_9B3B11113C57483FCBDDB37CB3ED5F37"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_9B3B11113C57483FCBDDB37CB3ED5F37"
        "OwnerKey" = "8:_3DBBABF7C43171A6F7B4D8D682699556"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_9CE773A8FA4242D096608C6597B170E4"
        "OwnerKey" = "8:_UNDEFINED"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_9F1635A8DEF84079B9675D027C0460A4"
        "OwnerKey" = "8:_UNDEFINED"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_BB365CE8FF8B85A3589349A35DAB0785"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_BB365CE8FF8B85A3589349A35DAB0785"
        "OwnerKey" = "8:_133D4E0B8AD91071625356F7F9F22C66"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_C3161A936F4192497A0972C3EC781BF6"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_CE28E7CBCA9C5EDB3BD3A2F1F2116DF9"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_DB2A43345F9440DD84405C790D1EDDA2"
        "OwnerKey" = "8:_UNDEFINED"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_E81182AD22C040558214805DBCE4ACCA"
        "OwnerKey" = "8:_UNDEFINED"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_FDD7226F564A40639B9655DB42455355"
        "OwnerKey" = "8:_UNDEFINED"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_54EF5F74A56C4AEE96D4330B540B4A3A"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_CE28E7CBCA9C5EDB3BD3A2F1F2116DF9"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_15F0BD9071B5889215577FD20EC63766"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_C3161A936F4192497A0972C3EC781BF6"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_12FE3AC54ED17E0AB1007324ABFD58D1"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_133D4E0B8AD91071625356F7F9F22C66"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_3DBBABF7C43171A6F7B4D8D682699556"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_BB365CE8FF8B85A3589349A35DAB0785"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_9B3B11113C57483FCBDDB37CB3ED5F37"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_5575AAAA0CAC3763D8DCDDD642FBD25F"
        "MsmSig" = "8:_UNDEFINED"
        }
        "Entry"
        {
        "MsmKey" = "8:_UNDEFINED"
        "OwnerKey" = "8:_591351D571FEB540A92347F0F74B55CE"
        "MsmSig" = "8:_UNDEFINED"
        }
    }
    "Configurations"
    {
        "Debug"
        {
        "DisplayName" = "8:Debug"
        "IsDebugOnly" = "11:TRUE"
        "IsReleaseOnly" = "11:FALSE"
        "OutputFilename" = "8:Debug\\OutlookFileDragSetup_x64.msi"
        "PackageFilesAs" = "3:2"
        "PackageFileSize" = "3:-2147483648"
        "CabType" = "3:1"
        "Compression" = "3:2"
        "SignOutput" = "11:FALSE"
        "CertificateFile" = "8:"
        "PrivateKeyFile" = "8:"
        "TimeStampServer" = "8:"
        "InstallerBootstrapper" = "3:2"
            "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
            {
            "Enabled" = "11:TRUE"
            "PromptEnabled" = "11:TRUE"
            "PrerequisitesLocation" = "2:1"
            "Url" = "8:"
            "ComponentsUrl" = "8:"
                "Items"
                {
                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.5"
                    {
                    "Name" = "8:Microsoft .NET Framework 4.5 (x86 and x64)"
                    "ProductCode" = "8:.NETFramework,Version=v4.5"
                    }
                }
            }
        }
        "Release"
        {
        "DisplayName" = "8:Release"
        "IsDebugOnly" = "11:FALSE"
        "IsReleaseOnly" = "11:TRUE"
        "OutputFilename" = "8:Release\\OutlookFileDragSetup_x64.msi"
        "PackageFilesAs" = "3:2"
        "PackageFileSize" = "3:-2147483648"
        "CabType" = "3:1"
        "Compression" = "3:2"
        "SignOutput" = "11:FALSE"
        "CertificateFile" = "8:"
        "PrivateKeyFile" = "8:"
        "TimeStampServer" = "8:"
        "InstallerBootstrapper" = "3:2"
            "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
            {
            "Enabled" = "11:TRUE"
            "PromptEnabled" = "11:TRUE"
            "PrerequisitesLocation" = "2:1"
            "Url" = "8:"
            "ComponentsUrl" = "8:"
                "Items"
                {
                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.5"
                    {
                    "Name" = "8:Microsoft .NET Framework 4.5 (x86 and x64)"
                    "ProductCode" = "8:.NETFramework,Version=v4.5"
                    }
                }
            }
        }
    }
    "Deployable"
    {
        "CustomAction"
        {
        }
        "DefaultFeature"
        {
        "Name" = "8:DefaultFeature"
        "Title" = "8:"
        "Description" = "8:"
        }
        "ExternalPersistence"
        {
            "LaunchCondition"
            {
                "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_44641C1530CC419BA8B9920E58E9A08E"
                {
                "Name" = "8:.NET Framework"
                "Message" = "8:[VSDNETMSG]"
                "FrameworkVersion" = "8:.NETFramework,Version=v4.5"
                "AllowLaterVersions" = "11:FALSE"
                "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=395269"
                }
            }
        }
        "File"
        {
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_12FE3AC54ED17E0AB1007324ABFD58D1"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:Microsoft.VisualStudio.Tools.Applications.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_12FE3AC54ED17E0AB1007324ABFD58D1"
                    {
                    "Name" = "8:Microsoft.VisualStudio.Tools.Applications.Runtime.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:Microsoft.VisualStudio.Tools.Applications.Runtime.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_133D4E0B8AD91071625356F7F9F22C66"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:Microsoft.Office.Tools.Outlook.v4.0.Utilities, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_133D4E0B8AD91071625356F7F9F22C66"
                    {
                    "Name" = "8:Microsoft.Office.Tools.Outlook.v4.0.Utilities.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:Microsoft.Office.Tools.Outlook.v4.0.Utilities.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_15F0BD9071B5889215577FD20EC63766"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:EasyHook, Version=2.7.6578.0, Culture=neutral, PublicKeyToken=4b580fca19d0b0c5, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_15F0BD9071B5889215577FD20EC63766"
                    {
                    "Name" = "8:EasyHook.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:EasyHook.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3DBBABF7C43171A6F7B4D8D682699556"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:Microsoft.Office.Tools.Outlook, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_3DBBABF7C43171A6F7B4D8D682699556"
                    {
                    "Name" = "8:Microsoft.Office.Tools.Outlook.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:Microsoft.Office.Tools.Outlook.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5575AAAA0CAC3763D8DCDDD642FBD25F"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:Microsoft.Office.Tools, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_5575AAAA0CAC3763D8DCDDD642FBD25F"
                    {
                    "Name" = "8:Microsoft.Office.Tools.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:Microsoft.Office.Tools.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_591351D571FEB540A92347F0F74B55CE"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:stdole, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                "ScatterAssemblies"
                {
                    "_591351D571FEB540A92347F0F74B55CE"
                    {
                    "Name" = "8:stdole.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:stdole.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_9B3B11113C57483FCBDDB37CB3ED5F37"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:Microsoft.Office.Tools.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_9B3B11113C57483FCBDDB37CB3ED5F37"
                    {
                    "Name" = "8:Microsoft.Office.Tools.Common.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:Microsoft.Office.Tools.Common.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9CE773A8FA4242D096608C6597B170E4"
            {
            "SourcePath" = "8:..\\OutlookFileDrag\\bin\\Release\\OutlookFileDrag.dll.manifest"
            "TargetName" = "8:OutlookFileDrag.dll.manifest"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:FALSE"
            "IsolateTo" = "8:"
            }
            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9F1635A8DEF84079B9675D027C0460A4"
            {
            "SourcePath" = "8:..\\License.rtf"
            "TargetName" = "8:License.rtf"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:FALSE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_BB365CE8FF8B85A3589349A35DAB0785"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:Microsoft.Office.Tools.Common.v4.0.Utilities, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_BB365CE8FF8B85A3589349A35DAB0785"
                    {
                    "Name" = "8:Microsoft.Office.Tools.Common.v4.0.Utilities.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:Microsoft.Office.Tools.Common.v4.0.Utilities.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C3161A936F4192497A0972C3EC781BF6"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:Microsoft.Office.Tools.v4.0.Framework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_C3161A936F4192497A0972C3EC781BF6"
                    {
                    "Name" = "8:Microsoft.Office.Tools.v4.0.Framework.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:Microsoft.Office.Tools.v4.0.Framework.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CE28E7CBCA9C5EDB3BD3A2F1F2116DF9"
            {
            "AssemblyRegister" = "3:1"
            "AssemblyIsInGAC" = "11:FALSE"
            "AssemblyAsmDisplayName" = "8:log4net, Version=2.0.8.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"
                "ScatterAssemblies"
                {
                    "_CE28E7CBCA9C5EDB3BD3A2F1F2116DF9"
                    {
                    "Name" = "8:log4net.dll"
                    "Attributes" = "3:512"
                    }
                }
            "SourcePath" = "8:log4net.dll"
            "TargetName" = "8:"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:TRUE"
            "IsolateTo" = "8:"
            }
            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DB2A43345F9440DD84405C790D1EDDA2"
            {
            "SourcePath" = "8:..\\OutlookFileDrag\\EasyHook64.dll"
            "TargetName" = "8:EasyHook64.dll"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:FALSE"
            "IsolateTo" = "8:"
            }
            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_E81182AD22C040558214805DBCE4ACCA"
            {
            "SourcePath" = "8:..\\OutlookFileDrag\\bin\\Release\\OutlookFileDrag.vsto"
            "TargetName" = "8:OutlookFileDrag.vsto"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:FALSE"
            "IsolateTo" = "8:"
            }
            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_FDD7226F564A40639B9655DB42455355"
            {
            "SourcePath" = "8:..\\OutlookFileDrag\\EasyHook32.dll"
            "TargetName" = "8:EasyHook32.dll"
            "Tag" = "8:"
            "Folder" = "8:_919F44B827474C528E0E9FF4CAE2B9AE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Vital" = "11:TRUE"
            "ReadOnly" = "11:FALSE"
            "Hidden" = "11:FALSE"
            "System" = "11:FALSE"
            "Permanent" = "11:FALSE"
            "SharedLegacy" = "11:FALSE"
            "PackageAs" = "3:1"
            "Register" = "3:1"
            "Exclude" = "11:FALSE"
            "IsDependency" = "11:FALSE"
            "IsolateTo" = "8:"
            }
        }
        "FileType"
        {
        }
        "Folder"
        {
            "{1525181F-901A-416C-8A58-119130FE478E}:_4C10008235FF4D1F8A1EC7E2473D78C3"
            {
            "Name" = "8:#1919"
            "AlwaysCreate" = "11:FALSE"
            "Condition" = "8:"
            "Transitive" = "11:FALSE"
            "Property" 
Download .txt
gitextract_r8lm3glj/

├── .gitignore
├── LICENSE
├── License.rtf
├── OutlookFileDrag/
│   ├── App.config
│   ├── DataObjectHelper.cs
│   ├── DragDropHook.cs
│   ├── FileUtility.cs
│   ├── FormatEtcEnumerator.cs
│   ├── NativeMethods.cs
│   ├── OutlookDataObject.cs
│   ├── OutlookDragSource.cs
│   ├── OutlookFileDrag.csproj
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── ThisAddIn.Designer.cs
│   ├── ThisAddIn.Designer.xml
│   ├── ThisAddIn.cs
│   └── packages.config
├── OutlookFileDrag.sln
├── OutlookFileDragSetup/
│   └── OutlookFileDragSetup.vdproj
├── OutlookFileDragSetup_x64/
│   └── OutlookFileDragSetup_x64.vdproj
├── Readme.md
└── _config.yml
Download .txt
SYMBOL INDEX (131 symbols across 9 files)

FILE: OutlookFileDrag/DataObjectHelper.cs
  class DataObjectHelper (line 9) | static class DataObjectHelper
    method GetClipboardFormat (line 13) | internal static int GetClipboardFormat(string name)
    method GetDataPresent (line 22) | internal static bool GetDataPresent(NativeMethods.IDataObject data, st...
    method SetDropFiles (line 36) | internal static void SetDropFiles(ref STGMEDIUM medium, string[] filen...
    method GetFilenames (line 64) | internal static string[] GetFilenames(NativeMethods.IDataObject data)
    method GetFilenamesAnsi (line 78) | internal static string[] GetFilenamesAnsi(NativeMethods.IDataObject data)
    method GetFilenamesUnicode (line 162) | internal static string[] GetFilenamesUnicode(NativeMethods.IDataObject...
    method ReadFileContents (line 244) | internal static void ReadFileContents(NativeMethods.IDataObject data, ...
    method ReadMediumIntoStream (line 273) | internal static void ReadMediumIntoStream(STGMEDIUM medium, Stream str...
    method ReadIStorageIntoStream (line 291) | private static void ReadIStorageIntoStream(IntPtr handle, Stream stream)
    method ReadIStreamIntoStream (line 344) | private static void ReadIStreamIntoStream(IntPtr handle, Stream stream)
    method ReadHGlobalIntoStream (line 376) | private static void ReadHGlobalIntoStream(IntPtr handle, Stream stream)

FILE: OutlookFileDrag/DragDropHook.cs
  class DragDropHook (line 7) | class DragDropHook : IDisposable
    method DragDropHook (line 14) | public DragDropHook()
    method Start (line 38) | public void Start()
    method Stop (line 57) | public void Stop()
    method DoDragDropHook (line 77) | public static int DoDragDropHook(NativeMethods.IDataObject pDataObj, I...
    method Dispose (line 111) | public void Dispose()
    method Dispose (line 117) | protected virtual void Dispose(bool disposing)

FILE: OutlookFileDrag/FileUtility.cs
  class FileUtility (line 7) | static class FileUtility
    method GetTempPath (line 11) | public static string GetTempPath()
    method CleanupTempPath (line 21) | public static void CleanupTempPath(int tempFileExpiration)
    method GetUniqueFilename (line 49) | public static string GetUniqueFilename(string filename)

FILE: OutlookFileDrag/FormatEtcEnumerator.cs
  class FormatEtcEnumerator (line 5) | class FormatEtcEnumerator : IEnumFORMATETC
    method FormatEtcEnumerator (line 10) | public FormatEtcEnumerator(FORMATETC[] formats)
    method Clone (line 15) | public void Clone(out IEnumFORMATETC newEnum)
    method Next (line 21) | public int Next(int celt, FORMATETC[] rgelt, int[] pceltFetched)
    method Reset (line 45) | public int Reset()
    method Skip (line 52) | public int Skip(int celt)

FILE: OutlookFileDrag/NativeMethods.cs
  class NativeMethods (line 7) | static class NativeMethods
    method DoDragDrop (line 42) | [DllImport("ole32.dll")]
    method GlobalLock (line 45) | [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    method GlobalUnlock (line 48) | [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    method GlobalSize (line 51) | [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    method CreateILockBytesOnHGlobal (line 54) | [DllImport("ole32.dll", PreserveSig = false)]
    method StgCreateDocfileOnILockBytes (line 57) | [DllImport("ole32.dll", CharSet = CharSet.Unicode, PreserveSig = false)]
    method ReleaseStgMedium (line 60) | [DllImport("ole32.dll")]
    type IStorage (line 63) | [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid(...
      method CreateStream (line 66) | [return: MarshalAs(UnmanagedType.Interface)]
      method OpenStream (line 68) | [return: MarshalAs(UnmanagedType.Interface)]
      method CreateStorage (line 70) | [return: MarshalAs(UnmanagedType.Interface)]
      method OpenStorage (line 72) | [return: MarshalAs(UnmanagedType.Interface)]
      method CopyTo (line 74) | void CopyTo(int ciidExclude, [In, MarshalAs(UnmanagedType.LPArray)] ...
      method MoveElementTo (line 75) | void MoveElementTo([In, MarshalAs(UnmanagedType.BStr)] string pwcsNa...
      method Commit (line 76) | void Commit(int grfCommitFlags);
      method Revert (line 77) | void Revert();
      method EnumElements (line 78) | void EnumElements([In, MarshalAs(UnmanagedType.U4)] int reserved1, I...
      method DestroyElement (line 79) | void DestroyElement([In, MarshalAs(UnmanagedType.BStr)] string pwcsN...
      method RenameElement (line 80) | void RenameElement([In, MarshalAs(UnmanagedType.BStr)] string pwcsOl...
      method SetElementTimes (line 81) | void SetElementTimes([In, MarshalAs(UnmanagedType.BStr)] string pwcs...
      method SetClass (line 82) | void SetClass([In] ref Guid clsid);
      method SetStateBits (line 83) | void SetStateBits(int grfStateBits, int grfMask);
      method Stat (line 84) | void Stat([Out]out System.Runtime.InteropServices.ComTypes.STATSTG p...
    type ILockBytes (line 87) | [ComImport, Guid("0000000A-0000-0000-C000-000000000046"), InterfaceTyp...
      method ReadAt (line 90) | void ReadAt([In, MarshalAs(UnmanagedType.U8)] long ulOffset, [Out, M...
      method WriteAt (line 91) | void WriteAt([In, MarshalAs(UnmanagedType.U8)] long ulOffset, IntPtr...
      method Flush (line 92) | void Flush();
      method SetSize (line 93) | void SetSize([In, MarshalAs(UnmanagedType.U8)] long cb);
      method LockRegion (line 94) | void LockRegion([In, MarshalAs(UnmanagedType.U8)] long libOffset, [I...
      method UnlockRegion (line 95) | void UnlockRegion([In, MarshalAs(UnmanagedType.U8)] long libOffset, ...
      method Stat (line 96) | void Stat([Out]out System.Runtime.InteropServices.ComTypes.STATSTG p...
    type IDataObject (line 99) | [ComImport, Guid("0000010E-0000-0000-C000-000000000046"), InterfaceTyp...
      method GetData (line 102) | [PreserveSig]
      method GetDataHere (line 104) | [PreserveSig]
      method QueryGetData (line 106) | [PreserveSig]
      method GetCanonicalFormatEtc (line 108) | [PreserveSig]
      method SetData (line 110) | [PreserveSig]
      method EnumFormatEtc (line 112) | [PreserveSig]
      method DAdvise (line 114) | [PreserveSig]
      method DUnadvise (line 116) | [PreserveSig]
      method EnumDAdvise (line 118) | [PreserveSig]
    type IDropSource (line 122) | [ComImport, Guid("00000121-0000-0000-C000-000000000046"), InterfaceTyp...
      method QueryContinueDrag (line 125) | [PreserveSig]
      method GiveFeedback (line 127) | [PreserveSig]
    class FILEGROUPDESCRIPTORA (line 131) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    class FILEDESCRIPTORA (line 138) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    class FILEGROUPDESCRIPTORW (line 155) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    class FILEDESCRIPTORW (line 162) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    class POINTL (line 179) | [StructLayout(LayoutKind.Sequential)]
    class SIZEL (line 186) | [StructLayout(LayoutKind.Sequential)]
    class DROPFILES (line 193) | [StructLayout(LayoutKind.Sequential)]

FILE: OutlookFileDrag/OutlookDataObject.cs
  class OutlookDataObject (line 11) | class OutlookDataObject : NativeMethods.IDataObject, ICustomQueryInterface
    method OutlookDataObject (line 19) | public OutlookDataObject(NativeMethods.IDataObject innerData)
    method EnumFormatEtc (line 24) | public int EnumFormatEtc(DATADIR direction, out IEnumFORMATETC ppenumF...
    method GetCanonicalFormatEtc (line 91) | public int GetCanonicalFormatEtc(ref FORMATETC formatIn, out FORMATETC...
    method GetData (line 119) | public int GetData(ref FORMATETC format, out STGMEDIUM medium)
    method GetDataHere (line 173) | public int GetDataHere(ref FORMATETC format, ref STGMEDIUM medium)
    method QueryGetData (line 179) | public int QueryGetData(ref FORMATETC format)
    method SetData (line 220) | public int SetData(ref FORMATETC formatIn, ref STGMEDIUM medium, bool ...
    method DAdvise (line 238) | public int DAdvise(ref FORMATETC pFormatetc, ADVF advf, IAdviseSink ad...
    method DUnadvise (line 243) | public int DUnadvise(int connection)
    method EnumDAdvise (line 248) | public int EnumDAdvise(out IEnumSTATDATA enumAdvise)
    method ExtractFiles (line 253) | private void ExtractFiles()
    method GetInterface (line 278) | public CustomQueryInterfaceResult GetInterface(ref Guid iid, out IntPt...

FILE: OutlookFileDrag/OutlookDragSource.cs
  class OutlookDragSource (line 10) | class OutlookDragSource : NativeMethods.IDropSource, ICustomQueryInterface
    method OutlookDragSource (line 15) | public OutlookDragSource(IntPtr innerData)
    method GetInterface (line 21) | public CustomQueryInterfaceResult GetInterface(ref Guid iid, out IntPt...
    method QueryContinueDrag (line 52) | public int QueryContinueDrag([MarshalAs(UnmanagedType.Bool)] bool fEsc...
    method GiveFeedback (line 57) | public int GiveFeedback(int dwEffect)

FILE: OutlookFileDrag/ThisAddIn.Designer.cs
  class ThisAddIn (line 16) | [Microsoft.VisualStudio.Tools.Applications.Runtime.StartupObjectAttribut...
    method ThisAddIn (line 29) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method Initialize (line 37) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method FinishInitialization (line 52) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method InitializeDataBindings (line 61) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method InitializeCachedData (line 71) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method InitializeData (line 84) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method BindToData (line 91) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method StartCaching (line 98) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method StopCaching (line 105) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method IsCached (line 112) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method BeginInitialization (line 119) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method EndInitialization (line 128) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method InitializeControls (line 137) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method InitializeComponents (line 145) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method NeedsFill (line 152) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method OnShutdown (line 159) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
  class Globals (line 169) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method Globals (line 174) | private Globals() {
  class ThisRibbonCollection (line 233) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method ThisRibbonCollection (line 238) | internal ThisRibbonCollection(global::Microsoft.Office.Tools.Ribbon.Ri...
  class ThisFormRegionCollection (line 256) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method ThisFormRegionCollection (line 260) | public ThisFormRegionCollection(System.Collections.Generic.IList<Micro...
  class WindowFormRegionCollection (line 278) | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    method WindowFormRegionCollection (line 282) | public WindowFormRegionCollection(System.Collections.Generic.IList<Mic...

FILE: OutlookFileDrag/ThisAddIn.cs
  class ThisAddIn (line 7) | public partial class ThisAddIn
    method ThisAddIn_Startup (line 13) | private void ThisAddIn_Startup(object sender, System.EventArgs e)
    method CurrentDomain_UnhandledException (line 49) | private void CurrentDomain_UnhandledException(object sender, Unhandled...
    method Application_ThreadException (line 54) | private void Application_ThreadException(object sender, System.Threadi...
    method CleanupTimer_Callback (line 59) | private void CleanupTimer_Callback(object state)
    method ThisAddIn_Shutdown (line 73) | private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    method InternalStartup (line 96) | private void InternalStartup()
Condensed preview — 22 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (271K chars).
[
  {
    "path": ".gitignore",
    "chars": 5808,
    "preview": "## Ignore Visual Studio temporary files, build results, and\r\n## files generated by popular Visual Studio add-ons.\r\n##\r\n#"
  },
  {
    "path": "LICENSE",
    "chars": 1076,
    "preview": "Copyright (c) 2018 Tony Federer \r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof thi"
  },
  {
    "path": "OutlookFileDrag/App.config",
    "chars": 1162,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<configuration>\r\n  <configSections>\r\n    <section name=\"log4net\" type=\"log4net."
  },
  {
    "path": "OutlookFileDrag/DataObjectHelper.cs",
    "chars": 17669,
    "preview": "using System;\r\nusing System.IO;\r\nusing System.Runtime.InteropServices;\r\nusing System.Runtime.InteropServices.ComTypes;\r"
  },
  {
    "path": "OutlookFileDrag/DragDropHook.cs",
    "chars": 4226,
    "preview": "using System;\r\nusing EasyHook;\r\nusing log4net;\r\n\r\nnamespace OutlookFileDrag\r\n{\r\n    class DragDropHook : IDisposable\r\n "
  },
  {
    "path": "OutlookFileDrag/FileUtility.cs",
    "chars": 3435,
    "preview": "using System;\r\nusing System.IO;\r\nusing log4net;\r\n\r\nnamespace OutlookFileDrag\r\n{\r\n    static class FileUtility\r\n    {\r\n "
  },
  {
    "path": "OutlookFileDrag/FormatEtcEnumerator.cs",
    "chars": 1923,
    "preview": "using System.Runtime.InteropServices.ComTypes;\r\n\r\nnamespace OutlookFileDrag\r\n{\r\n    class FormatEtcEnumerator : IEnumFO"
  },
  {
    "path": "OutlookFileDrag/NativeMethods.cs",
    "chars": 10946,
    "preview": "using System;\r\nusing System.Runtime.InteropServices;\r\nusing System.Runtime.InteropServices.ComTypes;\r\n\r\nnamespace Outlo"
  },
  {
    "path": "OutlookFileDrag/OutlookDataObject.cs",
    "chars": 14050,
    "preview": "using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.Runtime.InteropServices;\r\nusing System"
  },
  {
    "path": "OutlookFileDrag/OutlookDragSource.cs",
    "chars": 1980,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Runtime.InteropServices;\nusing System.Run"
  },
  {
    "path": "OutlookFileDrag/OutlookFileDrag.csproj",
    "chars": 12302,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micro"
  },
  {
    "path": "OutlookFileDrag/Properties/AssemblyInfo.cs",
    "chars": 1573,
    "preview": "using System.Reflection;\r\nusing System.Runtime.CompilerServices;\r\nusing System.Runtime.InteropServices;\r\nusing System.S"
  },
  {
    "path": "OutlookFileDrag/ThisAddIn.Designer.cs",
    "chars": 13513,
    "preview": "//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n//     This code"
  },
  {
    "path": "OutlookFileDrag/ThisAddIn.Designer.xml",
    "chars": 889,
    "preview": "<hostitem:hostItem hostitem:baseType=\"Microsoft.Office.Tools.Outlook.OutlookAddInBase\" hostitem:namespace=\"OutlookDragAd"
  },
  {
    "path": "OutlookFileDrag/ThisAddIn.cs",
    "chars": 4150,
    "preview": "using System;\r\nusing System.Reflection;\r\nusing log4net;\r\n\r\nnamespace OutlookFileDrag\r\n{\r\n    public partial class ThisA"
  },
  {
    "path": "OutlookFileDrag/packages.config",
    "chars": 206,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<packages>\r\n  <package id=\"EasyHook\" version=\"2.7.6578.1\" targetFramework=\"net4"
  },
  {
    "path": "OutlookFileDrag.sln",
    "chars": 3799,
    "preview": "\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 14\r\nVisualStudioVersion = 14.0.25420.1\r\n"
  },
  {
    "path": "OutlookFileDragSetup/OutlookFileDragSetup.vdproj",
    "chars": 72016,
    "preview": "\"DeployProject\"\r\n{\r\n\"VSVersion\" = \"3:800\"\r\n\"ProjectType\" = \"8:{978C614F-708E-4E1A-B201-565925725DBA}\"\r\n\"IsWebType\" = \"8"
  },
  {
    "path": "OutlookFileDragSetup_x64/OutlookFileDragSetup_x64.vdproj",
    "chars": 72995,
    "preview": "\"DeployProject\"\r\n{\r\n\"VSVersion\" = \"3:800\"\r\n\"ProjectType\" = \"8:{978C614F-708E-4E1A-B201-565925725DBA}\"\r\n\"IsWebType\" = \"8"
  },
  {
    "path": "Readme.md",
    "chars": 5110,
    "preview": "# Outlook File Drag\r\n\r\n*Drag and drop Outlook items as files into any application*\r\n\r\n## Read This First!\r\n\r\nMicrosoft "
  },
  {
    "path": "_config.yml",
    "chars": 26,
    "preview": "theme: jekyll-theme-cayman"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the tonyfederer/OutlookFileDrag GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 22 files (243.0 KB), approximately 59.1k tokens, and a symbol index with 131 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!