Программы участников Нахождение всех установленных VisualStudio [devenv.exe]

RET

Посетитель
Новичок
Сообщения
27
Реакции
16
Собственно сабж свежий, мож кому пригодится, там и нахождение всех установленных студий и пример использования OpenMP и замер скорости выполнения участка кода. Всё в сорцах закомментировано, авось кому надо. Компилится под 2019 Visual Studio C++ или Intel C++ без вопросов и лишних зависимостей (если OpenMP не врубать).
Код:
//(C)2021 SYSENTER
//Если под х64, то при поиске в реестре - вместо
////HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\VS7
// добавлять WOW6432Node
//т.е. путь в реестре //HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7
//Поэтому до кучи добавил переопределение разрядности
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <omp.h>

#define MAXVER 20

//Частота генератора
volatile LARGE_INTEGER li_freq;
//Глобальный счетчик
volatile int ix[21] = {0};

//_______________________________________________________________________________________________________
//Есть ли файло?
bool __fastcall FileExists(char* szFullFileName)
{
    return (GetFileAttributesA(szFullFileName) != DWORD(-1));
}

//_______________________________________________________________________________________________________
//Функа для замера текущих тиков проца ;)
__forceinline double   PerfCounterX()
{
    LARGE_INTEGER li_pc;
    if (TRUE != QueryPerformanceCounter(&li_pc))
    {
        printf("Error in QueryPerformanceCounter() - Err=%d\n", GetLastError());
        return -1.;
    }
    return (double)li_pc.QuadPart / li_freq.QuadPart;
}

//________________________________________________________________________________________________________
//Дополнительная проверка в папке по умолчанию типа такого
//C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe

BOOL AdvCheck(IN int iVer, OUT char* szVS_AdvPath)
{
    {
        for (int i = 0; i <= MAXVER; i++)
        {
            if (ix[i] == iVer || ix[i] == iVer - 10) return FALSE;
        }
    }
   
    sprintf(szVS_AdvPath, "C:\\Program Files (x86)\\Microsoft Visual Studio 1%d.0\\Common7\\IDE\\devenv.exe", iVer);
    //printf("%s:Try:: %s\n", __FUNCTION__, szVS_AdvPath);
    if (FileExists(szVS_AdvPath))
    {
        //О и файло студии есть!
        printf("[Adv: VS20%d] = %s\n", iVer, szVS_AdvPath);
        ix[iVer] = iVer;
        return TRUE;
    }
    else
    {
        sprintf(szVS_AdvPath, "C:\\Program Files (x86)\\Microsoft Visual Studio\\%d.0\\Common7\\IDE\\devenv.exe", iVer);
        if (FileExists(szVS_AdvPath))
        {
            //О и файло студии есть!
            printf("[AdvX: VS20%d] = %s\n", iVer, szVS_AdvPath);
            ix[iVer] = iVer;
            return TRUE;
        }
        if (iVer >= 10)
        {
            sprintf(szVS_AdvPath, "C:\\Program Files (x86)\\Microsoft Visual Studio\\20%d\\Professional\\Common7\\IDE\\devenv.exe", iVer);
            //printf("%s:Try2:: %s\n", __FUNCTION__, szVS_AdvPath);
            if (FileExists(szVS_AdvPath))
            {
                //О и файло студии есть!
                printf("[Adv2: VS20%d] = %s\n", iVer, szVS_AdvPath);
                ix[iVer] = iVer;
                return TRUE;
            }
            else
            {
                sprintf(szVS_AdvPath, "C:\\Program Files (x86)\\Microsoft Visual Studio\\20%d\\Ultimate\\Common7\\IDE\\devenv.exe", iVer);
                //printf("%s:Try3:: %s\n", __FUNCTION__, szVS_AdvPath);
                if (FileExists(szVS_AdvPath))
                {
                    //О и файло студии есть!
                    printf("[Adv3: VS20%d ] = %s\n", iVer, szVS_AdvPath);
                    ix[iVer] = iVer;
                    return TRUE;
                }
                else
                {
                    sprintf(szVS_AdvPath, "C:\\Program Files (x86)\\Microsoft Visual Studio\\20%d\\Corporative\\Common7\\IDE\\devenv.exe", iVer);
                    //printf("%s:Try4:: %s\n", __FUNCTION__, szVS_AdvPath);
                    if (FileExists(szVS_AdvPath))
                    {
                        //О и файло студии есть!
                        printf("[Adv4: VS20%d] = %s\n", iVer, szVS_AdvPath);
                        ix[iVer] = iVer;
                        return TRUE;
                    }
                    else
                    {
                        sprintf(szVS_AdvPath, "C:\\Program Files (x86)\\Microsoft Visual Studio\\20%d\\Community\\Common7\\IDE\\devenv.exe", iVer);
                        //printf("%s:Try5:: %s\n", __FUNCTION__, szVS_AdvPath);
                        if (FileExists(szVS_AdvPath))
                        {
                            //О и файло студии есть!
                            printf("[Adv5: VS20%d] = %s\n", iVer, szVS_AdvPath);
                            ix[iVer] = iVer;
                            return TRUE;
                        }
                        else
                        {
                            sprintf(szVS_AdvPath, "C:\\Program Files (x86)\\Microsoft Visual Studio\\20%d\\Enterprise\\Common7\\IDE\\devenv.exe", iVer);
                            //printf("%s:Try6:: %s\n", __FUNCTION__, szVS_AdvPath);
                            if (FileExists(szVS_AdvPath))
                            {
                                //О и файло студии есть!
                                printf("[Adv6: VS20%d] = %s\n", iVer,szVS_AdvPath);
                                ix[iVer] = iVer;
                                return TRUE;
                            }
                        }
                    }
                }
            }
        }
    }
    return FALSE;
}

