Win 32 GetLasrError実装

1374 ワード

 Windows       windows      

DWORD GetLastError(VOID); 呼び出し関数を返すエラー情報.彼はどうやって実現したのですか.プロセスはただのコンテナであり、スレッドのコンテナであり、すべての命令がスレッドの下で実行されていることを知っています.1つのアプリケーションには、プライマリ・スレッドと呼ばれる少なくとも1つのスレッドがあり、プライマリ・スレッドはセカンダリ・スレッドを作成できます.各スレッドには独自のメモリ領域があります.tiddata(マルチスレッド、C実行ライブラリerrno).プログラム(スレッド)が関数を実行すると、_tiddataの_terrno変数にエラー情報が設定されます._tiddataのソースコードはVS src mtdll.hにあります.D:Program Files(x 86)Microsoft Visual Studio 12.0VCcrtsrcの下にあります.以下のようにします.
/* Structure for each thread's data */
struct _tiddata {
    unsigned long   _tid;       /* thread ID */
    uintptr_t _thandle;         /* thread handle */
    int     _terrno;            /* errno value */
   void *      _initaddr;      /* initial user thread address */
    。。。。
    };

GetLastErrorを呼び出すと_terrnoの値は戻せばいいです.DOWRD GetLastError() { _piddate ptd = _getptd_noexit(); return (&ptd->_terrno); } 実はもちろんそう簡単ではありません.私はただ列を挙げただけです.実際にはTLSGetValueによりマスタスレッドデータブロックアドレスを取得する.TLS-スレッド領域記憶空間.
参考『windowsコアプログラミング』