大佬教程收集整理的这篇文章主要介绍了在我的DLL中的Delphi中,我必须分配一个函数的return pchar,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Result := pChar(SomeFuncThatReturnsString)
但是我在90%的时间里获得了预期的结果,而其他时候我什么也得不到.
然后我开始认为我需要为pchar分配内存,并且我原来的方式就是拥有一个pchar指向内存,这并不总是在最初调用该函数时的内容.所以我现在有这个
Result := StrAlloc(128); Strcopy(Result,PAnsiChar(Hash(Hash(Code,1,128),2,128)));
但这让我不得不清理程序端的已分配内存
StrDispose(Pstr);
所以64美元的问题是:从DLL中的函数返回PChar时我是否必须分配内存,或者我可以将其转换为PChar?
function GetAString(Buffer: PChar; BufLen: Integer): Integer; stdcall; var S: String; begin S := SomeFuncThatReturnsString; Result := Min(BufLen,Length(S)); if (Buffer <> nil) and (Result > 0) then Move(S[1],Buffer^,Result * SizeOf(Char)); end;
这允许应用程序决定何时以及如何分配内存(堆栈与堆,重用内存块等):
var S: String; begin SetLength(S,256); SetLength(S,GetAString(PChar(S),256)); ... end; var S: String; begin SetLength(S,GetAString(nil,0)); if Length(S) > 0 then GetAString(PChar(S),Length(S)); ... end; var S: arraY[0..255] of Char; Len: Integer; begin Len := GetAString(S,256); ... end;
如果这不适合您,那么您需要让DLL分配内存,将其返回给应用程序使用,然后让DLL导出一个额外的函数,当完成传递指针时应用程序可以调用该函数回到DLL中解放:
function GetAString: PChar; stdcall; var S: String; begin S := SomeFuncThatReturnsString; if S <> '' then begin Result := StrAlloc(Length(S)+1); StrPCopy(Result,S); end else Result := nil; end; procedure FreeAString(AStr: PChar); stdcall; begin StrDispose(AStr); end; var S: PChar; begin S := GetAString; if S <> nil then try ... finally FreeAString(S); end; end;
以上是大佬教程为你收集整理的在我的DLL中的Delphi中,我必须分配一个函数的return pchar全部内容,希望文章能够帮你解决在我的DLL中的Delphi中,我必须分配一个函数的return pchar所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。