Announcement

Collapse
No announcement yet.

Abfragen ob Com Komponente installiert ist

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Abfragen ob Com Komponente installiert ist

    Hallo

    Ich bin ein blutiger Anfänger auf dem Gebiet COM. In der von mir zu wartenden Borland Builder 2006 C++ Applikation wird ein Com Komponente verwendet. Auf meiner Entwicklungsumgebung läuft alles wunderbar. Wenn die kompilierte Applikation jedoch auf einem anderen Rechner gestarted wird, erhält der User an der Stelle eine Exception an der die Com Komponente zum ersten Mal aufgerufen wird. Ich gehe davon aus, dass der Grund ist, dass die Com Komponente nicht installiert wurde.

    Meine Frage ist nun folgende:

    Kann ich in meiner Applikation irgendwie abfragen ob eine Com Komponente bereits installiert ist? Gibt es hier irgendwelche Best practices?

    Besten Dank für eine allfällige Hilfe

    Gruss Dani

  • #2
    Mit einem try...except-Block. Wichtig neben der Registrierung (in der Registry) ist auch das das Objekt wirklich instanziiert werden kann.

    Comment


    • #3
      in C/C++ könnte try / catch gemeint sein
      Christian

      Comment


      • #4
        Originally posted by Christian Marquardt View Post
        in C/C++ könnte try / catch gemeint sein
        Bin halt doch ein Delphianer

        Comment


        • #5
          Warum das nun auch - wo soviel gleich ist - auch anders heisst?? Irgendwie kein Grund dafür vorhanden.....
          Christian

          Comment


          • #6
            Nur so zur Info, ein try/catch Block funktioniert mehr oder weniger.
            Das Programm läuft weiter, aber eine unschöne Fehlermeldung erscheint. Ich denke diese ist nicht zu vermeiden. Werde vermutlich in der Registry abfragen müssen ob die Com-Komponente vorhanden ist.

            Wenn jemand noch andere, einfachere Möglichkeiten weiss dies abzufragen, würde ich dies gerne wissen.

            Gruss Dani

            Comment


            • #7
              Wo erscheint eine Fehlermeldung? In der IDE oder ohne IDE?
              Und Registry sagt dir nicht aus ob die instanziierung der Komponenten funktioniert (Stichwort: Windows-DLL-Hölle)

              Comment


              • #8
                Innerhalb der IDE erscheint die Exception immer (das kann man ausstellen). Bei der Standalon EXE nicht mehr
                Christian

                Comment


                • #9
                  Hallo

                  Ich erhalte die Exception ausserhalb der IDE, auf meiner Standalone Maschine auf der die Borland und die Com-Komponente nicht installiert sind. Die Meldung ist die folgende:

                  'Create(intfObj)': Class not registered @ c:\program files\borland\bds\4.0\include\vcl\utilcls.h/2617
                  Press[Y]es to terminate, [No]o to continue and [C]ancel to Debug

                  Comment


                  • #10
                    Zeig mal deinen Code. Dann hast du die try...except-Anweisung nicht korrekt aufgebaut.

                    Comment


                    • #11
                      Noch ein kleiner Nachtrag. Ich habe mir mal angeschaut was im File utilcls.h auf Zeile 2617 zu finden ist, kann aber nicht so viel damit anfangen.

                      template <class TOBJ, class INTF, const CLSID* clsid, const IID* iid>
                      TOBJ TCoClassCreatorT<TOBJ, INTF, clsid, iid>::Create()
                      {
                      TOBJ intfObj;
                      OLECHECK(Create(intfObj));
                      return intfObj;
                      }

                      Comment


                      • #12
                        Mit folgender Methode teste ich ob das Com-Objekt installiert ist:

                        bool GsmBox::isSmsThirdPartyToolInstalled(){
                        try{
                        TCOMIGsmOut GsmOutTest;
                        GsmOutTest= CoGsmOut::Create (); // causes exception if not installed
                        }catch(...){
                        return false;
                        }
                        return true;
                        }

                        Comment


                        • #13
                          Endlich kann ich auch mal was beitragen. Hier ist das Code-Snippet das funktioniert:

                          bool GsmBox::isSmsThirdPartyToolInstalled(){
                          // check if com compontent is installed
                          try{
                          TCOMIGsmOut m_pGsmOut;
                          HRESULT hr = CoCreateInstance(CLSID_GsmOut, NULL, CLSCTX_INPROC_SERVER, IID_IGsmOut, (void**) &m_pGsmOut );

                          if( ! SUCCEEDED( hr ) ) {
                          m_pGsmOut = NULL;
                          return false;
                          }
                          }catch(...){
                          return false;
                          }
                          return true;
                          }



                          Ich weiss aber nicht ob diese Vorgehensweise generell funktioniert oder mit meinem Control. Als Novize habe ich von tiefergehenden Aspekten der C++ Programmierung immer noch keine grosse Ahnung.

                          Gruss

                          Comment


                          • #14
                            Lösung gefunden?

                            ich habe anscheinend das selbe Problem:

                            http://entwickler-forum.de/showthrea...462#post220462

                            Comment

                            Working...
                            X