を使用してファイルに書き込んでいますofstream
。書き込みは非常に高速で、ファイルは非常に頻繁に閉じられ、開かれます。以下はコードです:
if( !(IS_ERROR(wcstombs_s( (size_t*)&out, fileRegNot, 1536, finalizedMessage, 1536 ))) )
{
while(reportTransferInProgress);
regFileBeingWritten = TRUE;
if(fileRegReportSent)
{
file.open("C:\\fileRegLog.txt", ios::out);
fileRegReportSent = FALSE;
}
else
file.open("C:\\fileRegLog.txt", ios::out | ios::app);
if(file.is_open() && file.good() && !file.fail() && !file.bad())
{
file<<fileRegNot<<"\n";
file.close();
}
regFileBeingWritten = FALSE;
}
ステートメントでアクセス違反が発生しますfile.close()
。プログラムが中断し、コンパイラは標準 fstream file
の次のコードにジャンプします(強調表示された行は中断した場所です)。
これはコール スタックです (startRecifyingNotifications は、ファイルが書き込まれている関数の名前です)。
これらは、fstream
ファイルのコード セグメント内のローカル変数の状態です。
ここで、_Myfile 変数は有効なメモリ位置を指していないようです。おそらく問題ですよね? しかし、最初に貼り付けたコード、つまり「file.close()」から関数が最初に呼び出された場所に戻ると、これらはローカル変数の状態です。
ここで、_Myfile 変数には有効なメモリ ロケーションとデータが含まれていることがわかります。私は何を間違っていますか?ファイルを書き込んで閉じる前に、考えられるすべてのチェックを使用しました。
if(file.is_open() && file.good() && !file.fail() && !file.bad())
{
file<<fileRegNot<<"\n";
file.close();
}
また、エラーが頻繁に発生することはありません。ファイルが継続的に書き込まれている間、数分間発生しないこともあれば、アプリケーションが実行されるとすぐにポップアップすることもあります。
これは元のエラー ステートメントです。
ここで私は正確に何を間違っていますか?
編集: (完全な機能コード)
DWORD WINAPI
startRecievingNotifications(
_In_ LPVOID lpArg)
{
HANDLE hComPort = *((HANDLE*)lpArg);
HRESULT hr;
SIMPLE_MESSAGE MessageEnvelop;
TCHAR processName[MAX_PATH];
WCHAR finalizedMessage[1536];
WCHAR pId[7];
INT pid, out;
ofstream file;
for(;;)
{
hr = FilterGetMessage(hComPort, &MessageEnvelop.MessageHeader, sizeof(SIMPLE_MESSAGE), NULL);
if(!IS_ERROR(hr) && checkMessage(MessageEnvelop.Message.Contents))
{
for(INT i = 0, j = 0; MessageEnvelop.Message.Contents[i] != '\0' && i < 1535; i++, j++)
{
if(i == 0)
{
for(; MessageEnvelop.Message.Contents[i] != '#' && i < 6; i++)
pId[i] = MessageEnvelop.Message.Contents[i];
pId[i] = '\0';
pid = _wtoi(pId);
if(getProcessName(pid, processName, TRUE))
{
for(j = 0; processName[j] != '\0'; j++)
finalizedMessage[j] = processName[j];
}
else
i = 0;
}
finalizedMessage[j] = MessageEnvelop.Message.Contents[i];
if(MessageEnvelop.Message.Contents[i + 1] == '\0')
finalizedMessage[j + 1] = '\0';
}
finalizedMessage[1535] = '\0';
appendSystemTime(finalizedMessage);
if( !(IS_ERROR(wcstombs_s( (size_t*)&out, fileRegNot, 1536, finalizedMessage, 1536 ))) )
{
while(reportTransferInProgress);
regFileBeingWritten = TRUE;
if(fileRegReportSent)
{
file.open("C:\\fileRegLog.txt", ios::out);
fileRegReportSent = FALSE;
}
else
file.open("C:\\fileRegLog.txt", ios::out | ios::app);
if(file.is_open() && file.good() && !file.fail() && !file.bad())
{
file<<fileRegNot<<"\n";
file.close();
}
regFileBeingWritten = FALSE;
}
}
}
}