SystemtippDieser Artikel bezieht sich auf ein anderes Betriebssystem als das von Ihnen verwendete. Für Sie möglicherweise nicht relevante Artikelinhalte wurden deaktiviert.
Dieser Artikel beschreibt, wie Sie die Registrierung zur Laufzeit den Installationspfad und die Version von Office-Anwendung bestimmen untersuchen können.
Jede Office-Anwendung ist eine Version zugeordnet unabhängige ProgID und CLSID. Sie können die Registrierung auf Schlüssel mit eines Servers CLSID und ProgID den Installationspfad und die Version von der Serveranwendung bestimmen untersuchen.
Erstellen einer MFC-Appwizard- mit dem Namen Office-Pfad . Wählen Sie im Schritt 1 des Anwendungs-Assistent Dialog Based und klicken Sie auf Fertig stellen .
Klicken Sie auf die Registerkarte Ressourcen und öffnen Sie das Dialogfeld IDD_OFFICEPATH_DIALOG .
Entfernen Sie die OK und Abbrechen-Schaltflächen im Dialogfeld.
Fügen Sie ein Bearbeitungsfeld auf das Dialogfeld und nennen Sie es IDC_PROGID .
Zwei Befehlsschaltflächen im Dialogfeld hinzufügen. Name der Befehlsschaltflächen IDPATH und IDVERSION und legen Sie die Beschriftungen auf GetPath und GetVersion bzw..
Starten Sie Klassen-Assistenten .
Fügen Sie einen Funktionshandler an die BN_CLICKED -Nachricht eines jede Befehlsschaltfläche.
Erstellen Sie eine Membervariable für Bearbeitungsfeld IDC_PROGID. Name der Member-Variable M_ProgID , und geben Steuerelement für die Kategorie und CEdit für den Variablentyp.
Schließen Sie die Klassen-Assistenten.
Der Datei OfficePathDlg.h der COfficePathDlg-Klasse fügen Sie die folgenden öffentlichen Member-Funktionen hinzu:
Fügen Sie die folgenden Funktionsdefinitionen OfficePathDlg.cpp:
void COfficePathDlg::OnPath()
{
LPOLESTR szwApp;
char szLocation[255], szApp[50];
// Get ProgID from EditBox
m_ProgID.GetWindowText(szApp, 50);
if (strcmp(szApp,"") == 0)
{
MessageBox("Type ProgID in EditBox", "Error");
return;
}
// Find number ofcharacters to be allocated
int len = strlen(szApp) + 1;
// Use OLE Allocator to allocate memory
szwApp = (LPOLESTR) CoTaskMemAlloc(len*2);
if (szwApp == NULL)
{
MessageBox("Out of Memory", "Error");
return;
}
// AnsiToUnicode conversion
if (0 == MultiByteToWideChar(CP_ACP, 0, szApp, len,
szwApp, len))
{
// Free Memory allocated to szwApp if conversion failed
CoTaskMemFree(szwApp);
szwApp = NULL;
MessageBox("Error in Conversion", "Error");
return;
}
// Get Path to Application and display it
if (!GetPath(szwApp, szLocation, 255))
MessageBox("Error Getting Path", "Error");
else
MessageBox(szLocation, "Path");
}
void COfficePathDlg::OnVersion()
{
CHAR szVersion[255], szApp[50];
// Get Version of Application
m_ProgID.GetWindowText(szApp, 50);
if (strcmp(szApp,"") == 0)
{
MessageBox("Type ProgID in EditBox", "Error");
return;
}
// Get Version and display it
if (!GetVersion(szApp, szVersion, 255))
MessageBox("Error Getting Version", "Error");
else
MessageBox(szVersion, "Version");
}
BOOL COfficePathDlg::GetPath(LPOLESTR szApp, LPSTR szPath, ULONG cSize)
{
CLSID clsid;
LPOLESTR pwszClsid;
CHAR szKey[128];
CHAR szCLSID[60];
HKEY hKey;
// szPath must be at least 255 char in size
if (cSize < 255)
return FALSE;
// Get the CLSID using ProgID
HRESULT hr = CLSIDFromProgID(szApp, &clsid);
if (FAILED(hr))
{
AfxMessageBox("Could not get CLSID from ProgID, Make sure ProgID is correct", MB_OK, 0);
return FALSE;
}
// Convert CLSID to String
hr = StringFromCLSID(clsid, &pwszClsid);
if (FAILED(hr))
{
AfxMessageBox("Could not convert CLSID to String", MB_OK, 0);
return FALSE;
}
// Convert result to ANSI
WideCharToMultiByte(CP_ACP, 0, pwszClsid, -1, szCLSID, 60, NULL, NULL);
// Free memory used by StringFromCLSID
CoTaskMemFree(pwszClsid);
// Format Registry Key string
wsprintf(szKey, "CLSID\\%s\\LocalServer32", szCLSID);
// Open key to find path of application
LONG lRet = RegOpenKeyEx(HKEY_CLASSES_ROOT, szKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet != ERROR_SUCCESS)
{
// If LocalServer32 does not work, try with LocalServer
wsprintf(szKey, "CLSID\\%s\\LocalServer", szCLSID);
lRet = RegOpenKeyEx(HKEY_CLASSES_ROOT, szKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet != ERROR_SUCCESS)
{
AfxMessageBox("No LocalServer Key found!!", MB_OK, 0);
return FALSE;
}
}
// Query value of key to get Path and close the key
lRet = RegQueryValueEx(hKey, NULL, NULL, NULL, (BYTE*)szPath, &cSize);
RegCloseKey(hKey);
if (lRet != ERROR_SUCCESS)
{
AfxMessageBox("Error trying to query for path", MB_OK, 0);
return FALSE;
}
// Strip off the '/Automation' switch from the path
char *x = strrchr(szPath, '/');
if(0!= x) // If no /Automation switch on the path
{
int result = x - szPath;
szPath[result] = '\0'; // If switch there, strip it
}
return TRUE;
}
BOOL COfficePathDlg::GetVersion(LPCTSTR szApp, LPSTR szVersion, ULONG cSize)
{
CHAR szKey[128], szValueName[128];
HKEY hKey, hKey1;
wsprintf(szKey, "%s", szApp);
LONG lRet = RegOpenKeyEx(HKEY_CLASSES_ROOT, szKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet != ERROR_SUCCESS) {
// Word is registered, but no local server can be found!!!
AfxMessageBox("Could not get CLSID from ProgID, Make sure ProgID is correct", MB_OK, 0);
return FALSE;
}
wsprintf(szValueName, "%s", "CurVer");
lRet = RegOpenKeyEx(hKey, szValueName, 0, KEY_ALL_ACCESS, &hKey1);
if (lRet != ERROR_SUCCESS) {
// Excel is registered, but no local server can be found!!!
return FALSE;
}
// Get the Version information
lRet = RegQueryValueEx(hKey1, NULL, NULL, NULL, (BYTE*)szVersion, &cSize);
// Close the registry keys
RegCloseKey(hKey1);
RegCloseKey(hKey);
// Error while querying for value
if (lRet != ERROR_SUCCESS)
return FALSE;
// At this point szVersion contains the ProgID followed by a number.
// For example, Word 97 will return Word.Application.8 and Word 2000 will return Word.Application.9
// Store the version number
char *x = strrchr(szVersion, '.');
szVersion[0] = *(x + 1);
szVersion[1] = '\0';
if (strcmp(szVersion, "6") == 0)
strcpy(szVersion, "Version 95");
else if (strcmp(szVersion, "8") == 0)
strcpy(szVersion, "Version 97");
else if (strcmp(szVersion, "9") == 0)
strcpy(szVersion, "Version 2000");
else if (strcmp(szVersion,?1?) == 0)
strcpy(szVersion, ?Version 2002?);
else
strcpy(szVersion, "Version unknown");
return TRUE;
}
Erstellen Sie das Projekt.
Wenn Sie die Anwendung ausführen, geben Sie die ProgID für eine Office-Anwendung im Bearbeitungsfeld. Hinweis: ein Beispiel für eine ProgID ist Word.Application . Klicken Sie auf die Schaltfläche GetPath , um den Pfad abrufen und klicken Sie zum Abrufen der registrierten Version GetVersion .
Wenn Sie mehrere Versionen von Office-Anwendung auf Ihrem System installiert haben, entspricht die Versionsnummer der Anwendung, die registriert ist. In den meisten Fällen ist die registrierte Version der letzten Version ausführen.
Wenn der Server-Anwendung nicht installiert ist, fehl, die Aufrufe an die zugehörigen Registrierungsschlüssel öffnen. Sie können Fehlerbehandlung in dieser Situation verwenden, um festzustellen, ob der Server-Anwendung installiert ist.
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 247985
(http://support.microsoft.com/kb/247985/en-us/
)
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Waren diese Informationen hilfreich?
Ja
Nein
Etwas
Wie hoch war der Aufwand für Sie persönlich, um diesen Artikel zu verwenden?
Sehr gering
Gering
Mittel
Hoch
Sehr hoch
Sagen Sie uns bitte, wie wir diese Informationen noch verbessern können
Danke! Dieses Feedback hilft uns dabei, die Supportartikel weiter zu verbessern. Weitere Informationen finden Sie auf der Hilfe und Support-Startseite.