есть поток с кселевским файлом, его нужно покласть в открытую книгу. некто Geoff Darst из Microsoft VSTO Team божится что должно проканать ( http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/bc85ed23-2273-4b33-b862-354b61294968 ) у меня получилось как-то примерно так, если оставить только значимое:
| Код | var tmpIStream, NewIStream: IStream; NewStorage: IStorage; FExcel: IDispatch; FExcelApp: _Application; ExcelPersistStorage: IPersistStorage; WB: ExcelWorkbook; MemoryHandle: HGLOBAL; x: ILockBytes; Res: HRESULT; flag: cardinal; tmpStream: TStream; size, DoesNotMatter1, DoesNotMatter2: int64; P: pointer; DoesNotMatter3: PLongint; ..................
FExcel := CreateOleObject('Excel.Application'); Res := FExcel.QueryInterface(_Application, FExcelApp); Res := FExcelApp.QueryInterface(IPersistStreamInit, ExcelPersistStorage); WB := FExcelApp.Workbooks.Add(1, LOCALE_USER_DEFAULT); Res := WB.QueryInterface(IPersistStorage , ExcelPersistStorage);
MemoryHandle := GlobalAlloc(GMEM_MOVEABLE or GMEM_NODISCARD, 0); Res := CreateILockBytesOnHGlobal(MemoryHandle, true, x); flag := STGM_CREATE or STGM_READWRITE or STGM_SHARE_EXCLUSIVE or STGM_TRANSACTED; Res := StgCreateDocfileOnILockBytes(x, flag, 0, NewStorage); flag := STGM_SHARE_EXCLUSIVE; Res := NewStorage.CreateStream(PChar('ExcelMemoryStream'), flag, 0, 0, NewIStream); tmpStream := GetStream(Grid); tmpIStream := TStreamAdapter.Create(tmpStream); Res := tmpIStream.CopyTo(NewIStream, size + 1, DoesNotMatter1, DoesNotMatter2); // тут я в дебагере проверяю, что лежит в новом NewIStream, там лежит что надо. Res := ExcelPersistStorage.Load(NewStorage); // тут я получаю Res = STG_E_FILENOTFOUND =( ........
|
но вот что-то не проканывает =( что я делаю не так? может с флагами накосячил? |