Was tun bei "fatal error C1084: Cannot read type library file"



  • Hi

    Nö das ist keine "Library" .. Blöd zu sagen 😃
    Das ist eine COM type library. Daher auch die Endung tlb.

    http://msdn.microsoft.com/en-us/library/8etzzkb6(VS.71).aspx

    Grüße
    Martin



  • Mir fällt dazu nur:
    http://msdn.microsoft.com/en-us/library/5f1s5tde
    ein.
    Mach doch das ganze nur *einmal* und binde dann die erzeugten Dateien ein und lass dass "#import" weg 😉 damit hast Du auch einen "eindeutigen Stand" und bist nicht vom OS abhängig 😉



  • Oh

    wie meinst du das genau ?? 🙄



  • z.B. so, hier ein vollständiges Beispiel:

    #include <windows.h>
    #include <tchar.h>
    
    // INFO: Das Folgende muss nur einmal gemacht werden, 
    //       damit man dann den Stand der Office Version einfrieren kann.
    //       Nachdem man dies *einmal* übersetzt hat, 
    //       sollte man das "#if 1" wieder auf "#if 0" setzen und
    //       die drei erzeugten "*.tlh" und "*.tli"-Dateien in das Projektverzeichnis kopieren
    //       (liegen im Debug oder Release-Verzeichnis, je nachdem was man compiliert hat)
    //       Zusätzlich muss man in den "tlh"-Dateien die Pfade zu den "tli"-Dateien entfernen
    // 
    //       Somit kann man auch auf Rechnern das Projekt übersetzen, 
    //       wenn dort kein Office installiert ist.
    #if 1
    #pragma push_macro("DocumentProperties")
    #pragma push_macro("RGB")
    #pragma push_macro("DialogBox")
    #pragma push_macro("CopyFile")
    #pragma push_macro("ReplaceText")
    
    #undef DocumentProperties
    #undef RGB
    #undef DialogBox
    #undef CopyFile
    #undef ReplaceText
    
    // warning C4192: automatically excluding 'IFont/IPicture' while importing type library 'C:\Programme\Microsoft Office\Office12\Excel.exe'
    #pragma warning(disable: 4192)  
    #import "C:\Programme\Gemeinsame Dateien\Microsoft Shared\Office12\MSO.DLL" rename("DocumentProperties", "DocumentProperties_MSO")
    #import "C:\Programme\Gemeinsame Dateien\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" 
    #import "C:\Programme\Microsoft Office\Office12\Excel.exe" rename("RGB", "RGB_Excel") rename("DialogBox", "DialogBox_Excel") rename("DialogBox", "CopyFile_Excel") rename("ReplaceText", "ReplaceText_Excel")
    
    #pragma pop_macro("ReplaceText")
    #pragma pop_macro("CopyFile")
    #pragma pop_macro("DialogBox")
    #pragma pop_macro("RGB")
    #pragma pop_macro("DocumentProperties")
    
    #else
    // INFO: Verwende jetzt nur noch die automatisch erzeugten Dateien. 
    //       Es kann also auch auf Rechnern kompiliert werden, 
    //       wo kein Excel installiert ist. 
    //       Auch Office Serivce-Pack Installationen haben keinen Einfluss mehr. 
    #include "mso.tlh"
    #include "vbe6ext.tlh"
    #include "excel.tlh"
    #endif
    
    int _tmain()
    {
      CoInitialize(NULL);
    
      try
      {
        Excel::_ApplicationPtr excel;
        excel.CreateInstance(L"Excel.Application");
        Excel::_WorkbookPtr workbook = excel->Workbooks->Add(static_cast<long>(Excel::xlWorksheet)); 
        Excel::_WorksheetPtr worksheet = excel->ActiveSheet;
        worksheet->Name = L"Hallo Welt";
        excel->PutVisible(0, VARIANT_TRUE);
      }
      catch(_com_error &ce) 
      {
        // Handle the error 
        printf("%S", ce.Description());
        return -1; 
      } 
    }
    

    Nur der Vollständigkeit halber:

    Using Native COM Support in C++
    http://msdn.microsoft.com/en-us/library/aa579075.aspx

    The #import Directive
    http://msdn.microsoft.com/en-us/library/8etzzkb6

    #import Attributes

    http://msdn.microsoft.com/en-us/library/298h7faa



  • Hi

    Danke für die Info ... aber ich glaube ich ahbe gefunden warum es nicht funktioniert hat.
    In meiner Verzweiflung habe ich alle Typlibs deregistriert und wieder registriert. 😃
    Jetzt funktioniert es wieder.

    Allerdings muss man mit deiner Variante nichts registrieren stimmt das ??

    Grüße
    Martin



  • Du musst eigentlich nie was registrieren um die tlbs in VC++ zu verwenden... und wenn Du einmal die tlh/tli-Dateien ertzeugt hast, dann braucht Du sowieso nie was registrieren und kannst es übersetzen wo und wann Du willst, ohne ohne Office oder anderes Zeug zu installieren.



  • Wer mit Versionsverwaltungssystemen arbeitet und mit Build-Servern, der kommt um meine Vorgehensweise sowieso nicht drum rum, es sei denn mal installiert auf dem Build-Server auch alle benötigten Programme...



  • Hallo

    Ok nur zum Verständnis. In meinem Fall (wenn ich es nach deiner Art machen würde) hätte ich dann es in etwa es so.

    #import "MyLib.dll" 
    //....
    #include "excel.tlh"
    

    Also könnte direkt mit der dll arbeiten ?
    Diese "tlh" Datei wird dann beim Erzeugen des Projektes MyLib erzeugt ?

    Bin jetzt mal davon ausgegangen das ich "rename" vorerst nicht brauche.

    Grüße
    Martin



  • Vermutlich eher:

    #import "MyLib.dll" 
    //....
    #include "MyLib.tlh"
    

    Und ja, die tlh- ind tli-Datei wird beim Compilieren erzeugt...

    "rename" brauchst Du nur dann, wenn sich Namen z.B. mit Makros aus dem PSDK kollidieren...



  • Hallo

    Achso ja mist 😮 meinte natürlich

    #include "MyLib.tlh"
    

    Copy & Paste 😃

    Wozu ist die TLI - Datei ? Wo bindet man diese ein ?

    Grüße



  • Hallo,

    die tli-Datei enthält vom Compiler generierte Klassen-Methoden. Eingebunden wird sie "automatisch", weil die tlh-Datei eine entsprechende Anweisung enthält.

    MfG,

    Probe-Nutzer


Anmelden zum Antworten