检查Delphi DLL在C#中使用的安全性

时间:2011-11-28 04:55:09

标签: c# delphi dll type-conversion delphi-7

我有一个DLL,负责一些特殊玻璃效果的自定义绘图。我把它放在一个DLL中有三个原因: 1)因此它可以很容易地重复使用和分发,当然不会权衡其主机应用程序, 2)所以我可以将它分发给开发人员而不知道它是如何工作的,并且 3)所以它可以在C#中使用。它目前在Delphi中工作,但我知道我需要做很多改动才能使它支持C#。例如,主DLL函数包括1个参数(一个Record),它包含了许多我知道在C#中不起作用的类型(如String,也许是TColor)。项目尚未完成100%,但正在发挥作用。

我需要有人指出实现这一目标的最简单方法。代码太大,无法在此处发布,因此 here it is at Pastebin

以下是我需要知道的事项:

  • 我应该像我一样继续使用唱片,还是使用像Packed Record这样的其他内容?
  • 在这些记录中使用String或PChar以外的任何技巧?
  • 如何在C#中包装此DLL? (顺便说一下,我对C#知之甚少)
    • 如何定义等效记录以传递给DLL函数?
    • 如何在C#中定义等效常量? (JDGlassCommon.pas的C#版本)
    • 如何获取要发送到DLL的画布句柄(HDC)和父句柄(HWND)?
    • 什么相当于TColor?
  • 在记录中传递TColor等类型是否安全?
  • 您是否预见到我的代码中存在任何其他问题?

文件列表:

图书馆:JDGlassLib.dll *

  • 单位:JDGlassCommon.pas *

包:JDLib.bpl

  • 单位:JDGlassCommon.pas *
  • 单位:JDGlass.pas *

程序:JDLibTestApplicationD7.exe

  • 表格:JDLibTestAppD7.dfm *
  • 单位:JDLibTestAppD7.pas *

    * =代码包含在上面的链接

    JDGlassCommon.pas在DLL和Component 中共享)

应该看起来像这样: Should look like this

注意:我不是要求重写,尽管你非常欢迎。我只需要一些如何解决这个问题的技巧。


PS:原始玻璃绘图代码记入StackOverflow的“NGLN”,回答了我的先前问题:Delphi custom drawing - glowing glass

1 个答案:

答案 0 :(得分:1)

  

我应该像我一样继续使用唱片,还是使用别的东西   喜欢Packed Record?

记录对互操作有好处。不要打包它们,只会使互操作变得更难。

  

使用String或PChar以外的任何技巧   这些记录?

不要使用字符串。这只是Delphi,甚至特定于Delphi版本。互相支持PChar很好。有时,在记录中使用固定长度的内联字符数组可能是最简单的。这取决于用途。

  

如何在C#中包装此DLL?

使用p / invoke从C#调用它。

  

在记录中传递TColor等类型是否安全?

是的,这很容易使用。确保它是真正的RGB颜色,而不是像clWindow那样的特殊颜色。

  

您是否预见到我的代码中存在任何其他问题?

玻璃渲染可能与C#库使用的渲染不兼容。它很可能取决于您的C#代码是否使用WinForms或WPF。事实上,您可能会发现C#开发人员会发现使用本机C#代码更容易。我希望玻璃渲染在常见的C#GUI框架中得到很好的支持。