gpt4 book ai didi

c++ - _set_se_translator 的 'get' 等价物?

转载 作者:搜寻专家 更新时间:2023-10-31 00:42:32 25 4
gpt4 key购买 nike

我需要使用当前的翻译器手动翻译结构化异常。

我如何“获取”某人通过 _set_se_translator 设置的值?

最佳答案

更好(新)的方式

起初我没有意识到这一点,但是 SE 转换器是线程本地不是进程范围的。

所以这实际上是最好(也是最简单)的解决方案:

_se_translator_function _get_se_translator(void) {
_se_translator_function translator = _set_se_translator(NULL); // temporary
_set_se_translator(translator); // Restore the old value
return translator;
}

Hacky(旧)方式

没有直接的方法可以做到这一点,但如果您要冒一些不兼容的风险并深入研究 Visual C 运行时的内部结构,您可以破解这样的解决方案:

_se_translator_function __cdecl _get_se_translator(void) {
unsigned char const *p = (unsigned char const *)(&__uncaught_exception);
struct _tiddata {
unsigned long _tid;
void *_thandle;
int _terrno; unsigned long _tdoserrno;
unsigned int _fpds;
unsigned long _holdrand;
char *_token; wchar_t *_wtoken;
unsigned char *_mtoken;
char *_errmsg; wchar_t *_werrmsg;
char *_namebuf0; wchar_t *_wnamebuf0;
char *_namebuf1; wchar_t *_wnamebuf1;
char *_asctimebuf; wchar_t *_wasctimebuf;
void *_gmtimebuf;
char *_cvtbuf;
unsigned char _con_ch_buf[5];
unsigned short _ch_buf_used;
void *_initaddr; void *_initarg;
void *_pxcptacttab;
void *_tpxcptinfoptrs;
int _tfpecode;
void *ptmbcinfo; void *ptlocinfo;
int _ownlocale;
unsigned long _NLG_dwCode;
void *_terminate; void *_unexpected;
_se_translator_function _translator;
};
if (p[0] == 0x48) /* sub RSP, 0x28 */ { p += 4; } // x64 only
if (p[0] == 0xE8) /* call _getpid */ { ++p; } // must be true
void const *_getptd = p + *(long *)p + sizeof(long);
return ((struct _tiddata *(__cdecl *)(void))_getptd)()->_translator;
}

关于c++ - _set_se_translator 的 'get' 等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11944558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com