Standard-EXE in ActiveX-DLL umwandeln

Guten Morgen,

ich hab mit VB ein Programm erstellt, welches ich nun in eine ActiveX-DLL umwandeln möchte. Diese möchte ich dann als Komponente in Word integrieren und in einer Dokumentenvorlage in die Menüzeile einbinden.

Ich habe schon einiges probiert, aber nichts hat zum Erfolg geführt.

Meine Standard-EXE besteht aus einer Form und 3 Modulen.
Beim Programmstart soll einfach nur die Form aufgerufen werden.

Danke im Vorraus.
MfG

Hallo,

ich hab mit VB ein Programm erstellt, welches ich nun in eine
ActiveX-DLL umwandeln möchte.

das geht so nicht.

Wenn Du VB startest, kommt ein Auswahlmenü, in dem Du wählen kannst, was Du schreiben möchtest. Standard-Exe, ActiveX-Exe, ActiveX-Steuerelement’. Die Möglichkeit besteht erst ab VB-Pro, ich hoffe, Du arbeitest nicht mit der Standard-Edition.

Diese möchte ich dann als
Komponente in Word integrieren und in einer Dokumentenvorlage
in die Menüzeile einbinden.

Ich habe schon einiges probiert, aber nichts hat zum Erfolg
geführt.

Meine Standard-EXE besteht aus einer Form und 3 Modulen.
Beim Programmstart soll einfach nur die Form aufgerufen
werden.

Den Code der Form wirst Du in die Userform des ActiveX-Steuerelements kopieren müssen und etwas Code anpassen, Deine Module brauchst Du nur zu laden.

Ach ja, wenn Dein Projekt eine Form enthält, wird das eher ein .ocx als eine .dll, vermute ich.

Gruß, Rainer

Danke für die Antwort.

Ich habe von dieser Materie noch absolut keine Ahnung.
Nunja, jedenfalls habe ich hier eine Aufgabenstellung die so formuliert war:

Schritt 1: Erstellen Sie mit VB ein Programm das XYZ berechnet.
Schritt 2: Wandeln Sie ihr Programm in eien ActiveX-DLL um und integrieren Sie die Komponente in Microsoft Word für Windows. Erstellen Sie eine eigene Dokumentvorlage und binden Sie den Programmaufruf in die Menüzeile der Vorlage ein.

Ich muss also definitiv ActiveX-Steuerelement wählen?
Das hab ich bisher nicht getan, weil mich ja an die Aufgabenstellung halten wollte.

Und inwiefern muss ich da Codeanpassungen vornehmen?

MfG

Hallo,

Ich habe von dieser Materie noch absolut keine Ahnung.
Nunja, jedenfalls habe ich hier eine Aufgabenstellung die so
formuliert war:

Schritt 1: Erstellen Sie mit VB ein Programm das XYZ
berechnet.
Schritt 2: Wandeln Sie ihr Programm in eien ActiveX-DLL um und
integrieren Sie die Komponente in Microsoft Word für Windows.
Erstellen Sie eine eigene Dokumentvorlage und binden Sie den
Programmaufruf in die Menüzeile der Vorlage ein.

ach so, ich dachte Du brauchst die Funktion. Daß die aufgabenstellung ‚.dll‘ lautet, konnte ich ja nicht wissen.

Ich muss also definitiv ActiveX-Steuerelement wählen?

Unter den Bedingungen nicht. :smile:

Das hab ich bisher nicht getan, weil mich ja an die
Aufgabenstellung halten wollte.

Und inwiefern muss ich da Codeanpassungen vornehmen?

Wenn es eine .dll werden soll, hast Du keine Form, wenn ich das richtig verstanden habe.

‚Umwandeln‘ geht so viel ich weiß gar nicht, Du musst ein neues Projekt starten und kannst dann Deinen bisherigen Code zum Teil einfach in das neue Projekt kopieren.

Mit ActiveX-Dlls habe ich keine Erfahrung, ich habe mich bisher auf ActiveX-Steuerelemente beschränkt, die sind in VB bequemer zu verwenden und mit VBA arbeite ich nicht, da kenne ich mir gar nicht aus.

Gruß, Rainer

Hallo,

bei dem Wort ‚Aufgabenstellung‘ beschleichen mich Zweifel, daß wir vom selben Thema reden.

