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;
=============
为什么返回值为空!!
..........
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;
=============
为什么返回值为空!!
还有BackHook的参数是干嘛用的?
1. DLL和EXE拥有各自的堆栈,在两者之间传递动态类型(如string)可能会破坏两者的堆栈。
2. 当string的引用计数为0时会被自动销毁你可以按Windows API的方式声明函数(或者两边都使用ShareMem)
比如:
procedure Test(hWnd: THandle; pBuffer: PAnsiChar; bufferSize: Integer); stdcall;