Was tun bei "fatal error C1084: Cannot read type library file"
-
Hallo
Wusste jetzt nicht welches Thema da am besten ist.
Ich habe eine Fehlermeldung: fatal error C1084: Cannot read type library file: MyLib.tlb ...
Was will er mir damit sagen und wie kann ich das beheben ?
Ich glaube es liegt daran das die Lib MyLib.tlb zur Zeit von einem anderem Prozess gelockt wird. Aber warum ? Der Prozess ist das Studio selbst.Ich habe ein Projekt in dem im mit #import "MyLib.tlb" arbeite.
Worauf muss man da achten ?Grüße
Martin
-
mal abgesehen davon das mir die extension deiner lib etwas sonderbar vorkommt, fügst du ne lib entweder mit
#pragma comment (lib,"*.lib")in der entsprechenden datei hinzu,
oder aber in deinem project
- unter Project-Eigenschaften (rechter mausklick auf's Project/ Popup Menu Eigenschaften)
- in der Baumstrucktur Konfigurationseigenschaften / Linker / Eingabe
links in der Listenansicht Zusätzliche Abhängigkeiten die *.lib auswählen bzw. eintragen
- Button Übernehmen drücken
- in der Baumstrucktur Konfigurationseigenschaften / Linker / Befehlszeile
kannst du dann wieder Links nachkucken ob die hinzugefügte *.lib auch in der Befehlszeile steht
-
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.aspxThe #import Directive
http://msdn.microsoft.com/en-us/library/8etzzkb6#import Attributes
-
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