function MyFun(s:string): string;
begin
showmessage(s);
end;procedure prc;
var
ID: THandle;
begin
CreateThread(nil, 0, @MyFun, nil, 0, ID);//MyFun('ABC')//这样写就会出现错误,怎么传递参数呢?
end;

解决方案 »

  1.   

    这个代码只是打个比方,HOOK里一样要使用回调函数,但同样传递不了参数
      

  2.   

    当然可以传参数,标准是指针参数。当然你可以用pchar 等:
    function MyFun( s:pchar): word;stdcall; //回调函数必须这样定义:word;stdcall
    begin
    showmessage(s);
    end;
    procedure prc;
    var
    ID: THandle;
    s:pchar;
    begin
    s:='test';
    CreateThread(nil, 0, @MyFun,s, 0, ID);
    end;
      

  3.   


    function MyFun(Param: Pointer): DWORD; stdcall;
    begin
      MessageBox(0, PChar(Param), PChar(Param), MB_OK);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      ThreadId: DWORD;
      Str: PChar;
    begin
      Str := '123';
      CloseHandle(CreateThread(nil, 0, @MyFun, Pointer(str), 0, ThreadId));
    end;
      

  4.   

    showmessage 在线程使用会有问题的 
      

  5.   

    线程函数里 还要加个
    Result := 0;
      

  6.   

    这里并不是回调函数了,这里是1个比较特殊的线程函数。
    CreateThread(nil, 0, @MyFun, nil, 0, ID) 请lz参考msdn的help文档中有详细说明,线程函数的参数是通过CreateThread函数第4个参数传递的。
    另外回调函数传递参数和普通函数传递参数方式一样。