Mit Qt erstelltes ActiveX-Control erscheint nicht in Word

Alles rund um die Programmierung mit Qt
Antworten
Eltharion
Beiträge: 74
Registriert: 4. Mai 2006 14:42
Wohnort: Magdeburg
Kontaktdaten:

Mit Qt erstelltes ActiveX-Control erscheint nicht in Word

Beitrag von Eltharion »

Ich möchte eine ActiveX-Komponente als out-of-process-Server erstellen, welche in Microsoft Word 2007 als Objekt eingefügt werden kann. Nun sollte dies mittels activeqt einfach möglich sein, jedoch kann ich Word und auch den testcon nicht dazu bewegen, mein Control überhaupt erstmal anzuzeigen.

Mittlerweile habe ich das Hinzufügen der TLB per idc.exe, als auch per Referenz in der RC-Datei ausprobiert. Auch beim Anmelden mit -regserver soll alles geklappt haben. Die Anwendung ist eine exe und keine DLL. Kann es daran liegen? Ich habe per Google gefunden, dass "Insertable" auf "yes" gesetzt werden muss. Müssen eventuell so noch andere Einstellungen zur Anpassung an Office vorgenommen werden? Kann es am MinGW liegen? Die Exe ist dynamisch gelinkt, liegt aber in einem Verzeichnis mit den nötigen DLLs. Ich habe mittlerweile auch schon eine Installation und Server-Registration unter system32 (Suchpfad) ausprobiert. Auch regsrv32 wurde getestet.

Ich benötige einen Tipp, was noch ausprobiert werden könnte! Danke.

E*

Code: Alles auswählen

charts.pro:

TEMPLATE = app
TARGET   = charts
CONFIG	+= qt qaxserver release warn_on
RC_FILE  = application.rc
SOURCES  = *.cpp
HEADERS  = *.h

main.cpp:

#include <QApplication>
#include <QAxFactory>

#include "MainWidget.h"

QAXFACTORY_BEGIN(
    "{E2323DE8-873E-4725-A80C-47E2626A0556}",    // Type library ID.
    "{558BACA5-36D0-492f-AB78-DF991F111D1D}"     // Application ID.
  )
  QAXCLASS(MainWidget)
QAXFACTORY_END()

int main(int argc, char *argv[])
{
  QApplication app(argc, argv);

  if (! QAxFactory::isServer()) {                // Create and show main window.
    MainWidget *w = new MainWidget();
    w->setPlainText("Text");
    w->resize(400, 200);
    w->show();
  }

  return app.exec();
}


MainWIdget.h:

#ifndef OEG_APP_MISC_CHARTS_H
#define OEG_APP_MISC_CHARTS_H

#include <QString.h>

#include <QAxBindable.h>
#include <QTextEdit.h>
#include <QWidget.h>

class MainWidget : public QTextEdit, public QAxBindable
{
  Q_OBJECT

  Q_CLASSINFO("ClassID",        "{AC1E7EF3-E310-421f-BD97-8EE77F03F9CA}")
  Q_CLASSINFO("InterfaceID",    "{5676AA5A-B5D4-4412-B166-FF1A9D6DBD2D}")
  Q_CLASSINFO("EventsID",       "{D2AE041C-DEFE-4648-85E4-B2D59E25A31F}")
  Q_CLASSINFO("Version",        "1.0")
  Q_CLASSINFO("Description",    "Charts")
  Q_CLASSINFO("ToSuperClass",   "MainWidget")
  Q_CLASSINFO("StockEvents",    "yes")
  Q_CLASSINFO("Insertable",     "yes")
  Q_CLASSINFO("RegisterObject", "yes")

  Q_PROPERTY(QString title READ title WRITE setTitle)

  public:
    MainWidget(QWidget *parent = 0, const char *name = 0);

    void setTitle(const QString &title);
    QString title() const;

    QString m_title;
};

#endif



MainWidget.cpp:

#include <QWidget.h>

#include "MainWidget.h"

MainWidget::MainWidget(QWidget *parent /*=0*/, const char *name /*=0*/)
 : QTextEdit(parent)
{
}

void MainWidget::setTitle(const QString &title)
{
  m_title = title;
}

QString MainWidget::title() const
{
  return m_title;
}
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

Beitrag von bst »

Hi,

keine Antwort auf Deine Frage, aber vielleicht hilft's ja trotzdem...

im Visual Studio kann ich via Datei-Neu-Projekt-ActiveQt Server eine DLL erstellen auf die ich in VBA zugreifen kann. Das sieht hier (auf Deine Variante abgeändert) so aus:

myTextEdit.h:

Code: Alles auswählen

#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H

#include <QtGui/QTextEdit>
#include <QString>
#include <ActiveQt/QAxBindable>

class myTextEdit : public QTextEdit, public QAxBindable
{
   Q_OBJECT    
   Q_PROPERTY(QString title READ title WRITE setTitle) 

public:
   myTextEdit(QWidget *parent = 0);
   QString title() const;

public slots:
   void setTitle(const QString &title);

private:
    QString m_title; 
};

#endif // MYTEXTEDIT_H
myTextEdit.cpp:

Code: Alles auswählen

#include "mytextedit.h"

#include <ActiveQt/QAxFactory>

myTextEdit::myTextEdit(QWidget *parent)
    : QTextEdit(parent)
{
   this->setText("Hallo Welt");
}

void myTextEdit::setTitle(const QString &title)
{
   m_title = title;
}

QString myTextEdit::title() const
{
   return m_title;
}

QAXFACTORY_DEFAULT(myTextEdit,
      "{E2CFDDFD-33FD-446B-8980-740A7EB4F325}",
      "{0249E558-4695-4E9E-AAF3-679E31E9D804}",
      "{422E7DB2-1477-45E4-A6FF-5DC9D5C44A4E}",
      "{AE46E945-6316-4D00-99B0-B934B3C3FEBD}",
      "{DF427A77-F60E-4C1A-BEEA-C3427DF0B2A1}")
myTextEdit.def (!):

Code: Alles auswählen

; Declares the module parameters.

EXPORTS
	DllCanUnloadNow	     PRIVATE
	DllGetClassObject    PRIVATE
	DllRegisterServer    PRIVATE
	DllUnregisterServer  PRIVATE
	DumpIDL		     PRIVATE
Beim Linken wird die DEF mit übergeben, nach dem Erstellen wird ein 'VS Build-Ereignis' aufgerufen:

Code: Alles auswählen

$(QTDIR)\bin\idc.exe "$(TargetPath)" /idl "$(IntDir)/myTextEdit.idl" -version 1.0.0
midl "$(IntDir)/myTextEdit.idl" /tlb "$(IntDir)/myTextEdit.tlb"
$(QTDIR)\bin\idc.exe "$(TargetPath)" /tlb "$(IntDir)/myTextEdit.tlb"
$(QTDIR)\bin\idc.exe "$(TargetPath)" /regserver
In VBA funktioniert dann z.B. so etwas:

Code: Alles auswählen

Option Explicit

' benötigt so (Early Binding) einen Verweis auf die erzeugte DLL
Sub x()
   Dim c As myTextEdit
   
   Set c = New myTextEdit
   c.setTitle "MyTitle"
   c.Show
   Stop  ' Fenster anschauen
   c.setText "Ich bin der Text"
   Stop  ' Fenster anschauen
   MsgBox c.Title
End Sub
HTH, Bernd
Antworten