如何在PIO_APC_ROUTINE中使用IcmpSendEcho2?

时间:2012-05-30 19:15:11

标签: c++ winapi asynchronous ping icmp

我是一个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,但显然我错过了什么。

如果您需要任何其他信息,请与我们联系。

先谢谢。

1 个答案:

答案 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);

...声明一个返回函数指针的函数。这不是你想要的。