C# 从StgOpenStorage()中避免或移除锁

C# 从StgOpenStorage()中避免或移除锁,c#,winapi,com,C#,Winapi,Com,问候 当时我发现了一个类似的问题,但那个解决方案对我不起作用 我尝试使用StgOpenStorage()打开outlook.msg文件。我的问题是,StgOpenStorage总是锁定我的文件 那么,如何避免/删除StgOpenStorage()添加到文件中的锁呢 (请参阅代码OpenStorage()的最后一种方法) 希望你能帮助我 问候, inno您是否尝试过将文件读入内存并改用StgOpenStorageOnILockBytes?您是否尝试过将文件读入内存并改用StgOpenStorage

问候

当时我发现了一个类似的问题,但那个解决方案对我不起作用

我尝试使用StgOpenStorage()打开outlook.msg文件。我的问题是,StgOpenStorage总是锁定我的文件

那么,如何避免/删除StgOpenStorage()添加到文件中的锁呢

(请参阅代码OpenStorage()的最后一种方法)

希望你能帮助我

问候,


inno

您是否尝试过将文件读入内存并改用StgOpenStorageOnILockBytes?

您是否尝试过将文件读入内存并改用StgOpenStorageOnILockBytes?

我遇到了类似的问题,下面的代码为我解决了。我已将变量名更改为您的示例

storage.Commit(0);   // storage is a pointer to IStorage in OP's question
Marshal.ReleaseComObject(storage);
storage = null;

GC.Collect();
GC.Collect();  // call twice for good measure
GC.WaitForPendingFinalizers();      
这是基于Mirosoft的示例代码


因此,在COM中,您需要将引用计数减少到零,这样对象就可以确定地销毁自身,但整体并不总是那么简单。因为打电话之前最好先打个电话,这样对你有好处。在下一行中,显式地将变量设置为null有助于标记垃圾收集对象,然后我们继续调用该对象。我们调用了两次,因为有多代对象等待收集,并且因为这是最后一次,所以会在上发生另一次确定性整理

我遇到了类似的问题,下面的代码为我解决了。我已将变量名更改为您的示例

storage.Commit(0);   // storage is a pointer to IStorage in OP's question
Marshal.ReleaseComObject(storage);
storage = null;

GC.Collect();
GC.Collect();  // call twice for good measure
GC.WaitForPendingFinalizers();      
这是基于Mirosoft的示例代码


因此,在COM中,您需要将引用计数减少到零,这样对象就可以确定地销毁自身,但整体并不总是那么简单。因为打电话之前最好先打个电话,这样对你有好处。在下一行中,显式地将变量设置为null有助于标记垃圾收集对象,然后我们继续调用该对象。我们调用了两次,因为有多代对象等待收集,并且因为这是最后一次,所以会在上发生另一次确定性整理

有进一步的提示吗?如何将文件放入内存,以便我可以将其与StgOpenStorageOnILockBytes一起使用?-分配一个本机内存块,并为其获取HGLOBAL hanlde。它必须是可移动的,所以不能使用Marshal.AllocHGlobal,必须使用GlobalAlloc。-你想怎么读就怎么读。您可以从rgular.NET文件流中读取数据,并使用Marshal.Copy编写连接。确保释放FileStream以删除文件上的所有“锁”。-调用CreateILockBytesOnHGlobal以获取ILockBytes对象。有进一步的提示吗?如何将文件放入内存,以便我可以将其与StgOpenStorageOnILockBytes一起使用?-分配一个本机内存块,并为其获取HGLOBAL hanlde。它必须是可移动的,所以不能使用Marshal.AllocHGlobal,必须使用GlobalAlloc。-你想怎么读就怎么读。您可以从rgular.NET文件流中读取数据,并使用Marshal.Copy编写连接。确保释放FileStream以删除文件上的所有“锁”。-调用CreateILockBytesOnHGlobal以获取ILockBytes对象。