Проверка безопасности Delphi DLL для использования в C # - PullRequest
0 голосов
/ 28 ноября 2011

У меня есть DLL, которая заботится о собственном рисовании для некоторых специальных стеклянных эффектов.Я помещаю его в DLL по трем причинам: 1) Так что его можно легко использовать и распространять, конечно же, без утяжеления его хост-приложения, 2) Так что я могураспространять его среди разработчиков, не зная, как он работает, и 3) Так что его можно использовать из C #.В настоящее время он работает в Delphi, но я знаю, что мне нужно будет сделать много изменений, чтобы он поддерживал C #.Например, основная функция DLL включает в себя 1 параметр (запись), который содержит несколько типов, которые, как я знаю, не будут работать в C # (например, String и, возможно, TColor).Проект еще не завершен на 100%, но работает.

Мне нужно, чтобы кто-то указал на самый простой подход для достижения этой цели.Код слишком велик, чтобы размещать все это здесь, поэтому здесь, в Pastebin .

Вот что мне нужно знать:

  • Должен ли я продолжать использовать записи в том виде, в каком я есть, или использовать что-то еще, например, упакованную запись?
  • Какие-нибудь хитрости использовать в этих записях что-либо кроме String или PChar?
  • Как бы я обернуть эту DLL в C #?(Кстати, я очень мало знаю C #)
    • Как определить эквивалентные записи для передачи в функцию DLL?
    • Как определить эквивалентные константы в C #?(C # версия JDGlassCommon.pas)
    • Как получить дескриптор холста (HDC) и родительский дескриптор (HWND) для отправки в DLL?
    • Что будет эквивалентно TColor?
  • Безопасно ли передавать в записях такие типы, как TColor?
  • Предвидите ли вы какие-либо другие проблемы в моем коде?

ФайлСписок:

Библиотека: JDGlassLib.dll *

  • Единица измерения: JDGlassCommon.pas *

Упаковка: JDLib.bpl

  • Единица измерения: JDGlassCommon.pas *
  • Единица измерения: JDGlass.pas *

Программа: JDLibTestApplicationD7.exe

  • Форма: JDLibTestAppD7.dfm *
  • Единица измерения: JDLibTestAppD7.pas *

    (* = код включен в вышеуказанную ссылку )

    ( JDGlassCommon.pas совместно используется как DLL, так и компонентом )

Должно выглядеть примерно так: Should look like this

ПРИМЕЧАНИЕ: Я не прошу переписать, хотя вы более чем рады.Мне просто нужно несколько советов о том, как подойти к этому.


PS: Оригинальный код рисования стекла, зачисленный в "NGLN" StackOverflow, отвечая на мой предыдущий вопрос: Delphiнестандартный рисунок - светящееся стекло

1 Ответ

1 голос
/ 28 ноября 2011

Должен ли я продолжать использовать Записи, как я, или использовать что-то еще как упакованная запись?

Записи хороши для взаимодействия. Не упаковывайте их, это только усложняет взаимодействие.

Любые приемы использования чего-либо кроме String или PChar в эти записи?

Не используйте строку. Это только Delphi и даже специфично для версий Delphi. PChar отлично подходит для взаимодействия. Иногда в записях проще всего использовать встроенные символьные массивы фиксированной длины. Это зависит от использования.

Как бы я обернул эту DLL в C #?

Вызовите его из C #, используя p / invoke.

Безопасно ли передавать такие типы, как TColor, в Записи?

Да, с этим легко работать. Убедитесь, что это настоящий цвет RGB, а не специальный цвет, такой как clWindow.

Предвидите ли вы какие-либо другие проблемы в моем коде?

Визуализация стекла может быть несовместима с визуализацией, используемой библиотеками C #. Это вполне может зависеть от того, использует ли ваш код на C # WinForms или WPF. На самом деле вы можете обнаружить, что разработчикам на C # будет проще использовать нативный код на C #. Я ожидаю, что рендеринг стекла хорошо поддерживается в распространенных графических средах C #.

...