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)