[изврат] Передать файл в эксель через поток минуя жесткий диск..

kill-still

есть поток с кселевским файлом, его нужно покласть в открытую книгу.
некто Geoff Darst из Microsoft VSTO Team божится что должно проканать
( http://social.msdn.microsoft.com/Forums/en...62-354b61294968 )
у меня получилось как-то примерно так, если оставить только значимое (язык тут в принципе не особо важен, но вообще это D2010):
интерфейсы все мелкомягкие, на мсдне описание есть.

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);
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 (80030002) =(
........

но вот что-то не проканывает =(
что я делаю не так?
может с флагами накосячил?

kill-still

что, даже смешных комментариев нету? :)

FRider

лучше не делать такую хуету

Anna74

что, даже смешных комментариев нету?
заведи в памяти виртуальный диск незаметно, положи файл туда и скорми ёкселю :)

Hastya

Тебе не DDE случаем нужен?

evgen5555

Смотри там в ответах написано как правильно нужно делать:
http://social.msdn.microsoft.com/Forums/en...54-4fca88294010
Оставить комментарий
Имя или ник:
Комментарий: