我有一个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(...
解决此问题的典型方法是让应用分配内存,然后将其传递给DLL进行填充(如果DLL允许应用查询需要分配多少内存,则更好,因此不必过度分配内存):
DLL和您的主应用程序有两个不同的内存管理器,因此在DLL中分配内存但在主应用程序中释放内存是不正确的,反之亦然。
当您从函数中将字符串作为PChar返回时,该字符串将保留在堆栈中,这就是为什么它有时会损坏的原因。我使用进程堆内存来返回字符串,或指向字符的全局缓冲区数组的指针。
我有类似的问题,但目标是在dll中包含的TStringList中检索附加到对象数组的字符串。我无法共享TStringList对象,但是将Text属性返回为PChar允许我在主应用程序中重新创建列表,然后为每个存储的字符串查询dll。