In diesem Brett geht es um VBA, VB4, VB5, VB6 und VBS. Für VB.NET, VB2005.NET gibt es etwas weiter oben das Brett ‚.NET & C#‘.

Wenn Du über .NET redest, vergiss alles was ich geschrieben habe, über .NET weiß ich nur, daß da alles völlig anders ist. Dann lösche ich den Thread hier wieder und Du stellst die Frage im richtigen Brett noch einmal. OK?

Gruß, Rainer

Also,

ich habe eine UserForm.
Die brauche ich auch definitiv.

Da das mit .dll nicht zu funktionieren scheint, habe ich mal ActiveX-Steuerelement ausgewählt.

Ich bin folgendermaßen vorgegangen:

  1. In VB ein neue Projekt erstellt und ActiveX-Steuerelement ausgewählt.
  2. Ich habe die UserForm und die 3 Module hinzugefügt.
  3. Ich habe alle Steuerelemente von der Form auf die UserControl kopiert.
  4. Ich habe den entsprechenden Quellcode kopiert.
  5. In den Modulen habe ich an den entsprechenden Stellen „Name der UserForm“ durch „Name der UserControl“ ersetzt.

Das scheint allerdings nicht zu funktionieren.
Stehe hier wie gesagt vor Neuland.

MfG

Hallo,

sicherheitshalber die Frage: Es geht um VB6?

ich habe eine UserForm.
Die brauche ich auch definitiv.

Da das mit .dll nicht zu funktionieren scheint, habe ich mal
ActiveX-Steuerelement ausgewählt.

Ich bin folgendermaßen vorgegangen:

  1. In VB ein neue Projekt erstellt und ActiveX-Steuerelement
    ausgewählt.
  2. Ich habe die UserForm und die 3 Module hinzugefügt.
  3. Ich habe alle Steuerelemente von der Form auf die
    UserControl kopiert.
  4. Ich habe den entsprechenden Quellcode kopiert.
  5. In den Modulen habe ich an den entsprechenden Stellen „Name
    der UserForm“ durch „Name der UserControl“ ersetzt.

Das scheint allerdings nicht zu funktionieren.
Stehe hier wie gesagt vor Neuland.

Im Code für die Form musst Du auch eine Kleinigkeit anpassen, die Prozeduren wie ‚Form_…‘ heißen dann ‚UserControl_…‘
Das kompilierst Du dann zu einem OCX, das Du dann in einem neuen Projekt wie jedes beliebige andere Steuerelement verwenden kannst.

Funktionen, die Du von Deinem neuen Projekt aus aufrufen möchtest, musst Du global deklarieren.

Gruß, Rainer

Ja, es geht um VB6.

Die Funktionsnamen sind jetzt angepasst.
Das scheint auch zu funktionieren.

Bleibt ein Problem:

Wenn ich von den Modulen aus auf Steuerelemente auf der UserControl zugreifen will, dann kommt die Fehlermeldung „Variable nicht definiert“

Ich habe den Text in dieser Form verändert:

UserForm.Steuerelement.Eigenschaft

wurde zu

UserControl.Steuerelement.Eigenschaft

Wo liegt der Fehler?

Nachtrag - einfacher Code
Hallo,

mal ein ganz einfacher Code.

Option Explicit

Private Declare Sub Sleep Lib "kernel32" \_
 (ByVal dwMilliseconds As Long)

Private Sub Command1\_Click()
 Dim i As Integer
 For i = 10 To 0 Step -1
 Command1.Caption = "noch " + CStr(i) + " Sekunden"
 DoEvents
 Sleep 1000
 Next
 Me.Hide
End Sub

Private Sub UserControl\_Initialize()
 Command1.Caption = "Hier klicken"
End Sub

Public Function Multiplikation(ByVal a As Single, ByVal b As Single) As Double
 Multiplikation = a \* b
End Function

Wenn Du das zu einem Steuerelement kompilierst und das dann in einem Projekt verwendest, geht beim Start des Programms das Fenster auf und Du siehst die Schaltfläche: ‚hier klicken‘. Klickst Du darauf startet ein Countdown von 10 bis Null, dann wird das Steuerelement unsichtbar.

Was Dir erhalten bleibt ist die Funktion ‚NameDesSteuerelements.Multiplikation (a,b)‘

