|
> もし必要でしたら、ログの出力に失敗した場合はdump.txtに何か情報を出すよ
>うにする、っていう対応なら出来ますけども…。念のためそういう処理を入れて
>みます。というか、たしかにログを出した場合もdump.txtに何か出すようにして
>みます。
その後も極まれに filterlog.txt に振り分け条件がかかれない
ことが発生しています。
filterlog.txt nolog
というのが振り分け条件書き込みに失敗したログだと思います。
dump.txt を取り出し始めて初めて発生しました。
filterlog.txt のアクセスは以下のような感じだと思います。
送受信の開始直前に hidebiff でアクセス。
受信処理中に秀丸メールでアクセス。
受信がひと段落した時に hidebiff でアクセス。
送受信の開始直前に DLL から EXE を CreateProcess で起動して
filterlog.txt をオープン(行数を数えている)しています。
DLL では EXE の終了を待っています。
その後、秀丸メール本体で振り分けログが追記されます。
受信がひと段落した時に DLL から EXE を CreateProcess で起動して
filterlog.txt をオープン(数えた行数以降を検索)しています。
DLL では EXE の終了を待っています。
filterlog.txt が秀丸メール本体で開けないのは、
- 送受信の開始直前の処理中に秀丸メールの処理が行われている
- 送受信の開始直前の処理でファイルが正しく閉じられていない
だと思いますが、前者も後者も考えにくいなぁ、と思っています。
以下が、実際に使用しているファイル内容を取得するための関数です。
/**
* 指定されたファイルの内容を取得する。
*
* 呼び出し元で戻り値のポインタを開放しなければならない。
* size が NULL の場合は、当然ファイルサイズはポインタに出力されない。
*
* この関数は [ファイル内容] + ['\0'] という形式でポインタを返す。
* ただし出力される size は最後の \0 を含まない。
*
* ファイルが存在しない場合、処理に失敗した場合は NULL を返す。
*
* @param [in] filename ファイルパス
* @param [out] size ファイルサイズ
* @return ファイルの内容
*/
static char *getFileContents(const char *filename, DWORD *size) {
HANDLE file1;
HANDLE map1;
DWORD hsize1, lsize1;
char *view1;
char *result = NULL;
static int count = 0;
string map("filemapping");
char buf[6] = {0};
_itoa(count++, buf, 10);
map += buf;
// ファイルの生成
file1 = CreateFile(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);
if (file1 == INVALID_HANDLE_VALUE) {
// ファイルが存在しない
return result;
}
// サイズの取得
lsize1 = GetFileSize(file1, &hsize1);
if (hsize1 != 0) {
// ファイルが大きすぎる場合はエラーにしちゃう
return result;
}
// メモリマップドファイルの生成
map1 = CreateFileMapping(file1, NULL, PAGE_READONLY, hsize1, lsize1, map.c_
str());
if (map1 == NULL) {
// エラー処理
msgbox("error 32");
CloseHandle(file1);
return result;
}
// マップビューの生成
view1 = (char *)MapViewOfFile(map1, FILE_MAP_READ, 0, 0, 0);
if (view1 == NULL) {
// エラー処理
msgbox("error 42");
CloseHandle(map1);
CloseHandle(file1);
return result;
}
result = (char *)malloc(lsize1 + 1);
if (result) {
memcpy(result, view1, lsize1);
result[lsize1] = '\0';
}
// アンマップ
if (!UnmapViewOfFile(view1)) {
// エラー処理
msgbox("error 5s");
}
CloseHandle(map1);
CloseHandle(file1);
if (size != NULL) {
*size = lsize1;
}
return result;
}
何かアドバイスいただければ幸いです。
|
|