Compiler Problem error C2440 VS 2005 SP1



  • Hallo Zusammen!

    Ich habe folgendes Problem beim compilen:

    \debug\msjro.tli(115) : error C2440: 'return' : cannot convert from '__missing_type__ *' to '__missing_type__'
    

    Hier das dazugehörige Snippet aus der msjro.tli:

    inline __missing_type__ IReplica::GetConflictTables ( ) {
        __missing_type__ * _result;
        HRESULT _hr = get_ConflictTables(&_result);
        if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
        return _result;
    }
    

    -Visual Studio 2005 SP1, Win XP SP3

    Vll. hat das Problem ja jemand schonmal gesehen.

    Gruß, Bartolomeus76



  • Der da hatte das selbe Problem:
    http://stackoverflow.com/questions/2386974/c4772-even-when-the-type-library-is-registered-and-present

    Die Ursache für diesen Fehler ist: error C4772: #import referenced a type from a missing type library;
    D.h. entweder ist irgend eine TLB nicht registriert die von msjro benötigt wird, oder es ist eine alte Version einer solchen TLB registriert, oder MSVC findet die TLB einfach "trotzdem" nicht.

    Laut oleview ist IReplica bei mir in der Type Library "Microsoft Jet and Replication Objects 2.6 Library" definiert, und sieht so aus:

    [
      odl,
      uuid(D2D139E0-B6CA-11D1-9F31-00C04FC29D52),
      helpstring("IReplica Interface"),
      dual,
      oleautomation
    ]
    interface IReplica : IDispatch {
        [id(0x60020000), propputref, helpcontext(0x004106b6)]
        HRESULT ActiveConnection([in] IDispatch* ppconn);
        [id(0x60020000), propput, helpcontext(0x004106b6)]
        HRESULT ActiveConnection([in] VARIANT ppconn);
        [id(0x60020000), propget, helpcontext(0x004106b6)]
        HRESULT ActiveConnection([out, retval] IDispatch** ppconn);
        [id(0x60020003), propget, helpcontext(0x004106b7)]
        HRESULT ConflictFunction([out, retval] BSTR* pbstr);
        [id(0x60020003), propput, helpcontext(0x004106b7)]
        HRESULT ConflictFunction([in] BSTR pbstr);
        [id(0x60020005), propget, helpcontext(0x004106b8)];                  // <------------------------
        HRESULT ConflictTables([out, retval] _Recordset** pprset);           // <------------------------
        [id(0x60020006), propget, helpcontext(0x004106ba)]
        HRESULT DesignMasterId([out, retval] VARIANT* pvar);
        [id(0x60020006), propput, helpcontext(0x004106ba)]
        HRESULT DesignMasterId([in] VARIANT pvar);
        [id(0x60020008), propget, helpcontext(0x004106bd)]
        HRESULT Priority([out, retval] long* pl);
        [id(0x60020009), propget, helpcontext(0x004106be)]
        HRESULT ReplicaId([out, retval] VARIANT* pvar);
        [id(0x6002000a), propget, helpcontext(0x004106bf)]
        HRESULT ReplicaType([out, retval] ReplicaTypeEnum* pl);
        [id(0x6002000b), propget, helpcontext(0x004106c0)]
        HRESULT RetentionPeriod([out, retval] long* pl);
        [id(0x6002000b), propput, helpcontext(0x004106c0)]
        HRESULT RetentionPeriod([in] long pl);
        [id(0x6002000d), propget, helpcontext(0x004106c2)]
        HRESULT Visibility([out, retval] VisibilityEnum* pl);
        [id(0x6002000e), helpcontext(0x004106c8)]
        HRESULT CreateReplica(
                        [in] BSTR replicaName, 
                        [in] BSTR description, 
                        [in, optional, defaultvalue(2)] ReplicaTypeEnum ReplicaType, 
                        [in, optional, defaultvalue(1)] VisibilityEnum Visibility, 
                        [in, optional, defaultvalue(-1)] long Priority, 
                        [in, optional, defaultvalue(0)] UpdatabilityEnum updatability);
        [id(0x6002000f), helpcontext(0x004106ca)]
        HRESULT GetObjectReplicability(
                        [in] BSTR objectName, 
                        [in] BSTR objectType, 
                        [out, retval] VARIANT_BOOL* replicability);
        [id(0x60020010), helpcontext(0x004106d1)]
        HRESULT SetObjectReplicability(
                        [in] BSTR objectName, 
                        [in] BSTR objectType, 
                        [in] VARIANT_BOOL replicability);
        [id(0x60020011), helpcontext(0x004106cc)]
        HRESULT MakeReplicable(
                        [in, optional, defaultvalue("")] BSTR connectionString, 
                        [in, optional, defaultvalue(-1)] VARIANT_BOOL columnTracking);
        [id(0x60020012), helpcontext(0x004106ce)]
        HRESULT PopulatePartial([in] BSTR FullReplica);
        [id(0x60020013), helpcontext(0x004106d2)]
        HRESULT Synchronize(
                        [in] BSTR target, 
                        [in, optional, defaultvalue(3)] SyncTypeEnum syncType, 
                        [in, optional, defaultvalue(1)] SyncModeEnum syncMode);
        [id(0x60020014), propget, helpcontext(0x004106d4)]
        HRESULT Filters([out, retval] Filters** ppFilters);
    };
    

    Dein __missing_type__ ist also ein _Recordset .

    Und _Recordset wiederrum ist bei mir in der "Microsoft ActiveX Data Objects 6.0 Library" definiert ( %CommonProgramFiles%\System\ado\msado15.dll ).

    Möglichkeit 1: Versuch %CommonProgramFiles%\System\ado\msado15.dll neu zu registrieren ( regsvr32 ).
    Möglichkeit 2: Versuch vor dem #import "...\msjro.dll" ein #import "%CommonProgramFiles%\System\ado\msado15.dll" zu machen.



  • Hi!

    Danke erstmal für deine Antwort!

    Das Problem besteht leider nach wie vor.

    Möglichkeit 1 habe ich durchgeführt -> keine Änderung
    Möglichkeit 2: Es gibt kein

    #import "...\msjro.dll"
    

    im gesamten Project wo ich etwas ersetzen könnte.. 😕

    Achja, es wird auch kein

    error C4772: #import referenced a type from a missing type library;

    ausgegeben, nur eben der im ersten Post gezeigte Fehler.



  • Wo kommt das msjro.tli File dann her?
    Wird das direkt mit #include reingeholt, oder ...?



  • Hi,

    habe jetzt folgendes in der BaseDef_v8 gefunden:

    #pragma warning (disable: 4146)
    // CG : In order to use this code against a different version of ADO, the appropriate
    // ADO library needs to be used in the #import statement
    //#pragma message ("Make sure you go to Tools.Options.Directories.Library files and add the paths to msado15.dll and msjro.dll will usually be in C:\\Program Files\\Common Files\\System\\ado")
    //#import "C:\Program Files\Common Files\System\ado\msado15.dll" rename("EOF", "EndOfFile")
    //#import "C:\Program Files\Common Files\System\ado\MSJRO.DLL" no_namespace rename("ReplicaTypeEnum", "_ReplicaTypeEnum") 
    
    #import <..\..\commonlib\ado\msado15.dll> rename("EOF", "EndOfFile")
    #import <..\..\commonlib\ado\MSJRO.DLL> no_namespace rename("ReplicaTypeEnum", "_ReplicaTypeEnum") 
    
    using namespace ADODB;
    

    und entsprechend geändert

    #pragma warning (disable: 4146)
    // CG : In order to use this code against a different version of ADO, the appropriate
    // ADO library needs to be used in the #import statement
    //#pragma message ("Make sure you go to Tools.Options.Directories.Library files and add the paths to msado15.dll and msjro.dll will usually be in C:\\Program Files\\Common Files\\System\\ado")
    #import "C:\Program Files\Common Files\System\ado\msado15.dll" rename("EOF", "EndOfFile")
    #import "C:\Program Files\Common Files\System\ado\MSJRO.DLL" no_namespace rename("ReplicaTypeEnum", "_ReplicaTypeEnum") 
    
    #import <..\..\commonlib\ado\msado15.dll> rename("EOF", "EndOfFile")
    #import <..\..\commonlib\ado\MSJRO.DLL> no_namespace rename("ReplicaTypeEnum", "_ReplicaTypeEnum") 
    
    using namespace ADODB;
    

    sowie den ornder zu den library-files angegeben.

    Nun bekomme ich folgende Fehlermeldung(en):

    c:\mkz-source\mkzsource\intermediate\basedef\debug\msjro.tli(115) : error C2440: 'return' : cannot convert from '__missing_type__ *' to '__missing_type__'
            There is no context in which this conversion is possible
    c:\mkz-source\mkzsource\projects\basedef\include\ado2.h(46) : error C4772: #import referenced a type from a missing type library; '__missing_type__' used as a placeholder
    c:\mkz-source\mkzsource\projects\basedef\source\ado2.cpp(73) : error C2664: 'IJetEngine::RefreshCache' : cannot convert parameter 1 from 'ADODB::_Connection *' to '__missing_type__ *'
            Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    


  • OK.
    Hab' gerade in einem meiner Programme nachgesehen.
    MS hat da mal ADO Interfaces umbenannt, was zu einem Haufen Problemen führen kann.
    U.a. war davon auch das _Recordset Interface betroffen. Das alte _Recordset wurde zu _Recordset_Deprecated umbenannt, und dafür ein neues _Recordset Interface (mit ner neuen IID) definiert.
    Informationen dazu findest du hier: http://qa.social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/3a4ce946-effa-4f77-98a6-34f11c6b5a13
    Die alten IIDs fangen mit 00000xxx an, die neuen mit 00001xxx .

    BTW: mit den Versionen der msado15.dll und MSJRO.DLL die ich auf meinem PC habe (Windows 7 x64 SP1, aktueller Patch-Level), funktionieren die von dir gezeigten #import Anweisungen problemlos -- also die ursprüngliche Version!

    Es könnte sein dass deine msado15.dll noch die alten Interface-Definitionen hat, deine MSJRO.DLL aber die neuen erwartet. (So ist es zumindest bei mir, also die MSJRO.DLL referenziert die neuen Interfaces, sie geht nicht mit den alten!)

    Guck mal mit OLEView unter "Interfaces" nach welche/wie viele Interfaces namens "_Recordset" dort definiert sind und was die für ne IID haben.

    Oder versuch' mal

    #import "C:\Program Files\Common Files\System\ado\msado15.dll" rename("EOF", "EndOfFile")
    #import <..\..\commonlib\ado\MSJRO.DLL> no_namespace rename("ReplicaTypeEnum", "_ReplicaTypeEnum") 
    
    using namespace ADODB;
    

    Und auf jeden Fall immer nur eine Version des selben Files über #import einbinden, niemals #import auf das selbe File aus zwei verschiedenen Verzeichnissen so wie du das gezeigt hast.

    Wenn das auch nicht funktioniert kannst du auch z.B. versuchen die msado20.tlb statt der msado15.dll zu verwenden.

    Ich würde dir aber empfehlen jemanden der mit dem Projekt vertraut ist zu Rate zu ziehen.
    Denn eigentlich sollte das Projekt sich mit den in eurem Source-Control unter commonlib\ado eingecheckten File-Versionen compilierbar sein!



  • Hi,

    erstmal vielen Dank für deine Mühe! Leider haben mich die Tips nicht zum Erfolg gebracht.

    Ich habe das ganze jetzt mal auf einem Win7 HP 32bit - System ausprobiert, und siehe da: Der Build war erfolgreich 👍
    Verstehen tue ich das ganze leider nicht... aber vll ist das ja eine Hilfe für diejenigen die auch mal auf das Problem stoßen.

    Gruß, Bartolomeus76



  • Was für ein OS ist/war es denn mit dem du die Probleme hast/hattest?
    Vielleicht müssen wirklich die neuen TLBs im System registriert sein.



  • -Visual Studio 2005 SP1, Win XP SP3

    😉



  • Ah I C 🙂

    Hau weg den Scheiss! 🕶

    Ansonsten müsste es gehen die vom Compiler durch #import generierten Files mit zu committen und dann abzuspeichern.
    Das wäre mMn. die sicherste Variante um sich gegen Änderungen/Unterschiede in Type Libraries zu schützen.
    Damit sollte es dann auch wieder möglich sein das Projekt unter XP zu bauen.



  • Hehe.. ja. Habe mir nur gedacht VS2005 läuft unter XP vernünftig, unter Win7 64bit ist der Compiler immer abgestürzt. Naja, alles nur auf ner virtuellen Maschine. Und Ziel ist ja erreicht 😉
    Danke nochmal! 👍



  • Bartolomeus76 schrieb:

    Habe mir nur gedacht VS2005 läuft unter XP vernünftig, unter Win7 64bit ist der Compiler immer abgestürzt.

    Die meisten unserer Projekte verwenden noch VS2005 und wir arbeiten alle mit Win7 64 Bit.
    Du musst halt das letzte Service Pack sowie das "Vista Update" für VS2005 installieren - dann geht das aber recht gut. Auf jeden Fall nicht schlechter als unter XP.


Log in to reply