Gruß, Rainer

Hallo,

Ja, es geht um VB6.

wunderbar! :smile:

Mit Modulen habe ich im OCX so auch noch nicht gearbeitet, da musste ich eben auch erst suchen. :smile:

Du musst im Modul erst das Usercontrol deklarieren und kannst dann auf alles das zugreifen, was global deklariert ist. In dem Beispiel von eben ist das die Funktion ‚Multiplikation‘.

Option Explicit

Dim UC As UserControl1

Private Sub test()
 Dim RET As Double
 RET = UC.Multiplikation(a, b)
End Sub

Wenn Du die Steuerelemente verwenden willst, musst Du die Ereignisse auf dem Usercontrol verarbeiten und die Prozeduren global deklarieren.

Public Sub Command1\_Click()
 'Code
End Sub

Das Usercontrol ist eben keine Form. :frowning:

Gruß, Rainer

Habe jetzt ein bißchen herumprobiert und das Prinzip glaube ich verstanden.

Ich kann von einem Modul also maximal auf die globalen Prozeduren zugreifen?
Es ist mir nicht möglich zum Beispiel den Inhalt einer Textbox auszulesen oder eine Eigenschaft eines Steuerelements zu verändern?
Ich kann auch keine ComboBoxen mit Elementen füllen?

Dann ist es nun aber vorbei mit der Übersichtlichkeit =)

Zusatzfrage
Hallo,

Wenn ich von den Modulen aus auf Steuerelemente auf der
UserControl zugreifen will, dann kommt die Fehlermeldung
„Variable nicht definiert“

wenn Du vom Modul aus auf Steuerelemente auf der Form zugreifen willst, machst Du scheinbar etwas grundsätzliches falsch. In Module gehört wiederverwendbarer Code, oder Code, den man von verschiedenen Formen aus verwenden möchte und globale Deklarationen.

Im Modul gibt es ja keine Ereignisse. Die Ereignisse werden also im Usercontrol ausgelöst und von dort aus die Prozeduren im Modul angesprochen.

Was möchtest Du dann im Modul vom Usercontrol lesen?

Wenn es z.B. der Text einer Textbox ist, dann ist das so herum der falsche Weg, dann gehört in die Prozedur im Usercontrol die Variabl und die Inhalte übergibst Du schon beim Aufruf der Prozedur.

Public Sub Beispiel(ByVal VariableA As Integer, ByVal VariableB As String)

Aufruf:
Beispiel 10, Text1.Text

Gruß, Rainer

Hallo,

Ich kann von einem Modul also maximal auf die globalen
Prozeduren zugreifen?

Ja.

Es ist mir nicht möglich zum Beispiel den Inhalt einer Textbox
auszulesen oder eine Eigenschaft eines Steuerelements zu
verändern?

Ja, das ist ja auch nicht nötig, wenn Du den Text als Parameter mit dem Aufruf übergibst.

Ich kann auch keine ComboBoxen mit Elementen füllen?

Nein, das gehört nicht ins Modul.

Dann ist es nun aber vorbei mit der Übersichtlichkeit =)

Wieso? Das steht doch in den Prozeduren der Userform genau so gut. Warum muss das in ein Modul? Dafür sind Module nicht da.

Ich fürchte, Du wirst Dein Projekt leicht ‚umorganisieren‘ müssen. :smile:

Gruß, Rainer

Schon passiert.
Funktioniert auch alles.

Ich konnte das meiste einfach rüberkopieren.

Habe nun nur noch die Funkionen in Modulen stehen, so wie es gedacht ist =)

Zu der Übersichtlichkeit:
Ich hatte meine Prozeduren halt auch in den Modulen drin.
Fand ich einfach übersichtlicher.

Mir ist schon klar, dass da nur die Funktionen reingehören,
aber für diese Übungsaufgabe war mir die Übersichtlichkeit wichtiger =)
Nunja, jedenfalls funktioniert jetzt alles, vielen Dank.

MfG

Hallo Rainer,

wie es scheint, hat er ja das Problem gelöst :smile:

Aber ich möchte auch mal kurz meinen Senf dazu werfen :wink:

