打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
怎样才能返回一个PChar类型从DLL函数的VB6应用程序,而不用担心崩溃或内存泄漏?

怎样才能返回一个PChar类型从DLL函数的VB6应用程序,而不用担心崩溃或内存泄漏?



delphi dll vb6 string
我要创建一个DLL由VB6应用程序。他们的这个DLL必须提供多种函数,必须返回字符串。 这是VB6的声明:
Declare Function MyProc Lib "mylib.dll" (ByVal Param As String) As String
而这在Delphi中存根mylib.dll
function MyProc(AParam: PChar): PChar; stdcall;var ReturnValue: string;begin ReturnValue := GetReturnValue(AParam); Result := ???;end;
我有什么回到这里?谁将会释放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导出函数该设置会是这样:
unit DLL;interfaceuses SysUtils;function Execute(const Params: PChar): PChar; stdcall;procedure FreePointer(const P: PChar); stdcall;exports Execute;exports FreePointer;implementationfunction Execute(const Params: PChar): PChar; stdcall;var Size: Cardinal;begin Size := Calculate the size; GetMem(Result, Size); ...do something to fill the bufferend;procedure FreePointer(const P: PChar); stdcall;begin FreeMem(P);end;end.

6. 我不熟悉Delphi的,但这里有两个主要的字符串与非COM DLL和VB6的选项。 选项1。使用“ANSI”字符串。
'DLL routine expecting to be passed pointers to ANSI strings ''VB6 will allocate and deallocate the strings ''Its vital that VB6 allocates sufficient space for the return string 'Declare Sub MyProc Lib "mylib.dll" (ByVal Param As String, _  ByVal OutVal As String) Function DoMyProc(ByVal Param As String) As String Dim sResult As String sResult = Space$(255) ' create 255 bytes of space for the return string ' Call MyProc(Param, sResult)  DoMyProc = sResultEnd Function
第二个选项。使用的BSTR。
'DLL routine expecting to be passed two BSTRs. It will modify the second one. ''VB6 "owns" both BSTRs and will deallocate them when it has finished with them. 'Declare Sub MyProc(ByVal lpParam As Long, ByVal lpOutVal As Long)Function DoMyProc(ByVal Param As String) As String Dim sResult As String Call MyProc(StrPtr(Param), StrPtr(sResult))  DoMyProc = sResultEnd Function
我还建议寻找在编写C的DLL被从VB调用了微软的建议。最初发布与VB5,但仍适用于VB6的。
7. 你不能返回一个PChar类型作为函数的结果,但你可以通过一个额外的PChar类型并复制你想要回到这一PChar类型的字符串。请注意,它传递给DLL之前的VB必须分配该字符串到所需的大小。此外,在VB中必须声明为BYVAL参数为字符串,它必须为ByVal传递:
 param = "aaaaaaaaaaaaaaaaaaaa" ' reserve 20 characters call myproc(byval param)
在调用的额外BYVAL会做一个VB字符串转换为PChar类型和背部的mojo。 (我希望这是正确的,它已经一段时间,因为我是被迫的VB。)
本文标题 :我怎样才能返回一个PChar类型从DLL函数的VB6应用程序,而不用担心崩溃或内存泄漏?
本文地址 :CodeGo.net/97743/
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
如何使用 Unicode 版和 Ansi 版 API – 中文
VFB写DLL给VB调用
VB调用C编写的DLL的分析
DLL中不能使用STRING的问题
VB对光驱的控制
VB解压缩带密码RAR文件的两者方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服