0

私はこのコンパイラを使用しています:http ://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.7.2/32-bit/threads-posix/sjlj/x32-4.7.2-release-posix-sjlj -rev7.7z

コード:

#include <windows.h>
#include <iostream>
#include <imagehlp.h>

int main() {
   HANDLE process = GetCurrentProcess();
   if (GetLastError()) {
    printf("GetCurrentProcess failed: %d\n", GetLastError());
    return 1;
   }
   if (!SymInitialize(process, NULL, TRUE)) {
    printf("SymInitialize failed: %d\n", GetLastError());
    return 1;
  } else if (GetLastError()) {
    printf("SymInitialize returned true but failed nonetheless: %d\n", GetLastError());
    return 1;
  }
}

それは戻ります:SymInitialize returned true but failed nonetheless: 2

エラー番号2は、「システムが指定されたファイルを見つけることができない」ことを意味します。どのファイル、私はそれをここの文脈に置くことはできません。この関数が成功した場合、GetLastErrorはゼロでなければならないことをドキュメントから理解しています。

4

1 に答える 1

3

関数が成功したときにエラーをリセットしないことは非常に一般的です。また、「SymInitialize」が「dir1でファイルを探す、dir2でファイルを探す、...」という関数を内部的に呼び出す可能性があり、「dir1でファイルが見つかりませんでした」のエラーは2です。ここで、実際にSetLastError(0)を呼び出してエラーコードをクリアする必要があります。これは、SymInitializeのコードがそれを設定していないことを見逃しているか、意図的に行っている可能性があります。SymInitializeの結果をチェックして、成功したかどうかを確認する必要があります。成功しなかった場合は、エラーコードを確認します。しかし、GetLastError()はまさにそれであり、「最後の関数は成功しましたか」ではなく、最後に発生したエラーです。

于 2013-02-03T11:55:30.367 に答える