function BackHook(TmpWndHandle:THandle):PAnsiChar;stdcall; external 'HOOKtest.DLL';
..........
procedure TBarForm.Button3Click(Sender: TObject);
var
p:PAnsiChar;
BackStr:string;
begin
p:=BackHOOK(sWindowHwnd);
BackStr:=StrPas(p);
//sleep(1000);
showmessage(BackStr);
end;
===================DLL
..........
function BackHook(TmpWndHandle:THandle): PAnsiChar;stdcall; export;
.........
function BackHook(TmpWndHandle:THandle): PAnsiChar; stdcall;export;
var
BackResult:string;
begin
BackResult:='ABC';
Result := PAnsiChar(BackResult);
end;
 =============
为什么返回值为空!!

解决方案 »

  1.   

    代码没错,可能是dll有问题
    还有BackHook的参数是干嘛用的?
      

  2.   

    BackResult 是局部变量, 函数结束就被释放了.用GetMem分配内存,再返回, 用完后记得FreeMem.
      

  3.   

    LZ需要注意:
    1. DLL和EXE拥有各自的堆栈,在两者之间传递动态类型(如string)可能会破坏两者的堆栈。
    2. 当string的引用计数为0时会被自动销毁你可以按Windows API的方式声明函数(或者两边都使用ShareMem)
    比如:
    procedure Test(hWnd: THandle; pBuffer: PAnsiChar; bufferSize: Integer); stdcall;