0

我是一个 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' 会这样做,因为我找到了这个,但显然我错过了一些东西。

如果您需要任何其他信息,请告诉我。

提前致谢。

4

1 回答 1

3

首先,不要强制转换回调函数曾经

二、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
);

NTAPIis __stdcall,而不是 default __cdecl,这是错误消息告诉您的内容。

你用这个做了什么:

PIO_APC_ROUTINE GotIt(PVOID param, PIO_STATUS_BLOCK IoStatusBlock, ULONG Reserved);

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

于 2012-05-30T19:21:56.227 回答