Version des .NET Framework auslesen



  • Ich möchte über autostart ein Programm das in C++/CLI geschrieben ist starten lassen, das geht natürlich nicht wenn auf dem Zielrechner das Framework nicht installiert ist.. zu diesem zweck hab ich versucht ein Programm zu schreiben, welches überprüft ob das Framework installiert ist.. allerdings funktioniert es nicht, und ich finde den Wurm nicht..
    GetFileVersionInfoSize gibt immer 0 zurück, ich weiss jedoch nicht wiiso.. hier der Code:

    #include "stdafx.h"
    #include <string>
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    typedef std::basic_string<TCHAR> tstring;
    
    int _tmain()
    {
    	tstring File = _T("mscorlib.dll");
    	tstring Directory = _T("%systemroot%\\Microsoft.NET\\Framework\\v2.0.50727\\");
    	tstring Path = _T("%systemroot%\\Microsoft.NET\\Framework\\v2.0.50727\\mscorlib.dll");
    	DWORD dwHandle;
    	DWORD  InfoSize = GetFileVersionInfoSizeW(Path.c_str(), &dwHandle);
    	if (InfoSize > 0)
    	{
    		LPVOID vData = malloc(InfoSize);
    		int Worked = GetFileVersionInfo(Path.c_str(), dwHandle, InfoSize, vData);
    		if (Worked != 0)
    		{
    			UINT length;
    			VS_FIXEDFILEINFO *fInfo = NULL;
    			Worked = VerQueryValue(vData, _T("\\"), (LPVOID*) &fInfo, &length);
    			if (Worked != 0)
    			{
    				ULONGLONG FileVersion = ((ULONGLONG)fInfo->dwFileVersionLS)+((ULONGLONG)fInfo->dwFileVersionMS << 32);
    				cout << FileVersion;
    			}
    		}
    		free(vData);
    	}
    
    	string temp;
    	cin >> temp;
    	return 0;
    }
    

    ich gebe zu das ich teile des Programms noch nicht verstanden habe und es zum grössten Teil aus beispielen (auch von diesem Forum) zusammengesetzt habe.. Doch wieso der Fehler da auftritt verstehe ich wirklich nicht..

    mfg



  • Warum rufst Du explizit

    GetFileVersionInfoSizeW

    und nicht

    GetFileVersionInfoSize

    auf?



  • Bei mir zumindest gibt's keine Umgebungsvariable namens "systemroot", welche hier ja wahrscheinlich zu "C:\Windows" expandieren sollte.

    Irgendwie finde ich den Schnipsel auch ein wenig sinnfrei, die Version im Ordner "v2.0.50727" ist wohl Version "2.0.5727".. Keine Ahnung, ob man das NET-Framework immer in "C:\Windows\Microsoft.NET\Framework" findet, aber falls ja, könntest du alle Ordnernamen darin auslesen und diejenigen, die mit "v" und anschließender Ziffer anfangen, bezeichnen Versionen. Dann hast du alle installierten Versionen..



  • #include <windows.h>
    #include <tchar.h>
    #include <shlwapi.h>
    
    BOOL IsFrameworkInstalled(ULONGLONG ullVersion)
    {
        DWORD   dwValue, dwSize, dwType;
        TCHAR   sz[MAX_PATH];
        HKEY    hKey;
        BOOL    blRet = FALSE;
    
        wsprintf(sz,
                TEXT("Software\\Microsoft\\NET Framework Setup\\NDP\\v%u.%u.%u"),
                static_cast<unsigned>((ullVersion >> 48) & 0xFFFF),
                static_cast<unsigned>((ullVersion >> 32) & 0xFFFF),
                static_cast<unsigned>((ullVersion >> 16) & 0xFFFF));
    
        if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, sz, 0, STANDARD_RIGHTS_READ | KEY_QUERY_VALUE, &hKey))
        {
            if(ullVersion & 0xFFFF)
            {
                dwSize = sizeof(dwValue);
                if(ERROR_SUCCESS == RegQueryValueEx(hKey, TEXT("SP"), NULL, &dwType, (BYTE*)&dwValue, &dwSize))
                {
                    if(((dwType == REG_DWORD) || (dwType == REG_BINARY)) && (dwSize == sizeof(dwValue)) && ((ullVersion & 0xFFFF) <= dwValue))
                    {
                        blRet = TRUE;
                    }
                }
            }
            else 
            {
                blRet = TRUE;
            }
            RegCloseKey(hKey);
        }
    
        return blRet;
    }
    
    int WINAPI _tWinMain(HINSTANCE,HINSTANCE,LPTSTR, int)
    {
        // Prueft auf Version 2.0.50727 mit Service Pack 1
        if(IsFrameworkInstalled(MAKEDLLVERULL(2, 0, 50727, 1)))
        {
            MessageBox(NULL, TEXT("Toll"), NULL, MB_OK);
        }
    
        // Prueft auf Version 2.0.50727 ohne Beachtung des SP
        if(IsFrameworkInstalled(MAKEDLLVERULL(2, 0, 50727, 0)))
        {
            MessageBox(NULL, TEXT("Toll"), NULL, MB_OK);
        }
    
        return 0;
    }
    


  • okey, dann ist das über die Registry wohl die bessere Methode, ich danke, es funktioniert einwandfrei 🙂

    @Badestrand: Dieses vorgehen hab ich von hier: http://msdn.microsoft.com/en-us/kb/kb00318785.aspx
    Ich dachte zuerst auch ich könnte nur überprüfen ob der Ordner vorhanden ist, aber ich war mir nicht sicher ob die Existenz des Ordners garantiert dass das Framework installiert ist. Es wäre ja z.b. möglich dass nach einer Deinstallation der Ordner trotzdem zurückbleibt (gibt es manchmal, in diesem Fall eine unbestätigter möglicher Fall)


Anmelden zum Antworten