#include #include static const wchar_t prefix[4] = {L'\\',L'\\',L'?',L'\\'}; static const size_t m = 32768; static wchar_t* __cdecl c2w(const char *c) { size_t l = mbstowcs(NULL,c,0); wchar_t *w = (wchar_t *)calloc(l+1,sizeof(wchar_t)); if(w == NULL) return NULL; if( mbstowcs(w,c,l) == l) { return w; }else { free(w); return NULL; } } static wchar_t* __cdecl c2w_path(const char *c) { wchar_t *w = c2w(c); int r = 0; if(w == NULL) return NULL; r = wcsncmp(w,prefix,4); if(0 != r) { wchar_t *ww = (wchar_t *)calloc(m + 4,sizeof(wchar_t)); if(ww == NULL) { free(w); w = NULL; }else { memcpy(ww,prefix,sizeof(prefix)); if(NULL == _wfullpath(ww+4,w,m)) { free(ww); ww = NULL; } free(w); w = ww; } } return w; } FILE * __cdecl openfile(const char * path, const char *flags) { wchar_t* fn = c2w_path(path); wchar_t* fg = NULL; FILE *fp = NULL; if(fn == NULL) return NULL; fg = c2w(flags); if(fg == NULL) { free(fn); return NULL; } fp = _wfopen(fn,fg); free(fg); free(fn); return fp; }