Для большинства PDF-файлов слепое преобразование страниц в растеризованные изображения JPEG с последующей попыткой дальнейшего сжатия изображений с последующим преобразованием обратно в страницы PDF не является хорошей идеей просто для экономии места по сравнению с исходными файлами PDF.
Вам нужна библиотека сжатия PDF, которая будет способна сжимать PDF различными способами, одним из которых будет сжатие изображений, уже существующих в PDF. Моя компания предлагает такой инструмент в PDF Optimizer .
Это кажется мне как три ответа, до сих пор полностью упустили суть Вашего вопроса. Это, или я имею. Вы спрашиваете, почему Delphi Win32 не имеет чего-то как волшебное Supports
функция, что статья Hallvard говорит о, не так ли? А именно, функция, которая, данный название DLL и информацию о типе интерфейса, возвращает объект, который реализует тот интерфейс с помощью автономных функций, экспортируемых из DLL.
Гидра, кажется, все о вызове кода .NET из программы Win32, не об импорте функций от DLL. TJvPluginManager
требует, чтобы сменные DLLs экспортировали специальную саморегистрационную функцию, которую вызовет менеджер, когда она загрузит DLL, и функция должна возвратить экземпляр TJvPlugin
класс, таким образом, сменный DLL должен быть записан в Разработчике C++ или Delphi. Supports
функция, с другой стороны, работает с любым DLL, записанным на любом языке. Вы могли использовать его на kernel32, если бы Вы хотели.
Я не знаю, почему Delphi Win32 не имеет такой вещи. Возможно, CodeGear не видела большого спроса на него начиная с Delphi, и Turbo Pascal уже пошел так долго без него.
Конечно, возможно записать функцию, которая работает как этот, и я не ожидаю, что это было бы немного тяжелее для записи, чем версия .NET, должно быть, была, если библиотеки .NET Microsoft уже не обеспечивают большинство частей, и Delphi просто оборачивает их в удобную для вызова функцию, которая похожа на несколько других перегруженных версий Supports
тот Delphi имел в течение многих лет.
Было бы несколько шагов к реализации той функции в Win32. (Я предоставляю только эскиз того, что необходимо, потому что у меня нет под управлением копии Delphi удобной прямо сейчас. Спросите приятно, и возможно я найду больше деталей.) Сначала, необходимо было бы удостовериться что информация о типе для сохраненного интерфейса, как минимум, неукрашенные названия его методов. Затем Supports
должен был бы генерировать функциональный тупик для каждого метода в интерфейсе (помимо _AddRef, _Release, и QueryInterface). Тупик прошел бы примерно так, предположив, что соглашение о вызовах stdcall
:
asm
// Pop the return address,
// discard the "this" pointer,
// and restore the return address
pop eax
pop ecx
push eax
jmp AddressOfFunction
end;
Как Supports
сгенерированный каждый тупик, это заполнило бы фактический функциональный адрес, полученный от вызова GetProcAddress
с названием соответствующего метода интерфейса. stdcall
соглашение о вызовах легко перенести как этот; cdecl
является немного громоздким; register
невыносим.
После того как это имеет все сгенерированные тупики, это должно было бы генерировать "объект", который похож на него, реализует данный интерфейс. Это не должен быть фактический класс. Во время компиляции, Supports
не знает расположение интерфейса, который это будет попросившим реализовать, так наличие класса не выполнило бы много.
Заключительный шаг должен обеспечить реализации _AddRef
, _Release
, и QueryInterface
. _AddRef
было бы обыкновенным; _Release
то, где Вы звонили бы FreeLibrary
когда подсчет ссылок достигнутый нуль; QueryInterface
не сделал бы многого вообще, кроме заявления, что это поддерживает IUnknown
и интерфейс, данный Supports
.
Delphi раньше шел с примером программы, который продемонстрировал реализацию интерфейса без любых классов вообще. Это было все сделано с записями и указателями функции (который является всем, интерфейс в конечном счете, в конце концов). Delphi также шел с соответствующим кодом, чтобы сделать это с классами, частично показать, сколько более легкий Delphi может сделать вещами. Я не могу найти название демонстрационной программы теперь, но я уверен, что это все еще вокруг где-нибудь.
Что не так с выполнением этого с простыми объектами com? Объявите простой интерфейс, что вся Ваша реализация плагинов, и требует, чтобы каждый объект com включал экспортируемую функцию, которая возвращает ее гуид класса. Затем использование "плагинов" так же просто как идущий через каталог плагинов, ища DLL, которые выставляют специальную регистрационную функцию, вызывая его и затем использование гуида класса, чтобы затем вызвать объект com.
Я использовал что-то вроде этого в коммерческом применении WIN32 с большим успехом. Преимущество было, я мог переключить плагины в и по желанию (если, конечно, приложение не работало для удаления существующих), волшебство было всем в интерфейсе, который каждый реализовал.
Я использовал Гидру сам для Delphi только решение (т.е. не взаимодействовал через интерфейс к.NET), и это работает отлично для этого также. Это легче использовать и добавляет некоторые тонкости, но я думаю, что это в основном реализовало тот же путь как платформа плагина "самокрутки", которая хорошо описана в этой статье: http://www.saxon.co.uk/SinglePkg/
Я искал бы сменную платформу, это основано на интерфейсе (как Гидра и система "самокрутки" в вышеупомянутом абзаце), а не тот, который просто отправляет сообщения между приложениями.
На SourceForge существует платформа плагина Delphi, не знайте, является ли это тем же как в проекте ДЖЕДАЯ или нет: http://sourceforge.net/projects/rd-dpf
Существует также несколько других коммерческих решений, одним из которых является Dragonsoft: http://www.dragonsoft.us/products_dsps.php
Существует много опций Win32 для этого типа функциональности. У ДЖЕДАЯ проекта есть сменная система с открытым исходным кодом как часть JVCL, который загружает или DLLs или пакеты, и может включать формы и этажерку как дополнительная функциональность.
Существует также много коммерческих доступных продуктов, включая Платформу Плагина TMS и RemObjects Гидра.
Это не ничто нового или особенный. Статья, просто говорящая о плагинах. Собственный код смог сделать плагины в течение многих лет. Единственная специальная вещь о P/Invoke состоит в том, что он позволяет собственному коду и.NET говорить друг с другом в сменной системе, и небольшой прием, где "DLL может рассматриваться как одиночный элемент, возражает, что реализует интерфейс [так, чтобы] можно было использовать функцию Поддержек от Borland. Delphi. Единица Win32, чтобы проверить, доступны ли DLL и все методы".
Если Вы хотите сделать, что разговор статьи о в Delphi для Win32, посмотрите на LoadLibrary, GetProcAddress и Windows API functions FreeLibrary. Если у Вас абсолютно должен быть интерфейс как статья, описывает, необходимо записать это сами, любой в DLL (если бы Вы записали DLL сами) путем записи экспортируемой функции, которая возвращает интерфейс, или в приложении вызова, путем записи функции, которая использует GetProcAddress для создания интерфейса динамично. (Осторожность: это требует слоняния без дела с указателями и обычно является большей проблемой, чем это стоит.)
Ваш лучший выбор состоит в том, чтобы, вероятно, только сделать то, что упомянул Tim Sullivan: используйте TJvPluginManager от ДЖЕДАЯ VCL, если Вам только нужен собственный код или Гидра, если необходимо говорить с блоками.NET.