Lately I've been trying to implement some functionality which extracts files from an InfoPath XSN file (a .CAB archive). After extensive searching around the internet, it seems that there is no native .NET API for this. All current solutions are centered around large libraries i.e. managed C++ which wrap up Cabinet.dll.
All of this, sadly, falls foul of my companies "No third party libraries" policy.
As of 2.0, .NET gained an attribute called UnmanagedFunctionPointer which allows source level callback declarations using __cdecl. Prior to this, __stdcall was the only show in town, unless you didn't mind fudging the IL, a practice also outlawed here. I immediately knew this would allow the implementation of a fairly small C# wrapper for Cabinet.dll, but I couldn't find an example of one anywhere.
Does anyone know of a cleaner way than the below to do this with native code?
My current solution (executes unmanaged code, but fully working, Tested on 32/64-bit):
[StructLayout(LayoutKind.Sequential)]
public class CabinetInfo //Cabinet API: "FDCABINETINFO"
{
public int cbCabinet;
public short cFolders;
public short cFiles;
public short setID;
public short iCabinet;
public int fReserve;
public int hasprev;
public int hasnext;
}
public class CabExtract : IDisposable
{
//If any of these classes end up with a different size to its C equivilent, we end up with crash and burn.
[StructLayout(LayoutKind.Sequential)]
private class CabError //Cabinet API: "ERF"
{
public int erfOper;
public int erfType;
public int fError;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
private class FdiNotification //Cabinet API: "FDINOTIFICATION"
{
public int cb;
public string psz1;
public string psz2;
public string psz3;
public IntPtr userData;
public IntPtr hf;
public short date;
p