Wenn du eine Standard EXE hast, so kannst natuerlich jederzeit daraus eine DLL basteln :smile:
Ich selbst erstelle meine Projecte immer als Standard EXe und wenn sie laufen dann bastel ich daraus eine DLL! Dann erstelle ich ein neues Project ( Standard EXE) und binde dann dort die generierte DLL ein.

Das hat den Vorteil, das die EXE sehr klein ist und nicht einige Mbyte’s gross :smile:

MfG Alex

Hi Alex,

Wenn du eine Standard EXE hast, so kannst natuerlich jederzeit
daraus eine DLL basteln :smile:

verrätst Du uns auch noch wie? Ich habe keine Ahnung, wie das geht.
Ein Beispiel, wie Du die DLL dann verwendest wäre auch noch nett. :smile:

Die DLLs von Windows mit Einsprungspunkten zu verwenden ist kein Problem, aber wie verwendet man eine ActiveX-DLL?

Gruß, Rainer

Hallo Rainer,

holla die Waldfee :s Nungut dann versuche ich das mal zu erklären.

Also als erstes erstellen wir mal unsere Standard EXE!

Erstelle dazu ein neues Project, dazu eine Form (Form1). Darauf 2 Buttons (Command1 und Command1)
In dem Project Eigenschaften, geben wir dem Project einen eindeutigen Namen. Nennen wir ihn HelloWorld

Kopiere dann folgenden Source in die Form

Option Explicit

Private Sub Command1\_Click()
 MsgBox "Hello World"
End Sub

Private Sub Command2\_Click()
 Unload Me
End Sub

Wie du siehst, macht das Dinge nichts besonderes. Beim KLick auf Command1 bekommst du eine MSGBox und bei Klick auf Command2 beendet sich die Exe.

Ist ja nur zu Testzwecken!

So nun möchten wir das ganze Teil mal umwandeln in eine Activex DLL.
Mache dazu folgendes!

  1. Erstelle ein Modul
  2. In dem Modul erstelle eine Sub Main
  3. In den Project Eigenschaften, stelle ein das das Project in der Sub Main startet :smile: Normal macht man das ja auch so.
    Schritt 2 und Schritt 3 koennen entfallen, aber dann würde der Aufruf anders ausschauen. Aber mehr dazu später!

In der Sub Main ( im Modul) schreiben wir folgendes

'Code Module1
Option Explicit

Sub main()
 Form1.Show 
End Sub
  1. Wir schauen ob das Progg noch läuft
    * JA -> Alles OK, weiter im Schritt 5
    ’ Nein -> Da hast irgendwas falsch gemacht :s

  2. Wir gehen wieder zu den Project Eigenschaften und stellen dort folgendes ein!
    * Project Type -> ActiveX DLL
    * StartUp Object -> None

  3. Wir fügen ein Klassenmodul hinzu und eben in ein einschlaegigen Name. Nennen wir die Klasse mal Test

  4. Wir stellen je nach Bedarf die Instancing Eigenschaft ein. Zum testen, stellen wir sie auf 6 ( Global MultiUse)

  5. Nun kopieren wir folgenden Source in das Klassenmodul

    Option Explicit

    Public Sub ExeStart() ’ Diese Sub muessen wir später aufrufen
    Call main ’ Die Sub Main in Module1 wird aufgerufen.
    'Alternativ koenntest du hier auch Form1.Show schreiben
    'Da hatte ich oben geschrieben, das wenn man keine Sub Main brauch :smile:
    End Sub

  6. So das sollte es schon gewesen sein. Nun speichern wir das ganze Project ab :smile:

  7. Wir compilieren es und erstellen uns die Activex DLL
    Bei mir geht das unter File -> Make HelloWorld.Dll

  8. Nun haben wir die gewuenschte Dll :smile:

  9. Wir erstellen nun ein neues Project ( Standard EXE)

  10. Zum Testen reicht eine Form mit 2 Buttons ( Command1 und Command2)

14.wir setzen nun ein Verweis auf die DLL!

15: Kopiere folgenden Source in die Form

Option Explicit

Private Sub Command1\_Click()
 Dim X As New HelloWorld.Test
 Call X.ExeStart
End Sub

Private Sub Command2\_Click()
 Unload Me
End Sub

So, dann probiere das mal aus und gebe Bescheid ob alles geklappt hat!
Sollte dir etwas unklar sein, so gebe einfach Bescheid :smile:

MfG Alex