Недавно добавленные исходники

•  TDictionary Custom Sort  505

•  Fast Watermark Sources  872

•  3D Designer  1 799

•  Sik Screen Capture  1 455

•  Patch Maker  1 459

•  Айболит (remote control)  1 387

•  ListBox Drag & Drop  1 154

•  Доска для игры Реверси  21 197

•  Графические эффекты  1 332

•  Рисование по маске  1 274

•  Перетаскивание изображений  1 084

•  Canvas Drawing  961

•  Рисование Луны  797

•  Поворот изображения  754

•  Рисование стержней  801

•  Paint on Shape  486

•  Генератор кроссвордов  747

•  Головоломка Paletto  659

•  Теорема Монжа об окружностях  839

•  Пазл Numbrix  606

•  Заборы и коммивояжеры  835

•  Игра HIP  549

•  Игра Go (Го)  522

•  Симулятор лифта  544

•  Программа укладки плитки  505

•  Генератор лабиринта  560

•  Проверка числового ввода  518

•  HEX View  595

•  Физический маятник  522

•  Задача коммивояжера  555

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Чтение сложных OLE-документов



Автор: John Lam

Не используйте для этого компонент TOleContainer. Создавая приложение с возможностью доступа к файлам OLE Structured Storage (стуктурное хранилище), реально необходима только пара вызовов OLE API, и 5-6 вызовов API для доступа к функциям-членам интерфейсов IStorage, IRootStorage и IStream. Я подозреваю, что функция-член TOleContainer IStorage является указателем на корневое хранилище файла Structured Storage, создаваемого функциями-членами LoadFromFile/SaveToFile TOleContainer.

Необходимые функции API:

StgOpenStorage
StgIsStorageFile

Если у вас есть OLE 2.01 SDK, вы можете найти определения там.

Будьте внимательны, при переносе заголовочных файлов C++ из OLE SDK в Delphi, Borland допустил несколько ошибок. Одна из ошибок при создании апплета обернулась мне тремя бессонными ночами. Вот правильное определение IStorage:


MyIStorage = class(IUnknown)
function CreateStream(const pwcsName: PChar; grfMode: Longint; reserved1: Longint;
reserved2: Longint; var ppstm: IStream): HResult; virtual; cdecl; export; abstract;
function OpenStream(const pwcsName: PChar; reserved1: Pointer; grfMode: Longint;
reserved2: Longint; var ppstm: IStream): HResult; virtual; cdecl; export; abstract;
function CreateStorage(const pwcsName: PChar; grfMode: Longint;
reserved1: Longint; reserved2: Longint; var ppstg: MyIStorage): HResult;
virtual; cdecl; export; abstract;
function OpenStorage(const pwcsName: PChar; pstgPriority: MyIStorage;
grfMode: Longint; snbExclude: PStr; reserved: Longint;
var ppstg: MyIStorage): HResult; virtual; cdecl; export; abstract;
function CopyTo(ciidExclude: Longint; const rgiidExclude: IID;
var snbExclude: PStr; pstgDest: MyIStorage): HResult; virtual; cdecl; export; abstract;
function MoveElementTo(const lpszName: PChar; pstgDest: MyIStorage;
const lpszNewName: PChar; grfFlags: Longint): HResult; virtual; cdecl; export; abstract;
function Commit(grfCommitFlags: Longint): HResult; virtual; cdecl; export; abstract;
function Revert: HResult; virtual; cdecl; export; abstract;
function EnumElements(reserved1: Longint; reserved2: Pointer; reserved3: Longint;
var ppenm: IEnumStatStg): HResult; virtual; cdecl; export; abstract;
function DestroyElement(const pwcsName: PChar): HResult; virtual; cdecl; export; abstract;
function RenameElement(const pwcsOldName: PChar;
const pwcsNewName: PChar): HResult; virtual; cdecl; export; abstract;
function SetElementTimes(const lpszName: PChar; const pctime: TFileTime;
const patime: TFileTime; const pmtime: TFileTime): HResult;
virtual; cdecl; export; abstract;
function SetClass(const clsid: IID): HResult; virtual; cdecl; export; abstract;
function SetStateBits(grfStateBits: Longint; grfMask: Longint): HResult;
virtual; cdecl; export; abstract;
function Stat(var pstatstg: TStatStg; grfStatFlag: Longint): HResult;
virtual; cdecl; export; abstract;
end;

Проблема заключалась в том, что некоторые параметры неправильно были объявлены как VAR, тогда как в действительности они объявлены как CONST - это важно, поскольку иногда функции-члены интерфейса ожидают параметры со значением, равным NIL.

Надеюсь, это поможет.





Похожие по теме исходники

Чтение PSD файлов

Win Console

Molecula (3D молекула)

Molecule (молекула)

 

Console FTP

CMD OLE

DeParole

Console SmartEngine

 

Close Console on Event

Console Task Manager




Copyright © 2004-2022 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте   Facebook   Ссылка на Twitter   Ссылка на Telegram