Benutzer mit den meisten Antworten
Problem with an odl-file. Can't initialize an object from extern!?!

Frage
-
Hello there,
first of all, i'm using vc++ 6.0 and visual basic 6.0.
im trying to 'open' a c++-class (for a vb6 programm) trough an odl-file.
so, this is the class, which shall be accessible from other languages://Header-File: #if !defined(AFX_KLASSE_1_H__D3A10B9D_8B59_4AEF_883B_00D929796524__INCLUDED_) #define AFX_KLASSE_1_H__D3A10B9D_8B59_4AEF_883B_00D929796524__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class KLASSE_1 { public: KLASSE_1(); protected: ~KLASSE_1(); }; #endif // !defined(AFX_KLASSE_1_H__D3A10B9D_8B59_4AEF_883B_00D929796524__INCLUDED_)
this one:
//CPP-File #include ".\..\Header\StdAfx.h" #include ".\..\Header\KLASSE_1.h" #include "windows.h" ////////////////////////////////////////////////////////////////////// // Konstruktion/Destruktion ////////////////////////////////////////////////////////////////////// KLASSE_1::KLASSE_1() { MessageBox ( NULL, "Hallo Windows!", "Konstruktor!", MB_OK); } KLASSE_1::~KLASSE_1() { MessageBox ( NULL, "Hallo Windows!", "Denstruktor!", MB_OK); }
and finally the odl-File:
#include <olectl.h> #include <idispids.h> [ uuid(AD77F140-456F-4CD8-86D9-5C67908F4E6C), version(1.0), helpstring("TESTCLASS_ODL ActiveX-Steuerelement-Modul") ] //odl-file library TESTCLASS_Lib { typedef enum { [helpstring("First Constant")] CONST_1 = 1, [helpstring("Second Constant")] CONST_2 = 2, [helpstring("Third Constant")] CONST_3 = 3, [helpstring("Forth Constant")] CONST_4 = 4, } CONSTANTS; [ uuid(00000000-0000-0000-0000-000000000001), helpstring("Dispatch-Interface for KLASSE_1"), hidden ] dispinterface _DPKLASSE_1 { properties: methods: //[id(1)] int testfkt(); }; [ uuid(00000000-0000-0000-0000-000000000002), helpstring("_DPKLASSE_1_TYP"), control ] coclass KLASSE_1 { [default] dispinterface _DPKLASSE_1; }; };
ok. I compile it and i get a tlb-file.
so, now the visual basic-side:
i link the tlb-file in a vb6-project and can make this:As you can see in the commend, there occurs an error when trying to initialize with 'new'.Private Sub Form_Load() Dim bla As TESTCLASS_Lib.Constants bla = CONST_2 Debug.Print bla 'this one works!!! Dim blub As TESTCLASS_Lib.KLASSE_1 'Following Codeline makes an RUNTIME-ERROR!! 'Err.Number=429 Err.Description="Active X Component can`t create Objekt !" Set blub = New KLASSE_1 End Sub
The Constants work fine.
I dont't get it, where is the problem?????thanks in advance:)
Antworten
-
Hast Du denn Dein Objekt so angelegt, dass es durch eine Factory erzeugt werden kann?
Siehe DECLARE_OLECREATE, IMPLEMENT_OLECREATE!
Hier gibt es eine Artikelreihe, die das etwas behandelt:
http://www.tenouk.com/visualcplusmfc/visualcplusmfc24.html
(IMHO wird es für Dich ab Automation 3 interessant)
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Jobacca Donnerstag, 14. April 2011 07:03
-
Deutsche Gruppe!
So funktioniert das nicht. Du hast eine C++ Klasse erzeugt, die keinerlei Bezug zu Deiner ODL hat.
Am Besten erzeuge mit dem Class-Wizard eine neue Klasse in der MFC die Automation unterstützt... ODL etc. werden dann automatisch mit erzeugt inkl. aller Klassen und Basisklassen zur Initialisierung und Registrierung Deiner EXE.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Robert BreitenhoferModerator Freitag, 22. Oktober 2010 06:28
Alle Antworten
-
Deutsche Gruppe!
So funktioniert das nicht. Du hast eine C++ Klasse erzeugt, die keinerlei Bezug zu Deiner ODL hat.
Am Besten erzeuge mit dem Class-Wizard eine neue Klasse in der MFC die Automation unterstützt... ODL etc. werden dann automatisch mit erzeugt inkl. aller Klassen und Basisklassen zur Initialisierung und Registrierung Deiner EXE.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Robert BreitenhoferModerator Freitag, 22. Oktober 2010 06:28
-
So! Erstmal, vielen Dank für die schnelle Antwort, sorry für meine lange Reaktionszeit!
So ganz verstehe ich das noch nicht, wie ich das über den Wizard erzeuge.. ich schreibe hier mal Schritt für Schritt auf, was ich mache:
- MFC-Klassen-Assistent aufrufen (Strg+W)
- Karteireiter "Automatisierung" öffnen
- Klasse hinzufügen klicken und Klassenname vergeben.
- Als Basisklasse COleDocument (?) auswählen und unten den Optionbutton von "Keine" auf "Automatisierung" umstellen
- OK klicken
- Jetzt kommt eine WARNUNG: "Klassen-Assistent konnte keine Informationenen über KLasse in .ODL einfügen, da keine Zeile //{{AFX_APPEND_ODL}} gefunden wurde. Sie müssen die Infomationen manuell in die .ODL-Datei einfügen." Auffällig ist auch, dass der Assistent zwar Header- und CPP-Datei erstellt hat, allerdings keine ODL-Datei zu finden ist.
- Methoden und Eigenschaften hinzufügen
- Wieder OK klicken
- Feststellen, dass bei mir kein Licht aufgegangen ist!?!
Kleine Anmerkung am Rande, n Kollege hat sowas schonmal gemacht, der hat von COleControl abgeleitet!?! Ist bei mir nicht aufgelistet?!
-
Das keine ODL Datei angelegt wird, mag ein Problem mit dem Wizard sein.
Ich benutze nie diese Wizards.Als Basisklasse für die Automatisierung ist nur CCmdTarget notwendig. Jede Klasse die von CCmdTarget abgeleitet ist kann automatisiert werden.
Ansonsten siehe AutoClick Example:
http://msdn.microsoft.com/en-us/library/b23wfxw0(VS.90).aspx
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de -
Ich habe jetzt auf einem separaten PC den Wizard ausgeführt, und auch da bekomme ich diese Warnung, d.h. ein Problem mit dem Wizard ist es nicht, leider!
Momentan bin ich mir nicht sicher, ob ich mein Vorhaben überhaupt richtig mitgeteilt habe, ich versuche das nochmal: Ich möchte eine TLB erstellen, welche ich in einer anderen Sprache (in meinem Fall VB6) einbinden kann. Dadurch möchte ich die Möglichkeit bekommen, aus VB6 heraus DIREKT auf Objekten zu arbeiten, welche in C++ implementiert sind. Muss ja irgendwie gehen:)
Der Code, den ich als erstes gepostet habe, sollte da eigentlich schon relativ nahe dran sein!?! Ich kann ja eine TLB schon generieren, aber aus der 'zu öffnenden Klasse' kann kein Objekt instanziiert werden, dh kein New-Operator darauf angewendet werden.
-
Hast Du denn Dein Objekt so angelegt, dass es durch eine Factory erzeugt werden kann?
Siehe DECLARE_OLECREATE, IMPLEMENT_OLECREATE!
Hier gibt es eine Artikelreihe, die das etwas behandelt:
http://www.tenouk.com/visualcplusmfc/visualcplusmfc24.html
(IMHO wird es für Dich ab Automation 3 interessant)
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Jobacca Donnerstag, 14. April 2011 07:03