怎样才能返回一个PChar类型从DLL函数的VB6应用程序,而不用担心崩溃或内存泄漏?delphi dll vb6 string 我要创建一个DLL由VB6应用程序。他们的这个DLL必须提供多种函数,必须返回字符串。 这是VB6的声明:
而这在Delphi中存根mylib.dll :
我有什么回到这里?谁将会释放returnd PChar类型字符串?
编辑:我问了Delphi 2005(PChar =PAnsiChar )本文地址 :CodeGo.net/97743/ ------------------------------------------------------------------------------------------------------------------------- 1. 你需要制定一个BSTR代替。 VB6的字符串实际上是BSTR的。在delphi端调用SysAllocString()和BSTR返回VB6的一面。 VB6的一方将不得不调用SysFreeString()来释放该字符串-它会自动做到这一点。 如果PChar类型对应一个ANSI字符串(你的情况下),你必须手动将其转换为Unicode-使用MultiByteToWideChar()了点。看到这个答案如何SysAllocStringLen()和MultiByteToWideChar()在一起。 2. 如果你不想adventure崩溃泄漏,然后制作您的Windows API的一个模型。在那里,API函数一般不分配他们相反,调用者传递一个缓冲区,告诉API有多大的缓冲区。该API填充缓冲区达到了极限。请参阅 GetWindowText 函数,例如。函数不返回指针 CodeGo.net,除非他们是指针,调用者已经提供的东西。相反,调用者提供了自己的一切,不管它给该函数。你几乎从来没有看到一个输出缓冲区不是由另一个告诉缓冲区的大小。
进一步可以使该技术是让函数来告诉有多大的缓冲区需要被调用者。当输入指针为空指针,则该函数可以返回多少字节调用者需要提供。调用者将调用该函数两次。
你并不需要从头推导出你的API。使用已经加工的API作为示例如何暴露自己。
3. 结合利齿和Lars D的答案;不widestrings已经透过窗户和BSTR分配呢? 4. 使用Windows API来分配到PChar类型指针指向。然后,用VB应用程序可以释放使用Windows API了。 5. 我会说,谁分配也必须释放它在这种情况下。你会遇到的问题与其他方案。因此,最安全和清洁的方法是: 该DLL(它知道多少),并返回PChar类型调用者 在调用者用它做,它调用FreePointer回该DLL DLL释放在FreePointer导出函数 该设置会是这样:
6. 我不熟悉Delphi的,但这里有两个主要的字符串与非COM DLL和VB6的选项。 选项1。使用“ANSI”字符串。
第二个选项。使用的BSTR。
我还建议寻找在编写C的DLL被从VB调用了微软的建议。最初发布与VB5,但仍适用于VB6的。
7. 你不能返回一个PChar类型作为函数的结果,但你可以通过一个额外的PChar类型并复制你想要回到这一PChar类型的字符串。请注意,它传递给DLL之前的VB必须分配该字符串到所需的大小。此外,在VB中必须声明为BYVAL参数为字符串,它必须为ByVal传递:
在调用的额外BYVAL会做一个VB字符串转换为PChar类型和背部的mojo。
(我希望这是正确的,它已经一段时间,因为我是被迫的VB。)本文标题 :我怎样才能返回一个PChar类型从DLL函数的VB6应用程序,而不用担心崩溃或内存泄漏? 本文地址 :CodeGo.net/97743/ |
|