系统为我们提供的线程级别的 SetLastError/GetLastError,有时候我们自己的程序中,因为同一个Error code可以有多种错误表示,
光有Error code还是不够的,希望能有SetLastErrorString/GetLastErrorString 这样的操作。遗憾的是,系统并没有提供这样的操作,所以我想自己来实现.当然,系统定义的Error code可以通过FormatMessage来得到字符串描述,不予考虑,主要是实现自定义的Error code.因为自定义的Error code,可以有多个不同的字符串描述,比如文件打开失败这样的一个错误,可以定义一个错误码,但是错误描述不能一样,应该文件名不一样.有两点需要注意:
1.Set/Get 可以在不同的Dll内.
2.必须线程级别的,能和SetLastError/GetLastError 配套使用.
要实现这样的功能,大家有没有什么好的想法和建议可以提供给我?

解决方案 »

  1.   

    用TLS。程序初始化时用TlsAlloc分配一个TLS索引,将其保存到全局变量,程序结束时用TlsFree释放。运行中SetLastError用TlsSetValue设置(错误码或错误信息或结构指针都可以),GetLastError用TlsGetValue来取,这两个函数的dwTlsIndex参数都用前面提到的全局变量。
      

  2.   


    Pipi0714,能说的详细点吗?另外,我说的线程级别,是说每个线程都有自己的错误信息,互补影响.我的想法是主模块定义这样的结构,其中会记录线程的ID,用以区分,
    不过这样做的话,第一需要将这个结构的相关信息(至少是地址)传到所有模块,以便所有的模块都能设置错误信息;
    第二就是,一个线程结束之后,后面新生成的线程可能会和之前的线程ID冲突,不保险。
      

  3.   


    请问一下,如果一个程序中有 N 个线程在跑,每个线程要需要设置自己的信息,那是否是应该要为每个线程分别产生自己的TLS索引 ?
    那样设置的时候,不同的线程用不同的索引进行操作?
      

  4.   

    cnzdgs,测试过你的方法,确实可行,也正是我想要的结果,谢谢!