在我的DLL中的Delphi中,我必须分配一个函数的return pchar

前端之家收集整理的这篇文章主要介绍了在我的DLL中的Delphi中,我必须分配一个函数的return pchar前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个DLL,其中我有一个返回pchar的函数. (为了避免使用borlndmm)我最初做的是将一个字符串作为pchar转换并返回
  1. Result := pChar(SomeFuncThatReturnsString)

但是我在90%的时间里获得了预期的结果,而其他时候我什么也得不到.

然后我开始认为我需要为pchar分配内存,并且我原来的方式就是拥有一个pchar指向内存,这并不总是在最初调用函数时的内容.所以我现在有这个

  1. Result := StrAlloc(128);
  2. Strcopy(Result,PAnsiChar(Hash(Hash(Code,1,128),2,128)));

但这让我不得不清理程序端的已分配内存

  1. StrDispose(Pstr);

所以64美元的问题是:从DLL中的函数返回PChar时我是否必须分配内存,或者我可以将其转换为PChar?

这个问题的典型方法是让应用程序分配内存然后将其传递给DLL来填充(如果DLL允许应用程序查询需要分配多少内存,那么它就更好了,因此它不必覆盖 – 分配内存):
  1. function GetAString(Buffer: PChar; BufLen: Integer): Integer; stdcall;
  2. var
  3. S: String;
  4. begin
  5. S := SomeFuncThatReturnsString;
  6. Result := Min(BufLen,Length(S));
  7. if (Buffer <> nil) and (Result > 0) then
  8. Move(S[1],Buffer^,Result * SizeOf(Char));
  9. end;

这允许应用程序决定何时以及如何分配内存(堆栈与堆,重用内存块等):

  1. var
  2. S: String;
  3. begin
  4. SetLength(S,256);
  5. SetLength(S,GetAString(PChar(S),256));
  6. ...
  7. end;
  8.  
  9. var
  10. S: String;
  11. begin
  12. SetLength(S,GetAString(nil,0));
  13. if Length(S) > 0 then GetAString(PChar(S),Length(S));
  14. ...
  15. end;
  16.  
  17. var
  18. S: array[0..255] of Char;
  19. Len: Integer;
  20. begin
  21. Len := GetAString(S,256);
  22. ...
  23. end;

如果这不适合您,那么您需要让DLL分配内存,将其返回给应用程序使用,然后让DLL导出一个额外的函数,当完成传递指针时应用程序可以调用函数回到DLL中解放:

  1. function GetAString: PChar; stdcall;
  2. var
  3. S: String;
  4. begin
  5. S := SomeFuncThatReturnsString;
  6. if S <> '' then
  7. begin
  8. Result := StrAlloc(Length(S)+1);
  9. StrPCopy(Result,S);
  10. end else
  11. Result := nil;
  12. end;
  13.  
  14. procedure FreeAString(AStr: PChar); stdcall;
  15. begin
  16. StrDispose(AStr);
  17. end;
  18.  
  19. var
  20. S: PChar;
  21. begin
  22. S := GetAString;
  23. if S <> nil then
  24. try
  25. ...
  26. finally
  27. FreeAString(S);
  28. end;
  29. end;

猜你在找的Windows相关文章