| // 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 <process.h> |
| #include <stdio.h> |
| #include <string> |
| #include <windows.h> |
| |
| 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); |
| } |