なぜ私のVector が神秘的にクリアされるのですか?
-
13-10-2019 - |
質問
C ++でWindows EventLogファイル(.EVT)からデータを読み取り、保存するプログラムを作成しています。私は通話を使用しています OpenBackUpeventLog(servername、filename) と readeventlog(...). 。また、これを使用してください: Peventlogercord
とにかく、すべてのコードを提供せずに、ここに基本的なアイデアがあります。
1. OpenBackUpeVentLog()を使用して.EVTファイルのハンドルを取得し、ファイル名を渡します。
2.次に、readeventlog()を使用して、不明な数のイベントログメッセージでバッファーを埋めます。
3.バッファーを通過して、各メッセージをベクトルに追加します
4.ファイルの最後に到達するまで、バッファー(手順2および3を繰り返します)を埋め続けます。
これがベクトルを埋めるための私のコードです:
vector<EVENTLOGRECORD> allRecords;
while(_status == ERROR_SUCCESS)
{
if(!ReadEventLog(...))
CheckStatus();
else
FillVectorFromBuffer(allRecords)
}
// Function FillVectorFromBuffer
FillVectorFromBuffer(vector(EVENTLOGRECORD) &allRecords)
{
int bytesExamined = 0;
PBYTE pRecord = (PBYTE)_lpBuffer; // This is one of the params in ReadEventLog()
while(bytesExamined < _pnBytesRead) // Another param from ReadEventLog
{
EVENTLOGRECORD currentRecord = (EVENTLOGRECORD)(pRecord);
allRecords.push_back(currentRecord);
pRecord += currentRecord->Length;
bytesExamined += currentRecord->Length;
}
}
とにかく、私がこれを実行するたびに、それはファイル内のすべてのイベントログを取得し、ベクトルは私が望むすべてを持っています。しかし、この線とすぐに:
if(!ReadEventLog())
呼び出されてtrueを返します(別名readeventlog()falseを返します)、その後、私のベクトル内のすべてのフィールドがゼロに設定されます。
ベクトルにはまだ正しい数の要素が含まれています。これは、Peventlogrecord構造体のすべてのフィールドがゼロになったというだけです。
デバッグ体験を改善した人は、何かアイデアを持っていますか?
ありがとう。
編集:Michael Burrの提案ごとにコードを更新しました。上記のコードは、私が抱えていた元の問題を排除するようになりました。
編集2:Michael Burrの他の提案に対処する:EventLogrecordの変動部分のため、EventLogrecordに加えて、私が興味を持っている他のいくつかの変数を備えたカスタム構造体を作成します。
struct CustomRecord
{
EVENTLOGRECORD recordHeader;
string sourceName;
string computerName;
string message;
};
可変部分を引き出すことは些細なタスクではありませんが、ここにあなたが始めるための優れた例があります:イベント情報のクエリ
解決
私はあなたのベクトル(私はそれをとして読むべきだと思うと思います vector<PEVENTLOGRECORD>
, 、 いいえ vector(PEVENTLOGRECORD)
)データのコピーではなく、データへのポインターが含まれています。実際のデータを所有しているものは何でも、 ReadEventLog()
これ以上のデータがないことを示します。
考えられる修正の1つは、ポインターではなくベクトルにデータ自体を保存する必要があることです。ベクトルを作成します vector<EVENTLOGRECORD>
ポインター自体の代わりに、PeventLogrecordポインターの控えめなコンテンツをベクトル(コピーを作成するはずです)に保存します。
allRecords.push_back(*currentRecord);
更新:MSDNをよく見ると、 EVENTLOGRECORD
コンパイラが「ヘッダー」部分のみを知っている厄介な可変長構造体の1つです。変数長データはそのヘッダーに続きますが、厳密に言えば、コンパイラに関する限り、構造体の一部ではありません。だからa vector<EVENTLOGRECORD>
データの変数部分をキャプチャしません。で初期化できるカスタムクラスを作成する必要があります PEVENTLOGRECORD
変数データを適切に処理する方法を知っているか、構造体とその変数データを適切にサイズの、動的に割り当てられたバイト配列にコピーする必要があり、その割り当てブロックへのポインターを保存する必要があります(ただし、解放しないでくださいベクトルがそれで完了するまでブロックします - スマートポインターがここで役立つ可能性があります)。
イベントログレコードデータをインテリジェントに扱うことができるクラスを考案することは、前もって少し作業であるかもしれませんが、レコードで重要な作業を行っている場合、長期的には作業が報われると思います。ネット上のクラスを見つけることができます。これは、自分のものの出発点として使用または使用できます(ceventlogrecordが見つかりました。 http://www.naughter.com/serv.html, 、 例えば)。