Интерфейсы виртуальной библиотеки для Delphi/Win32?

Для большинства PDF-файлов слепое преобразование страниц в растеризованные изображения JPEG с последующей попыткой дальнейшего сжатия изображений с последующим преобразованием обратно в страницы PDF не является хорошей идеей просто для экономии места по сравнению с исходными файлами PDF.

Вам нужна библиотека сжатия PDF, которая будет способна сжимать PDF различными способами, одним из которых будет сжатие изображений, уже существующих в PDF. Моя компания предлагает такой инструмент в PDF Optimizer .

5
задан Uli Gerhardt 20 March 2009 в 07:41
поделиться

5 ответов

Это кажется мне как три ответа, до сих пор полностью упустили суть Вашего вопроса. Это, или я имею. Вы спрашиваете, почему 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 может сделать вещами. Я не могу найти название демонстрационной программы теперь, но я уверен, что это все еще вокруг где-нибудь.

6
ответ дан 13 December 2019 в 22:17
поделиться

Что не так с выполнением этого с простыми объектами com? Объявите простой интерфейс, что вся Ваша реализация плагинов, и требует, чтобы каждый объект com включал экспортируемую функцию, которая возвращает ее гуид класса. Затем использование "плагинов" так же просто как идущий через каталог плагинов, ища DLL, которые выставляют специальную регистрационную функцию, вызывая его и затем использование гуида класса, чтобы затем вызвать объект com.

Я использовал что-то вроде этого в коммерческом применении WIN32 с большим успехом. Преимущество было, я мог переключить плагины в и по желанию (если, конечно, приложение не работало для удаления существующих), волшебство было всем в интерфейсе, который каждый реализовал.

0
ответ дан 13 December 2019 в 22:17
поделиться

Я использовал Гидру сам для Delphi только решение (т.е. не взаимодействовал через интерфейс к.NET), и это работает отлично для этого также. Это легче использовать и добавляет некоторые тонкости, но я думаю, что это в основном реализовало тот же путь как платформа плагина "самокрутки", которая хорошо описана в этой статье: http://www.saxon.co.uk/SinglePkg/

Я искал бы сменную платформу, это основано на интерфейсе (как Гидра и система "самокрутки" в вышеупомянутом абзаце), а не тот, который просто отправляет сообщения между приложениями.

На SourceForge существует платформа плагина Delphi, не знайте, является ли это тем же как в проекте ДЖЕДАЯ или нет: http://sourceforge.net/projects/rd-dpf

Существует также несколько других коммерческих решений, одним из которых является Dragonsoft: http://www.dragonsoft.us/products_dsps.php

0
ответ дан 13 December 2019 в 22:17
поделиться

Существует много опций Win32 для этого типа функциональности. У ДЖЕДАЯ проекта есть сменная система с открытым исходным кодом как часть JVCL, который загружает или DLLs или пакеты, и может включать формы и этажерку как дополнительная функциональность.

Существует также много коммерческих доступных продуктов, включая Платформу Плагина TMS и RemObjects Гидра.

3
ответ дан 13 December 2019 в 22:17
поделиться

Это не ничто нового или особенный. Статья, просто говорящая о плагинах. Собственный код смог сделать плагины в течение многих лет. Единственная специальная вещь о P/Invoke состоит в том, что он позволяет собственному коду и.NET говорить друг с другом в сменной системе, и небольшой прием, где "DLL может рассматриваться как одиночный элемент, возражает, что реализует интерфейс [так, чтобы] можно было использовать функцию Поддержек от Borland. Delphi. Единица Win32, чтобы проверить, доступны ли DLL и все методы".

Если Вы хотите сделать, что разговор статьи о в Delphi для Win32, посмотрите на LoadLibrary, GetProcAddress и Windows API functions FreeLibrary. Если у Вас абсолютно должен быть интерфейс как статья, описывает, необходимо записать это сами, любой в DLL (если бы Вы записали DLL сами) путем записи экспортируемой функции, которая возвращает интерфейс, или в приложении вызова, путем записи функции, которая использует GetProcAddress для создания интерфейса динамично. (Осторожность: это требует слоняния без дела с указателями и обычно является большей проблемой, чем это стоит.)

Ваш лучший выбор состоит в том, чтобы, вероятно, только сделать то, что упомянул Tim Sullivan: используйте TJvPluginManager от ДЖЕДАЯ VCL, если Вам только нужен собственный код или Гидра, если необходимо говорить с блоками.NET.

1
ответ дан 13 December 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: