-1

他のすべての wprintf インスタンスを避けて 1 つのインスタンスでバッファー データを出力したいのですが、データをバッファーと互換性のある型に変換できません。

コードを見てください:

それを乗り越える方法を教えてください:

DWORD PrintEvent(EVT_HANDLE hEvent)
{
    DWORD status = ERROR_SUCCESS;
    PEVT_VARIANT pRenderedValues = NULL;
    WCHAR wsGuid[50];
    LPWSTR pwsSid = NULL;

    //
    // Beginning of functional Logic
    //
    for (;;)
    {

        if (!EvtRender(hContext, hEvent, EvtRenderEventValues, dwBufferSize, pRenderedValues, &dwBufferUsed, &dwPropertyCount))
        {
            if (ERROR_INSUFFICIENT_BUFFER == (status = GetLastError()))
            {
                dwBufferSize = dwBufferUsed;
                dwBytesToWrite = dwBufferSize;
                pRenderedValues = (PEVT_VARIANT)malloc(dwBufferSize);
                if (pRenderedValues)
                {
                    EvtRender(hContext, hEvent, EvtRenderEventValues, dwBufferSize, pRenderedValues, &dwBufferUsed, &dwPropertyCount);
                }
                else
                {
                    printf("malloc failed\n");
                    status = ERROR_OUTOFMEMORY;
                    break;
                }
            }
        }
        Buffer = (wchar_t*) malloc (1*wcslen(pRenderedValues[EvtSystemProviderName].StringVal));

        //
        // Print the values from the System section of the element.
        wcscpy(Buffer,pRenderedValues[EvtSystemProviderName].StringVal);

        int i = wcslen(Buffer);

        if (NULL != pRenderedValues[EvtSystemProviderGuid].GuidVal)
        {
            StringFromGUID2(*(pRenderedValues[EvtSystemProviderGuid].GuidVal), wsGuid, sizeof(wsGuid)/sizeof(WCHAR));
            wcscpy(Buffer+i,(wchar_t*)pRenderedValues[EvtSystemProviderGuid].GuidVal);
            wprintf(L"Provider Guid: %s\n", wsGuid);
        }

//取得 "??????" guidval を含めた後の画面で、それをコピーする正しい方法を教えてください??

        wprintf(L"Buffer = %ls",Buffer);

//符号なしの値をバッファにコピーする方法も伝える

        wprintf(L"EventID: %lu\n", EventID);

        wprintf(L"Version: %u\n", pRenderedValues[EvtSystemVersion].ByteVal);
        wprintf(L"Level: %u\n", pRenderedValues[EvtSystemLevel].ByteVal);


        wprintf(L"EventRecordID: %I64u\n", pRenderedValues[EvtSystemEventRecordId].UInt64Val);

        if (EvtVarTypeNull != pRenderedValues[EvtSystemActivityID].Type)
        {
            StringFromGUID2(*(pRenderedValues[EvtSystemActivityID].GuidVal), wsGuid, sizeof(wsGuid)/sizeof(WCHAR));
            wprintf(L"Correlation ActivityID: %s\n", wsGuid);
        }

        if (EvtVarTypeNull != pRenderedValues[EvtSystemRelatedActivityID].Type)
        {
            StringFromGUID2(*(pRenderedValues[EvtSystemRelatedActivityID].GuidVal), wsGuid, sizeof(wsGuid)/sizeof(WCHAR));
            wprintf(L"Correlation RelatedActivityID: %s\n", wsGuid);
        }

        wprintf(L"Execution ProcessID: %lu\n", pRenderedValues[EvtSystemProcessID].UInt32Val);
        wprintf(L"Execution ThreadID: %lu\n", pRenderedValues[EvtSystemThreadID].UInt32Val);
        wprintf(L"Channel: %s\n",pRenderedValues[EvtSystemChannel].StringVal);
        wprintf(L"Computer: %s\n", pRenderedValues[EvtSystemComputer].StringVal);



        //
        // Final Break Point
        //

        break;
    }
}
4

1 に答える 1

1

最初のエラーは、バッファへの書き込みを開始するときです。

Buffer = (wchar_t*) malloc (1*wcslen(pRenderedValues[EvtSystemProviderName].StringVal));
wcscpy(Buffer,pRenderedValues[EvtSystemProviderName].StringVal);

StringVal は、末尾に null バイトがあるワイド文字列を指しているため、

Buffer = malloc (sizeof(wchar_t)*(wcslen(pRenderedValues[EvtSystemProviderName].StringVal)+1));

またはさらに良い

Buffer = wcsdup(pRenderedValues[EvtSystemProviderName].StringVal);

2 番目のエラーは、GUID を追加するときです。

十分なメモリを割り当てていません。すでにいっぱいになっているバッファに追加しているだけです。また、GUID 文字列ではなく、生の GUID を追加しています。交換する必要があります

int i = wcslen(Buffer);
wcscpy(Buffer+i,(wchar_t*)pRenderedValues[EvtSystemProviderGuid].GuidVal);

のようなもので

// Attention: memory leak if realloc returns NULL! So better use a second variable for the return code and check that before assigning to Buffer.
Buffer = realloc(Buffer, wcslen(Buffer) + wcslen(wsGuid) + 1);
wcscat(Buffer,wsGuid);

また:

さらに、EvtRender のエラー チェックを改善する必要があります。また、pRenderedValues[i] にアクセスする前に dwPropertyCount を確認する必要があります。

ところで、wprintf(L"Buffer = %s",Buffer);wprintf では (%ls の代わりに %s を使用) で十分です。

最後の質問: 符号なしの値をバッファに追加する場合はwsprintf、文字列への書き込みに使用できます。C++ のみで実行できる場合は、使用を検討する必要がありますstd::wstring。これは、バッファを適切なサイズに割り当てるという点で、はるかに簡単です。

于 2013-10-01T10:02:56.513 に答える