在我的DLL中的Delphi中,我必须分配函数的返回pchar

问题描述 投票:9回答:4

我有一个DLL,其中有一个返回pchar的函数。 (为避免不得不使用borlndmm)我最初所做的是将字符串转换为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?

我有一个DLL,其中有一个返回pchar的函数。 (为了避免不得不使用borlndmm)我最初所做的是将字符串转换为pchar并返回该结果:= pChar(...

delphi dll delphi-2007 pchar
4个回答
8
投票

解决此问题的典型方法是让应用分配内存,然后将其传递给DLL进行填充(如果DLL允许应用查询需要分配多少内存,则更好,因此不必过度分配内存):


5
投票

DLL和您的主应用程序有两个不同的内存管理器,因此在DLL中分配内存但在主应用程序中释放内存是不正确的,反之亦然。


1
投票

当您从函数中将字符串作为PChar返回时,该字符串将保留在堆栈中,这就是为什么它有时会损坏的原因。我使用进程堆内存来返回字符串,或指向字符的全局缓冲区数组的指针。


0
投票

我有类似的问题,但目标是在dll中包含的TStringList中检索附加到对象数组的字符串。我无法共享TStringList对象,但是将Text属性返回为PChar允许我在主应用程序中重新创建列表,然后为每个存储的字符串查询dll。

© www.soinside.com 2019 - 2024. All rights reserved.