//________________________________________________________________________________________________________
int main()
{
    if (TRUE != QueryPerformanceFrequency((LARGE_INTEGER*)&li_freq))
    {
        printf("Error in QueryPerformanceFrequency() - Err=%d\n", GetLastError());
        return -1;
    }

    //HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7
    //10.0 - 19.0

    double t1_0 = PerfCounterX();
    //распараллеливаем цикл на ядра через OpenMP для прикола ;)
    //не удивляемся, что вывод идёт не по порядку но нам пофиг, мы выигрываем микросекунды :)))
    //Включите в компиляторе /openmp - если делать нефиг
#pragma omp parallel
    {
#pragma omp for private(ix)
        //Перебор всех студий начиная с 2010
        for (int i = 0; i <= MAXVER; i++)
        {
            BOOL bOk = FALSE;
            char szPathVS[MAX_PATH * 2] = { 0 };
            char szCurPathVS[MAX_PATH * 2] = { 0 };
            char szCurEnv[MAX_PATH * 2] = { 0 };
            char szTemp[MAX_PATH * 2] = { 0 };
            char szT[10] = { 0 };


            //Снасала ищем через реестр
            HKEY hKey;
            char szReg[MAX_PATH * 2] = { 0 };
            DWORD dwRegL = sizeof(szPathVS) - 1;
#ifdef _IS_64BIT
            if (ERROR_SUCCESS == RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VS7", 0, KEY_QUERY_VALUE, &hKey))
#else //32 bit
            if (ERROR_SUCCESS == RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VS7", 0, KEY_QUERY_VALUE, &hKey))
#endif
            {
                sprintf(szT, "%d.0", i + 10);
                //printf("i=%d; Ok\nszT=%s\n", i, szT);
                if (ERROR_SUCCESS == RegQueryValueExA(hKey, szT, NULL, NULL, (LPBYTE)szPathVS, &dwRegL))
                {
                    strcat(szPathVS, "Common7\\IDE\\devenv.exe");
                    if (FileExists(szPathVS))
                    {
                        bOk = TRUE;
                        //О и файло студии есть!
                        printf("[Reg.. VS%d] = %s\n", i+10, szPathVS);
                        ix[i] = i;
                    }
                }
                RegCloseKey(hKey);
                if (bOk) continue;
            }
                //Потом через Системные переменные среды (применимо только к полнофункциональным студиям Pro и Enterprise)
               sprintf(szTemp, "VS1%d", i); //здесь название студии
               sprintf(szT, "VS201%d", i);
               sprintf(szCurEnv,"%s0COMNTOOLS", szTemp); //Формируем название системной переменной
               if (GetEnvironmentVariableA(szCurEnv, szCurPathVS, MAX_PATH * 2 - 1))
               {
                   //Есть такая переменная - уходим в подкаталоги
                  // printf("Path in Environment %s = %s\n", szTemp, szCurPathVS);
                   char* szNtemp = strrchr(szCurPathVS, '\\');
                   if (szNtemp)
                   {
                      szNtemp[0] = 0;
                      szNtemp = strrchr(szCurPathVS, '\\');
                       if (szNtemp)
                       {
                           szNtemp[sizeof(char)] = 0;
                           sprintf(szPathVS, "%sIDE\\devenv.exe", szCurPathVS);
                           if (FileExists(szPathVS))
                           {
                               //О и файло студии есть!
                               printf("[Env %s] = %s\n", szT, szPathVS);
                               ix[i] = i;
                           }
                           else
                           {
                               char szAdvVS[MAX_PATH * 2] = { 0 };
                               AdvCheck(i, szAdvVS);
                           }
                       }
                   }
               }
               else
               {
                   //Если через COMMONTOOLS не нашли то более поздние версии через VS....INSTALLDIR
                   sprintf(szTemp, "VS201%d", i); ////здесь название студии
                   sprintf(szCurEnv, "%sINSTALLDIR", szTemp); //Формируем название системной переменной

                   //printf("---%s\n", szCurEnv);

                   if (GetEnvironmentVariableA(szCurEnv, szPathVS, MAX_PATH * 2 - 1))
                   {
                       //Есть такая переменная
                       strcat(szPathVS, "\\Common7\\IDE\\devenv.exe");
                       if (FileExists(szPathVS))
                       {
                           //О и файло студии есть!
                           printf("[Env %s] = %s\n", szT, szPathVS);
                           ix[i] = i;
                       }
                       else
                       {
                           char szAdvVS[MAX_PATH * 2] = { 0 };
                           AdvCheck(i, szAdvVS);
                       }                   
                   }
                   else
                   {
                       char szAdvVS[MAX_PATH * 2] = { 0 };
                       AdvCheck(i, szAdvVS);
                   }
               }
           }
     }
        double t1 = PerfCounterX();
        printf("Found in: %.8lf[sec]\n", t1 - t1_0);

        printf("Press any key to exit...\n");
        _getch();
}

//P.S.: для чего это нужно иногда.
//Недавно стала задача автоматически собирать солюшены из своего собственного приложения
//Так как после 2010 студии к сожалению уже не прокатывает как для 2010 студии - брать чисто в реестре
//вот так:
//***************
////Получение пути к devenv 10 -й студии
//BOOL GetStudioPath()
//{
//    LONG lResult;
//    LPCWSTR lpSubKey = L"SOFTWARE\\Microsoft\\VisualStudio\\10.0_Config";
//    HKEY hKey;
//    if (lResult = RegOpenKeyEx(HKEY_CURRENT_USER, lpSubKey, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
//    {
//        printf("Error open key\n");
//    }
//    else
//    {
//        DWORD BuffLen = sizeof(wcDevenv);
//        if (RegQueryValueEx(hKey, L"InstallDir", NULL, NULL, (LPBYTE)&wcDevenv, &BuffLen) != ERROR_SUCCESS)
//        {
//            printf("Error RegQueryValue key\n");
//            RegCloseKey(hKey);
//            return FALSE;
//        }
//        else
//        {
//            wcscat(wcDevenv, L"devenv.exe");
//            wprintf(L"Path: %s Found \n________________________________________________________________________\n", wcDevenv);
//        }
//        RegCloseKey(hKey);
//        return TRUE;
//    }
//    return FALSE;
//}
//*************

//То путём небольших исследований пришлось сделать по другому, это с угетом что ни через SetipAPI ,
// ни через WMI мы не получим всех VisualStudio что установлены, и конкретно нас интересующего
//его шелла devenv.exe так необходимого для пересборки криптора и так удобного.

//P.P.S: за openMP и замеры производительности не обессудьте - это кусок проекта, так сказать "надо".

// С уважением Sysenter aka HiEndsoft, aka RET, aka DartSydius aka... пофиг :)
//+++++++++++++++++++++++++++++++
//ADDED: реестр + по умолчанию папки
 

Прикрепленные файлы:

Последнее редактирование:
  • Понравилось
Реакции: mak

RET

Посетитель
Новичок
Сообщения
27
Реакции
16
Сабж обновил, теперь ищется всё
 
Верх Низ