gpt4 book ai didi

与其他编程语言兼容的Delphi DLL

转载 作者:行者123 更新时间:2023-12-03 15:37:35 25 4
gpt4 key购买 nike

我想构建一个导出返回字符串的函数的 DLL。这个 DLL 应该可以与其他编程语言一起使用!我已经找到了各种令人讨厌的解决方案/黑客,最好的一个是让我的函数返回 Pchar,然后调用同一 DLL 中包含的另一个函数(我们称之为 ReleaseMemory)来释放为 PChar 保留的内存。

无论如何,最近我发现了 FastShareMem 库。它说它可以完全执行我想要的操作,而无需调用 ReleaseMemory。另一方面,FastMM 似乎做同样的事情,因为 DLL 和应用程序都使用 FastMM 作为内存管理器。这立即消除了使用 FastMM 作为通用 DLL 内存管理器的机会。对吗?

====================

FastShareMem ( http://www.codexterity.com/fastsharemem.htm )、Delphi 7、Windows XP 32 位、Windows 7 64 位

最佳答案

如果您退回Delphi string ,那么您的 DLL 将无法与其他编程语言一起使用,因为没有其他编程语言使用 Delphi 的字符串类型。如果类型不同,那么如何分配内存并不重要。如果您正在处理文本,请遵循 Windows API 模型并使用普通的旧字符指针。

您找到的解决方案 - 返回一个指针,然后为 DLL 提供另一个函数来释放内存 - 不是 hack,也一点也不令人讨厌。这是一个非常普通的解决方案,使用您的 DLL 的人看到它时都不会眨眼。 FormatMessage API 函数使用类似的模型:它为您分配一个字符串,并指定必须使用 LocalFree 释放它分配的字符串。 .

只要保持一致并且 DLL 的使用者可以使用它,使用什么内存管理器并不重要。一种方法是指定用于分配和释放字符串的 Windows API 函数,例如 LocalAllocLocalFree ,或SysAllocStringSysFreeString 。另一种方法是根本不分配任何东西——如果调用者需要你返回一个字符串,调用者会提供缓冲区并告诉你它有多大。如果缓冲区太小,则返回所需的大小,以便调用者可以重新分配缓冲区并重新调用该函数。有关示例,请参阅 GetLongPathName .

FastSharemem 提供了 how Delphi's memory manager works 的详细解释,然后它说您只需在程序中使用该单元即可避免所有麻烦。但请记住我上面所说的:DLL 的使用者需要能够使用与您使用的相同的内存管理器。当 DLL 的使用者不是用 Delphi 编写时,它就不能使用 FastSharemem 单元。 FastSharemem 在同质 Delphi 环境中表现良好,但在混合环境中使用时,它会遇到与任何其他内存管理器相同的陷阱。

关于与其他编程语言兼容的Delphi DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3455513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com