c++ simple code get outlook-version over msi.lib



  • Guten Abend zusammen,
    mein erster Beitrag und meine erste Frage:
    Wer kann mir die main Prozedur zum Aufruf folgender bei Microsoft publizierten Prozedur ansagen?

    http://msdn.microsoft.com/en-us/library/dd941331(office.14).aspx

    Es geht um die Feststellung der Outlook-Version via msi.lib

    Wäre echt nett, wenn mir da geholfen werden könnte, ich bekomme noch Hörner über den Kram. 😕

    PS: Ich weiss das es Tools für so etwas gibt, ich möchte aber c++ code, wenn es geht ohne .NET 👍



  • TCHAR szVersion[MAX_PATH] = {0};
    BOOL bIs64Bit = FALSE;
    if SUCCEEDED(GetOutlookVersionString(LPTSTR* ppszVer, BOOL* pf64Bit))
    {
      _tprintf(_T("Version: %s, 64Bit: &d"),szVersion, bIs64Bit);
    }
    


  • Jochen Kalmbach schrieb:

    TCHAR szVersion[MAX_PATH] = {0};
    BOOL bIs64Bit = FALSE;
    if SUCCEEDED(GetOutlookVersionString(LPTSTR* ppszVer, BOOL* pf64Bit))
    {
      _tprintf(_T("Version: %s, 64Bit: &d"),szVersion, bIs64Bit);
    }
    

    Danke für die schnelle Antwort. Doch das hakt ja wohl noch, denn was ist mit den Argumenten "ppszVer" und "pf64Bit"?



  • LPTSTR szVersion; 
    BOOL bIs64Bit = FALSE; 
    if SUCCEEDED(GetOutlookVersionString(&szVersion, &bIs64Bit)) 
    { 
      _tprintf(_T("Version: %s, 64Bit: &d"),szVersion, bIs64Bit); 
      free(szVersion);
    }
    


  • Vielen Dank, das war auch mein Ansatz - leider rennt es nicht, dafür funktioniert aber dies hier:

    http://msdn.microsoft.com/en-us/library/bb905147.aspx

    Im Prinzip das Gleiche, ohne 64 Bit-Abfrage. Dann muss in der Erstgenannten Routine

    http://msdn.microsoft.com/en-us/library/dd941331(office.14).aspx

    wohl irgend etwas faul sein.
    Aber ich kann es nicht finden....



  • Nun geht es darum, während des Runtime die richtigen DLL's zu laden:

    int main()
    {
    	LPTSTR szVersion;
    	BOOL L_OK = TRUE;
    	BOOL fFreeLib = TRUE;
    
    	// Prüfe Outlook Version
    	if( GetOutlookVersionString(&szVersion) == S_OK ) {
    		// Version in eine Zahl umwandeln
    		// z.B. Outlook 2007 = 12
    		char	*pVersion = (char *)malloc( 2 );
    		wcstombs(pVersion, szVersion, 2);
    
    		// Outlook 2000 ist 9
    		if( strcmp(pVersion, "9." ) )
    			strcpy(pVersion, "9");
    
     		int Version = atoi(pVersion);
    
    		// Speicher frei geben
    		if(pVersion)	free(pVersion);
    		if(szVersion)	free(szVersion);
    
    		//
    		// lade die richtigen DLL's
    		L_OK = OL_Dll_Load(Version);
    		if( !L_OK ) {
    			perror("Outlook Library's konnte nicht geladen werden.\n\n");
    			return (1);
    		}
    
    	}
    	else {
    		perror("Outlook ist nicht installiert.\n\n");
    		return (1);
    	}
    
    	// ..........................
    	// weiterer code
    	// ..........................
    
    	if( L_OK ) {
    		// DLL entladen
    		fFreeLib = FreeLibrary(hinstLibMSO);
    		fFreeLib = FreeLibrary(hinstLibOLB);
    	}
    
    	system("pause");
    	return (0);
    }
    
    bool OL_Dll_Load(int Version)
    {
    	BOOL fFreeLib;
    	BOOL L_OK = TRUE;
    
    	switch(Version) {
    		case 12: // Outlook 2007
    			// DLL Datei laden
    			// HKEY_CLASSES_ROOT\TypeLib\{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}\2.4\0\win32
    			hinstLibMSO = LoadLibrary(_T("C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE12\\mso.dll"));
    			if(hinstLibMSO) {
    				hinstLibOLB = LoadLibrary(_T("C:\\Program Files (x86)\\Microsoft Office\\OFFICE12\\msoutl.olb"));
    				if(!hinstLibOLB) {
    					fFreeLib = FreeLibrary(hinstLibMSO);
    					L_OK = FALSE;
    				}
    			}
    			else
    				L_OK = FALSE;
    			break;
    
    		case 11: // Outlook 2003
    			// DLL Datei laden
    			hinstLibMSO = LoadLibrary(_T("C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE11\\mso.dll"));
    			if(hinstLibMSO) {
    				hinstLibOLB = LoadLibrary(_T("C:\\Program Files (x86)\\Microsoft Office\\OFFICE11\\msoutl.olb"));
    				if(!hinstLibOLB) {
    					fFreeLib = FreeLibrary(hinstLibMSO);
    					L_OK = FALSE;
    				}
    			}
    			else
    				L_OK = FALSE;
    			break;
    
    		case 10: // Outlook 2002
    			// DLL Datei laden
    			hinstLibMSO = LoadLibrary(_T("C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\OFFICE10\\mso.dll"));
    			if(hinstLibMSO) {
    				hinstLibOLB = LoadLibrary(_T("C:\\Program Files (x86)\\Microsoft Office\\OFFICE10\\msoutl.olb"));
    				if(!hinstLibOLB) {
    					fFreeLib = FreeLibrary(hinstLibMSO);
    					L_OK = FALSE;
    				}
    			}
    			else
    				L_OK = FALSE;
    			break;
    
    		case 9: // Outlook 2000 und was ist mit der zweiten Zahl??
    			// DLL Datei laden
    			hinstLibMSO = LoadLibrary(_T("C:\\Program Files (x86)\\Microsoft Office\\Office\\mso9.dll"));
    			if(hinstLibMSO) {
    				hinstLibOLB = LoadLibrary(_T("C:\\Program Files (x86)\\Microsoft Office\\Office\\msoutl9.olb"));
    				if(!hinstLibOLB) {
    					fFreeLib = FreeLibrary(hinstLibMSO);
    					L_OK = FALSE;
    				}
    			}
    			else
    				L_OK = FALSE;
    			break;
    
    		default: L_OK = FALSE;
    			break;
    	}
    
    	//using namespace Outlook;
    
    	return L_OK;
    }
    

    Ok soweit, wie kann man, im Unterschied zu

    #if defined(OUTL12) // Outlook 2007
    #import "C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE12\mso.dll" \
    		no_namespace named_guids,\
    		rename("DocumentProperties", "DocProps") \
    		rename("RGB", "_RGB") \
    		rename("FileTypes", "OutlookFileTypes")
    		//exclude("IAccessible")
    

    beim Laden während des Runtim die Argumente rename etc. setzen und
    wie bekomme ich das namespace:

    using namespace Outlook;
    

    hin?



  • Hab mich jetzt registriert.. 🙂
    und vergessen:

    [b]extern HINSTANCE hinstLibMSO, hinstLibOLB[/b];
    int main() 
    { 
    // code wie oben
    }
    

    und

    [b]HINSTANCE hinstLibMSO, hinstLibOLB;[/b]
    
    bool OL_Dll_Load(int Version)
    {
    // code wie oben
    }
    

Anmelden zum Antworten