// MIDLWrapper.cpp : Just calls the built-in midl.exe with the given arguments. #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include #include #include #include using namespace std; int wmain(int argc, wchar_t* argv[], wchar_t* envp[]) { #ifndef NDEBUG fwprintf(stderr, L"######### im in ur IDE, compiling ur c0des ########\n"); #endif int pathIndex = -1; for (int i = 0; envp[i]; ++i) if (!wcsncmp(envp[i], L"PATH=", 5)) { pathIndex = i; break; } if (pathIndex == -1) { fwprintf(stderr, L"Couldn't find PATH environment variable!\n"); return -1; } wchar_t* vcbin = wcsstr(envp[pathIndex], L"Tools\\vcbin"); if (!vcbin) { fwprintf(stderr, L"Couldn't find Tools\\vcbin in PATH!\n"); return -1; } wchar_t saved = *vcbin; *vcbin = 0; wchar_t* afterLeadingSemiColon = wcsrchr(envp[pathIndex], ';'); if (!afterLeadingSemiColon) afterLeadingSemiColon = envp[pathIndex] + 5; // +5 for the length of "PATH=" else afterLeadingSemiColon++; *vcbin = saved; size_t pathLength = wcslen(envp[pathIndex]); wchar_t* trailingSemiColon = wcschr(vcbin, ';'); if (!trailingSemiColon) trailingSemiColon = envp[pathIndex] + pathLength; int vcbinLength = trailingSemiColon - afterLeadingSemiColon; size_t newPathLength = pathLength - vcbinLength; wchar_t* newPath = new wchar_t[newPathLength + 1]; // Copy everything before the vcbin path... wchar_t* d = newPath; wchar_t* s = envp[pathIndex]; while (s < afterLeadingSemiColon) *d++ = *s++; // Copy everything after the vcbin path... s = trailingSemiColon; while (*d++ = *s++); envp[pathIndex] = newPath; #ifndef NDEBUG fwprintf(stderr, L"New path: %s\n", envp[pathIndex]); #endif wchar_t** newArgv = new wchar_t*[argc + 1]; for (int i = 0; i < argc; ++i) { size_t length = wcslen(argv[i]); newArgv[i] = new wchar_t[length + 3]; *newArgv[i] = '\"'; wcscpy_s(newArgv[i] + 1, length + 2, argv[i]); *(newArgv[i] + 1 + length) = '\"'; *(newArgv[i] + 2 + length) = 0; } newArgv[argc] = 0; return _wspawnvpe(_P_WAIT, L"midl", newArgv, envp); }