分享

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

 quasiceo 2016-11-10

怎样才能返回一个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;
interface
uses
 SysUtils;
function Execute(const Params: PChar): PChar; stdcall;
procedure FreePointer(const P: PChar); stdcall;
exports Execute;
exports FreePointer;
implementation
function Execute(const Params: PChar): PChar; stdcall;
var
 Size: Cardinal;
begin
 Size := Calculate the size;
 GetMem(Result, Size);
 ...do something to fill the buffer
end;
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 = sResult
End 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 = sResult
End 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/

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多