你的线程函数写错了,应该是这样的:  function cb_query(var h_para:th_para):dword; stdcall;可以参照 Windows API 看看线程函数的说明
我试过了,改成这样就可以了

解决方案 »

  1.   

    这样的确可以,告诉我stdcall关键字使起什么作用的?马上结帐
      

  2.   

    你可以比较以下反汇编后的代码:
    以下是正确的版本
    00451198  681C3C4500 push $00453c1c // 把 h_para 的地址压入堆栈
    0045119D E846FEFFFF call cb_query // 调用 cb_query 函数以下是错误的版本(以前的版本)
    004511A8 B81C3C4500 mov eax,$00453c1c // 参数通过 eax 传递了
    004511AD E8C2FEFFFF call cb_query1可以看出,采用正确的声明方式,参数是按照 stdcall 的约定压入堆栈的,但是如果用 procedure 的话,参数是从 eax 里面传递的,Windows并不知道这一点,还是傻忽忽的从堆栈里面取数据,当然会取到不可预料的数据(我试了一下,取到的是0),再用这个东西做指针去访问内存,一定会出错。
      

  3.   

    stdcall 是一种调用模式(call method),除了stdcall以外,还有 register, pascal, cdecl, safecall 等模式,他们主要的不同在于参数的传递方式和返回值的方式上,比如参数压如堆栈的顺序啊,是调用者负责清理堆栈还是被调用者清理堆栈啊,具体区别你可以在delphi的帮助里面查 stdcall 就好了
      

  4.   

    非常感谢eagleyin(#define ME _NEWBIE_) !