本文整理汇总了C#中IStorage.EnumElements方法的典型用法代码示例。如果您正苦于以下问题:C# IStorage.EnumElements方法的具体用法?C# IStorage.EnumElements怎么用?C# IStorage.EnumElements使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IStorage
的用法示例。
在下文中一共展示了IStorage.EnumElements方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GetStreamFromPackage
private MemoryStream GetStreamFromPackage(IStorage storage, ExcelEncryption encryption)
{
MemoryStream ret=null;
comTypes.STATSTG statstg;
storage.Stat(out statstg, (uint)STATFLAG.STATFLAG_DEFAULT);
IEnumSTATSTG pIEnumStatStg = null;
storage.EnumElements(0, IntPtr.Zero, 0, out pIEnumStatStg);
comTypes.STATSTG[] regelt = { statstg };
uint fetched = 0;
uint res = pIEnumStatStg.Next(1, regelt, out fetched);
//if (regelt[0].pwcsName == "DataSpaces")
//{
// PrintStorage(storage, regelt[0],"");
//}
if (res == 0)
{
byte[] data;
EncryptionInfo encryptionInfo = null;
while (res != 1)
{
switch (statstg.pwcsName)
{
case "EncryptionInfo":
data = GetOleStream(storage, statstg);
//File.WriteAllBytes(@"c:\temp\EncInfo1.bin", data);
encryptionInfo = new EncryptionInfo();
encryptionInfo.ReadBinary(data);
encryption.Algorithm = encryptionInfo.Header.AlgID == AlgorithmID.AES128 ?
EncryptionAlgorithm.AES128 :
encryptionInfo.Header.AlgID == AlgorithmID.AES192 ?
EncryptionAlgorithm.AES192 :
EncryptionAlgorithm.AES256;
break;
case "EncryptedPackage":
data = GetOleStream(storage, statstg);
ret = DecryptDocument(data, encryptionInfo, encryption.Password);
break;
}
if ((res = pIEnumStatStg.Next(1, regelt, out fetched)) != 1)
{
statstg = regelt[0];
}
}
}
Marshal.ReleaseComObject(pIEnumStatStg);
return ret;
}
示例2: ReadParts
private MemoryStream ReadParts(IStorage storage, StoragePart storagePart)
{
MemoryStream ret = null;
comTypes.STATSTG statstg;
storage.Stat(out statstg, (uint)STATFLAG.STATFLAG_DEFAULT);
IEnumSTATSTG pIEnumStatStg = null;
storage.EnumElements(0, IntPtr.Zero, 0, out pIEnumStatStg);
comTypes.STATSTG[] regelt = { statstg };
uint fetched = 0;
uint res = pIEnumStatStg.Next(1, regelt, out fetched);
//if (regelt[0].pwcsName == "DataSpaces")
//{
// PrintStorage(storage, regelt[0],"");
//}
while (res != 1)
{
foreach (var item in regelt)
{
if (item.type == 1)
{
IStorage subStorage;
storage.OpenStorage(item.pwcsName, null, STGM.DIRECT | STGM.READ | STGM.SHARE_EXCLUSIVE, IntPtr.Zero, 0, out subStorage);
StoragePart subStoragePart=new StoragePart();
storagePart.SubStorage.Add(item.pwcsName, subStoragePart);
ReadParts(subStorage, subStoragePart);
}
else
{
storagePart.DataStreams.Add(item.pwcsName, GetOleStream(storage, item));
}
}
res = pIEnumStatStg.Next(1, regelt, out fetched);
}
Marshal.ReleaseComObject(pIEnumStatStg);
return ret;
}
示例3: ProcessPackage
static void ProcessPackage(IStorage pStg, string destinationFolder)
{
System.Runtime.InteropServices.ComTypes.IStream pStream;
IEnumSTATSTG pEnumStatStg;
uint numReturned;
pStg.EnumElements(0, IntPtr.Zero, 0, out pEnumStatStg);
System.Runtime.InteropServices.ComTypes.STATSTG[] ss = new System.Runtime.InteropServices.ComTypes.STATSTG[1];
// Loop through the STATSTG structures in the storage.
do
{
// Retrieve the STATSTG structure
pEnumStatStg.Next(1, ss, out numReturned);
if (numReturned != 0)
{
//System.Runtime.InteropServices.ComTypes.STATSTG statstm;
byte[] bytT = new byte[4];
// Check if the pwcsName contains "Ole10Native" stream which contain the actual embedded object
if (ss[0].pwcsName.Contains("Ole10Native") == true)
{
// Get the stream objectOpen the stream
pStg.OpenStream(ss[0].pwcsName, IntPtr.Zero, (uint)STGM.READ | (uint)STGM.SHARE_EXCLUSIVE, 0, out pStream);
//pStream.Stat(out statstm, (int) STATFLAG.STATFLAG_DEFAULT);
IntPtr position = IntPtr.Zero;
// File name starts from 7th Byte.
// Position the cursor to the 7th Byte.
pStream.Seek(6, 0, position);
IntPtr ulRead = new IntPtr();
char[] filename = new char[260];
int i;
// Read the File name of the embedded object
for (i = 0; i < 260; i++)
{
pStream.Read(bytT, 1, ulRead);
pStream.Seek(0, 1, position);
filename[i] = (char)bytT[0];
if (bytT[0] == 0)
{
break;
}
}
string path = new string(filename, 0, i);
// Next part is the source path of the embedded object.
// Length is unknown. Hence, loop through each byte to read the 0 terminated string
// Read the source path.
for (i = 0; i < 260; i++)
{
pStream.Read(bytT, 1, ulRead);
pStream.Seek(0, 1, position);
filename[i] = (char)bytT[0];
if (bytT[0] == 0)
{
break;
}
}
// Source File path
string fullpath = new string(filename, 0, i);
// Unknown 4 bytes
pStream.Seek(4, 1, position);
// Next 4 byte gives the length of the temporary file path
// (Office uses a temporary location to copy the files before inserting to the document)
// The length is in little endian format. Hence conversion is needed
pStream.Read(bytT, 4, ulRead);
ulong dwSize, dwTemp;
dwSize = 0;
dwTemp = (ulong)bytT[3];
dwSize += (ulong)(bytT[3] << 24);
dwSize += (ulong)(bytT[2] << 16);
dwSize += (ulong)(bytT[1] << 8);
dwSize += bytT[0];
// Skip the temporary file path
pStream.Seek((long)dwSize, 1, position);
// Next four bytes gives the size of the actual data in little endian format.
// Convert the format.
pStream.Read(bytT, 4, ulRead);
dwTemp = 0;
dwSize = 0;
dwTemp = (ulong)bytT[3];
dwSize += (ulong)(bytT[3] << 24);
dwSize += (ulong)(bytT[2] << 16);
dwSize += (ulong)(bytT[1] << 8);
dwSize += (ulong)bytT[0];
// Read the actual file content
byte[] byData = new byte[dwSize];
pStream.Read(byData, (int)dwSize, ulRead);
// Create the file
var bWriter = new BinaryWriter(File.Open(Path.Combine(destinationFolder, path), FileMode.Create));
bWriter.Write(byData);
bWriter.Close();
}
}
//.........这里部分代码省略.........