Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

fatal error C1084: Cannot read type library file: 'Smegui.tlb': Error loading type library/DLL

I am trying to build an old version of an application which consists of VC++ projects that were written in Visual Studio 2003.

My OS is Windows 7 Enterprise (64-bit). When I try and build the solution I get the following errors:

  • error C4772: #import referenced a type from a missing type library; '__missing_type__' used as a placeholder
  • fatal error C1084: Cannot read type library file: 'Smegui.tlb': Error loading type library/DLL.

They both complain about the following import statement:

#import "Smegui.tlb" no_implementation

This is not a case of the file path being incorrect as renaming the Smegui.tlb file causes the compiler to throw another error saying it cannot find the library.

Smegui is from another application that this one depends on. I thought perhaps I was missing a dll but there is no such thing as Smegui.dll.

All I know about .tlb files is that they are a type library and you can create them from an assembly using tlbexp.exe or regasm.exe (the later also registers the assembly with COM)

There is also an Apache Ant build script which uses a custom task to invoke devenv.com to build the projects. This is the same script that the build server originally used to build the application. It gives me the same errors when I try and run it.

The strangest thing about this is that I knew it ought to work seeing as it is all freshly checked out from subversion. I tried many different combinations of admin vs user elevation, VS vs Ant build, cleaning, release.

I have got it to build successfully about 5 times but the build seems to be non-deterministic.

If anyone can shed some light on how this tlb stuff even works or what this error might mean I would greatly appreciate it.

like image 627
steinybot Avatar asked Dec 06 '22 02:12

steinybot


2 Answers

I found a far more reliable solution: open the tlb with oleview.exe and then close it.

Not sure what this actually does but it works every time.

I think oleview is actually one of the samples included with Visual Studio but I haven't had the time to debug it and see what it is doing.

like image 122
steinybot Avatar answered May 03 '23 19:05

steinybot


I ran into this error because one type library was trying to load a dependent type library, which it could not find. Even though the dependent type library was in the same directory, and even though that directory was in the searchable path, the compiler would error loading the first type library, but not mention the dependent type library in the error.

To find the pseudo-missing type library, I ran Process Monitor (procman64.exe) during the compile. This showed that after the reported type library had successfully loaded, a dependent type library could not be found. It even showed all of the places that it was looking for the dependent type library, none of which were where it should have been looking (e.g.: procman output).

The fix was to add a <PreBuildEvent> to the project to copy the dependent .tlb file to one of the directories that was actually being searched.

<PreBuildEvent>
  <Command>copy /Y ..\Lib\Interop\CWSpeechRecLib.tlb .\</Command>
</PreBuildEvent>
like image 22
ergohack Avatar answered May 03 '23 20:05

ergohack