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

NTAPI__stdcall、デフォルト__cdeclではなく、エラーメッセージが表示している内容です。

これで何をしたか:

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

...関数ポインタを返す関数を宣言します。これはあなたが望んでいたものではありません。

于 2012-05-30T19:21:56.227 に答える