我試圖嵌入PDF文件到使用OLE技術,一個Word文檔說明如下: http://blogs.msdn.com/brian_jones/archive/2009/07/21/embedding-any-file-type-like-pdf-in-an-open-xml-file.aspx釋放在C#中的OLE的IStorage文件句柄
我試圖實現在C#這樣提供的C++代碼整個項目在一個地方,除了一個路障外幾乎都在那裏。當我嘗試將生成的OLE對象二進制數據提供給Word文檔時,我得到一個IOException。
IOException:進程無法訪問文件'C:\ Wherever \ Whatever.pdf.bin',因爲它正在被另一個進程使用。
有一個文件句柄打開.bin文件(下面的「oleOutputFileName」),我不知道如何擺脫它。我不知道有關COM的大量數據 - 我在這裏展示它 - 我不知道文件句柄在哪裏或者如何釋放它。
下面是我的C#化代碼的外觀。我錯過了什麼?
public void ExportOleFile(string oleOutputFileName, string emfOutputFileName)
{
OLE32.IStorage storage;
var result = OLE32.StgCreateStorageEx(
oleOutputFileName,
OLE32.STGM.STGM_READWRITE | OLE32.STGM.STGM_SHARE_EXCLUSIVE | OLE32.STGM.STGM_CREATE | OLE32.STGM.STGM_TRANSACTED,
OLE32.STGFMT.STGFMT_DOCFILE,
0,
IntPtr.Zero,
IntPtr.Zero,
ref OLE32.IID_IStorage,
out storage
);
var CLSID_NULL = Guid.Empty;
OLE32.IOleObject pOle;
result = OLE32.OleCreateFromFile(
ref CLSID_NULL,
_inputFileName,
ref OLE32.IID_IOleObject,
OLE32.OLERENDER.OLERENDER_NONE,
IntPtr.Zero,
null,
storage,
out pOle
);
result = OLE32.OleRun(pOle);
IntPtr unknownFromOle = Marshal.GetIUnknownForObject(pOle);
IntPtr unknownForDataObj;
Marshal.QueryInterface(unknownFromOle, ref OLE32.IID_IDataObject, out unknownForDataObj);
var pdo = Marshal.GetObjectForIUnknown(unknownForDataObj) as IDataObject;
var fetc = new FORMATETC();
fetc.cfFormat = (short)OLE32.CLIPFORMAT.CF_ENHMETAFILE;
fetc.dwAspect = DVASPECT.DVASPECT_CONTENT;
fetc.lindex = -1;
fetc.ptd = IntPtr.Zero;
fetc.tymed = TYMED.TYMED_ENHMF;
var stgm = new STGMEDIUM();
stgm.unionmember = IntPtr.Zero;
stgm.tymed = TYMED.TYMED_ENHMF;
pdo.GetData(ref fetc, out stgm);
var hemf = GDI32.CopyEnhMetaFile(stgm.unionmember, emfOutputFileName);
storage.Commit((int)OLE32.STGC.STGC_DEFAULT);
pOle.Close(0);
GDI32.DeleteEnhMetaFile(stgm.unionmember);
GDI32.DeleteEnhMetaFile(hemf);
}
更新1:闡明瞭我的意思是「.bin文件」。
更新2:我不使用「使用」塊,因爲我想擺脫的東西不是一次性的。 (而且是完全誠實,我不知道我需要釋放刪除的文件句柄,COM是一門外語對我來說)。
哪一個文件是「.bin」文件? 'oleOutputFileName'或'_inputFileName'?它看起來像一個先前的電話乍一看留下了文件句柄不明顯,但。 ('使用'塊是你的朋友。) – 2010-05-31 05:01:31