_stdcall的说明及error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' t

(转)

用VC创建新线程易出的问题error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'

解决方案:

(1)如果线程要执行的是类的成员函数,则必须用static声明为静态函数   
如:   
class   echo   
{   
static   DWORD   WINAPI   ThreadFunc(LPVOID     pvoid)   
......   
......   
}   

(2)一般都是调用全局函数.

我们在用CreateThread(NULL,0,ThreadProc,NULL,0,NULL)创建线程得时候,此函数中需要新线程中的函数地址,我们常用的有两种方法解决:

    一.将我们要调用的新线程函数声明成DWORD WINAPI ThreadProc(lpvoid lpParameter)。

    二.我们可以将新线程函数声明成类中的成员函数:static DWORD WINAPI ThreadProc(lpvoid lpParameter)

    但是当我们的写法不正确的时候,往往会出现error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)' 这个问题


//

__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:

  1.参数传递顺序
  2.调用堆栈由谁(调用函数或被调用函数)清理
  常见的函数调用约定:stdcall cdecl fastcall thiscall naked call
  __stdcall表示
  1.参数从右向左压入堆栈
  2.函数被调用者修改堆栈
  3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸
  在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见。

(百度百科)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值