Я пытаюсь получить доступ к zip32.dll версии 3.0, когда мой код получил эту ошибку:
System.AccessViolationException: Attempted to read or write protected memory.
This is often an indication that other memory is corrupt.
at projectName.clsName.ZpArchive(ZCL& zcl, ZPOPT& zopts)
at projectName.clsName.functionName() in <location>:<line>
Вот что я сделал с кодом:
//ZCL Structures
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
protected struct ZCL
{
public int argc; /* Count of files to zip */
[MarshalAs(UnmanagedType.LPStr)]
public string fzname; /* name of archive to create/update */
public string[] zipnames; /* zip file name */
[MarshalAs(UnmanagedType.LPStr)]
public string fzlist; /* name of archive to create/update */
}
//ZPOPT Structures
[ StructLayout( LayoutKind.Sequential )]
protected struct ZPOPT
{
[MarshalAs(UnmanagedType.LPTStr)]
public string Date; // US Date (8 Bytes Long) "12/31/98"?
[MarshalAs(UnmanagedType.LPTStr)]
public string szRootDir; // Root Directory Pathname (Up To 256 Bytes Long)
[MarshalAs(UnmanagedType.LPTStr)]
public string szTempDir; // Temp Directory Pathname (Up To 256 Bytes Long)
public int fTemp; // 1 If Temp dir Wanted, Else 0
public int fSuffix; // Include Suffixes (Not Yet Implemented!)
public int fEncrypt; // 1 If Encryption Wanted, Else 0
public int fSystem; // 1 To Include System/Hidden Files, Else 0
public int fVolume; // 1 If Storing Volume Label, Else 0
public int fExtra; // 1 If Excluding Extra Attributes, Else 0
public int fNoDirEntries; // 1 If Ignoring Directory Entries, Else 0
public int fExcludeDate; // 1 If Excluding Files Earlier Than Specified Date, Else 0
public int fIncludeDate; // 1 If Including Files Earlier Than Specified Date, Else 0
public int fVerbose; // 1 If Full Messages Wanted, Else 0
public int fQuiet; // 1 If Minimum Messages Wanted, Else 0
public int fCRLF_LF; // 1 If Translate CR/LF To LF, Else 0
public int fLF_CRLF; // 1 If Translate LF To CR/LF, Else 0
public int fJunkDir; // 1 If Junking Directory Names, Else 0
public int fGrow; // 1 If Allow Appending To Zip File, Else 0
public int fForce; // 1 If Making Entries Using DOS File Names, Else 0
public int fMove; // 1 If Deleting Files Added Or Updated, Else 0
public int fDeleteEntries; // 1 If Files Passed Have To Be Deleted, Else 0
public int fUpdate; // 1 If Updating Zip File-Overwrite Only If Newer, Else 0
public int fFreshen; // 1 If Freshing Zip File-Overwrite Only, Else 0
public int fJunkSFX; // 1 If Junking SFX Prefix, Else 0
public int fLatestTime; // 1 If Setting Zip File Time To Time Of Latest File In Archive, Else 0
public int fComment; // 1 If Putting Comment In Zip File, Else 0
public int fOffsets; // 1 If Updating Archive Offsets For SFX Files, Else 0
public int fPrivilege; // 1 If Not Saving Privileges, Else 0
public int fEncryption; // Read Only Property!!!
public int fRecurse; // 1 (-r), 2 (-R) If Recursing Into Sub-Directories, Else 0
public int fRepair; // 1 = Fix Archive, 2 = Try Harder To Fix, Else 0
public byte flevel; // Compression Level - 0 = Stored 6 = Default 9 = Max
[MarshalAs(UnmanagedType.LPTStr)]
public string fSplitSize; //Null for no spliting size
//addition for ZCL
public int m_CountFile; //For total file on backup file.
}
//Import Dll:
[DllImport("zip32.dll", SetLastError=true)]
protected static extern int ZpArchive(ref ZCL zcl,ref ZPOPT zopts);
И вот функциякоторые вызывают ZpArchive:
//set the zip options
m_zopts = CreateZPOPTOptions();
ZCL zcl = new ZCL();
zcl.argc = m_CountFile; //Total file
zcl.fzname = m_ZipFileName;
zcl.zipnames = m_FilesToZip;
zcl.fzlist = null;
//zip the files
try
{
ret = ZpArchive(ref zcl,ref m_zopts);
}
catch(Exception e)
{
//<catch>
}
Исключение выдается, когда я пытаюсь вызвать функцию ZpArchive.Я использую Visual Studio 2010 с совместимостью для .Net 2.0. Любая идея / совет относительно этой проблемы?
Заранее спасибо :) -FDI
Обновление:
Вотструктура из исходного кода библиотеки:
typedef struct { /* zip options */
LPSTR Date; /* Date to include after */
LPSTR szRootDir; /* Directory to use as base for zipping */
LPSTR szTempDir; /* Temporary directory used during zipping */
BOOL fTemp; /* Use temporary directory '-b' during zipping */
BOOL fSuffix; /* include suffixes (not implemented) */
BOOL fEncrypt; /* encrypt files */
BOOL fSystem; /* include system and hidden files */
BOOL fVolume; /* Include volume label */
BOOL fExtra; /* Exclude extra attributes */
BOOL fNoDirEntries; /* Do not add directory entries */
BOOL fExcludeDate; /* Exclude files newer than specified date */
BOOL fIncludeDate; /* Include only files newer than specified date */
BOOL fVerbose; /* Mention oddities in zip file structure */
BOOL fQuiet; /* Quiet operation */
BOOL fCRLF_LF; /* Translate CR/LF to LF */
BOOL fLF_CRLF; /* Translate LF to CR/LF */
BOOL fJunkDir; /* Junk directory names */
BOOL fGrow; /* Allow appending to a zip file */
BOOL fForce; /* Make entries using DOS names (k for Katz) */
BOOL fMove; /* Delete files added or updated in zip file */
BOOL fDeleteEntries; /* Delete files from zip file */
BOOL fUpdate; /* Update zip file--overwrite only if newer */
BOOL fFreshen; /* Freshen zip file--overwrite only */
BOOL fJunkSFX; /* Junk SFX prefix */
BOOL fLatestTime; /* Set zip file time to time of latest file in it */
BOOL fComment; /* Put comment in zip file */
BOOL fOffsets; /* Update archive offsets for SFX files */
BOOL fPrivilege; /* Use privileges (WIN32 only) */
BOOL fEncryption; /* TRUE if encryption supported, else FALSE.
this is a read only flag */
LPSTR szSplitSize; /* This string contains the size that you want to
split the archive into. i.e. 100 for 100 bytes,
2K for 2 k bytes, where K is 1024, m for meg
and g for gig. If this string is not NULL it
will automatically be assumed that you wish to
split an archive. */
LPSTR szIncludeList; /* Pointer to include file list string (for VB) */
long IncludeListCount; /* Count of file names in the include list array */
char **IncludeList; /* Pointer to include file list array. Note that the last
entry in the array must be NULL */
LPSTR szExcludeList; /* Pointer to exclude file list (for VB) */
long ExcludeListCount; /* Count of file names in the include list array */
char **ExcludeList; /* Pointer to exclude file list array. Note that the last
entry in the array must be NULL */
int fRecurse; /* Recurse into subdirectories. 1 => -r, 2 => -R */
int fRepair; /* Repair archive. 1 => -F, 2 => -FF */
char fLevel; /* Compression level (0 - 9) */
} ZPOPT, _far *LPZPOPT;
typedef struct {
int argc; /* Count of files to zip */
LPSTR lpszZipFN; /* name of archive to create/update */
char **FNV; /* array of file names to zip up */
LPSTR lpszAltFNL; /* pointer to a string containing a list of file
names to zip up, separated by whitespace. Intended
for use only by VB users, all others should set this
to NULL. */
} ZCL, _far *LPZCL;
и объявление функции:
int EXPENTRY ZpArchive(ZCL C, LPZPOPT Opts);
на каком-то форуме было сказано, что это из-за неуправляемого кода.Я уже использую MarshalAs, но все еще не работает ..