Hallo,
ich schlag mich grad mit dem compound file Kram von MS rum. Ich möchte CHM-Dateien öffnen, ändern und speichern können und nutze dafür die IStorage- und IStream-Klassen.
Die entscheidenen Funktionen habe ich wie folgt importiert:
- Code: Ansicht erweitern :: Alles auswählen
[return: MarshalAs(UnmanagedType.Interface)]
IStorage StgCreateDocfile([In, MarshalAs(UnmanagedType.BStr)] string pwcsName, int grfMode, int reserved);
[return: MarshalAs(UnmanagedType.Interface)]
IStorage StgCreateDocfile([In, MarshalAs(UnmanagedType.BStr)] string pwcsName, int grfMode, int reserved);
Soweit funktioniert das alles. Mein Problem ist nun, dass diese Funktionen (bzw. das COM-Objekt) Dateien anlegen bzw. öffnen. Ich möchte aber nachdem ich das IStorage freigebe wieder Zugriff auf die Datei haben (Neu laden, Kopieren, usw). Leider ist die Datei blockiert, bis das ganze Programm beendet wird. Ich habe es mit folgenden Aufrufen probiert:
- Code: Ansicht erweitern :: Alles auswählen
IntPtr storage_ptr = Marshal.GetIUnknownForObject(_storage);
int refCount;
do
{
refCount = Marshal.Release(storage_ptr);
} while (refCount > 0);
_storage = null;
- Code: Ansicht erweitern :: Alles auswählen
Marshal.FinalReleaseComObject(_storage);
_storage = null;
Beides zeigt keinen Erfolg. Selbst das Flag STGM_DELETEONRELEASE (was zwar nicht gewollt ist aber beim Release wenigstens die Datei löschen sollte) funktioniert nicht. Auch ein Commit-Aufruf vor dem Release brachte keinen Erfolg.
Ich weiß nicht ganz ob das COM-Objekt dennoch weiterlebt oder einfach die Datei vom COM-Objekt nicht freigegeben wird.
Kann mir da wer helfen?
Bei Google fand ich nur die Freigabe über die obige do-while-Schleife. Dort ging es wohl; bei mir leider nicht.
