我是一个c ++新手,我正在尝试使用IcmpSendEcho2创建一个“ping工具”,但我不能让它与APC一起工作。
我遇到了这个编译错误:
>error C2220: warning treated as error - no 'object' file generated
>warning C4191: 'type cast' : unsafe conversion from 'PIO_APC_ROUTINE (__cdecl *)(PVOID,PIO_STATUS_BLOCK,ULONG)' to 'PIO_APC_ROUTINE'
> Calling this function through the result pointer may cause your program to fail
这是我的APC声明:
PIO_APC_ROUTINE GotIt(PVOID param, PIO_STATUS_BLOCK IoStatusBlock, ULONG Reserved);
这是我的APC定义:
PIO_APC_ROUTINE GotIt(PVOID param, PIO_STATUS_BLOCK IoStatusBlock, ULONG Reserved)
{
printf("GOT IT!\n");
return NULL;
}
这就是我制作IcmpSendEcho2的方法:
DWORD dwRetVal = IcmpSendEcho2(hIcmpFile, NULL, (PIO_APC_ROUTINE) GotIt, NULL,
ipaddr, SendData, sizeof (SendData), NULL,
ReplyBuffer, ReplySize, 1000);
我认为'(PIO_APC_Rountine)GotIt'会这样做,因为我找到this,但显然我错过了什么。
如果您需要任何其他信息,请与我们联系。
先谢谢。
答案 0 :(得分:2)
首先,don't cast callback functions。的自从强>
其次,PIO_APC_ROUTINE
被声明为:
typedef
VOID
(NTAPI *PIO_APC_ROUTINE) (
IN PVOID ApcContext,
IN PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG Reserved
);
所以你的GotIt
函数应该是:
VOID NTAPI GotIt(
IN PVOID ApcContext,
IN PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG Reserved
);
NTAPI
是__stdcall
,而不是默认__cdecl
,这是错误消息告诉您的内容。
你对此做了什么:
PIO_APC_ROUTINE GotIt(PVOID param, PIO_STATUS_BLOCK IoStatusBlock, ULONG Reserved);
...声明一个返回函数指针的函数。这不是你想要的。