2

ReadFile winapi 関数を呼び出して、virtualbox shated フォルダーからデータを読み取ります。ReadFile は失敗します。GetLastError が 183 エラー コード「そのファイルが既に存在する場合、ファイルを作成できません」をスローしています。時々、VMware 共有フォルダで発生します。

私のコード例

bool ret = ReadFile(hFile, buf, size, &bytesRead, nullptr);
if (ret == FALSE)
{
    logger << L"err: " + ToString(GetLastError());
}

//out:
//err: 183

誰でも奇妙なエラーで私を助けることができますか?

4

1 に答える 1

-1

まず、あなたのコード スニペットは少し...おかしくなっています。ReadFile は、BOOL (C に「bool」が存在する前に存在した Microsoft 定義の型) を返します。次に、それを C スタイルの bool に割り当て、その bool を MS 定数 'FALSE' と比較します。書かれているように、それは間違っていませんが、さまざまな形式のブール値を不必要に切り替えるのは悪い考えです。テストの実際の意味を理解するのが難しくなる傾向があるためです。

第二に、このコードは失敗しているコードではないのではないかと思います!

私がこれを言うのは、ReadFile のテストの意味を単に反転するだけで、記述された動作を生成できるからです。つまり、ReadFile が true を返したときに GetLastError をチェックすると、(今日の私のマシンでは、シリアル ポートを読み取るときに) エラー 183 が返されます。したがって、実際のコードでは、OPが実際にブール値テストを何らかの形で無効にしたため(その日の前半に行ったように)、明らかな偽のReadFileエラーが発生したと思われます。

これに対する私の解決策は、テストをマフィングしない可能性を最大限に高めるために、できるだけ少ない形式のブール値を使用して、テストをできるだけシンプルに書き直すことです。

コードを次のように変更すると (他の場所で ReadFile の戻り値を実際に必要としない場合):

if (!ReadFile(hFile, buf, size, &bytesRead, nullptr))
{
    DWORD err = GetLastError();
    logger << L"err: " + ToString(err);
}

そのコードは、問題のテストの意味を簡単に理解できるようにし、テストを間違って書く可能性を減らします。

本当に「ret」を保持する必要がある場合は、次のようにします。

BOOL ret = ReadFile(hFile, buf, size, &bytesRead, nullptr);
if (!ret)
{
    DWORD err = GetLastError();
    logger << L"err: " + ToString(err);
}

どちらの場合も、ログ行から GetLastError 呼び出しを引き出したことに気付くでしょう。これは、ReadFile の呼び出しと GetLastError の呼び出しの間に何も起こらないようにするためです。

編集:私の意見を明確にするために改訂されました。元のバージョンでは、OP が失敗したコードとは異なるコードを投稿したと考えているとは述べていませんでした。

于 2013-01-09T20:59:26.463 に答える