[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int DecompressMCX(object hComp,ref byte[] @in, uint @in_len, ref byte[] @out, ref uint out_len, bool eod);
public class XceedCompressor
{
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
byte[] OutRec = new byte[1024 * 100];
uint outlen;
DecompressMCX DecompressDelegate;
int b ;
unsafe int l;
public XceedCompressor()
{
IntPtr pDll = LoadLibrary(@"xceedzip.dll");
IntPtr pAddressOfFunctionToCall = GetProcAddress(pDll, "XcUncompress");
DecompressDelegate = (DecompressMCX)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, typeof(DecompressMCX));
}
public byte[] Decompress(byte[] InRecArr)
{
outlen = 0;
l = DecompressDelegate(b, ref InRecArr, (uint)InRecArr.Length, ref OutRec, ref outlen, true);
return OutRec;
}
}
This is my class where I want to perform decompression.
XceedCompressor xcd = new XceedCompressor ();
xcd.Decompress(some data already compressed with the same library);
But its giving error as "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
http://doc.xceedsoft.com/products/Xceedzip/Uncompress_method.html
is the function which I want to pinvoke. Hope for the best solution, as I always find here. Thanks in advance.
Any reason why you are not using Xceed's CSharp Lib or an alternative Zip library?
You should define your delegate as
public delegate int DecompressMCX(int hComp,IntPtr in, uint in_len, IntPtr out, ref uint out_len, bool eod);
When generating the in
IntPtr, it is important to fix it, so that the Garbage collector does not move the in data while the compression is running.