none
Problem with an odl-file. Can't initialize an object from extern!?! RRS feed

  • 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:

    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
    
    As you can see in the commend, there occurs an error when trying to initialize with 'new'.

    The Constants work fine.


    I dont't get it, where is the problem?????

     

    thanks in advance:)

    Mittwoch, 13. Oktober 2010 12:38

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
    Dienstag, 7. Dezember 2010 09:13
    Moderator
  • 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
    Mittwoch, 13. Oktober 2010 14:13
    Moderator

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
    Mittwoch, 13. Oktober 2010 14:13
    Moderator
  • 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?!


    Montag, 6. Dezember 2010 11:08
  • 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
    Montag, 6. Dezember 2010 11:17
    Moderator
  • 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.

    Dienstag, 7. Dezember 2010 08:27
  • 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
    Dienstag, 7. Dezember 2010 09:13
    Moderator