| |
Fortgeschrittene Programmierungstarten einer vb6 exe mit objekt Parameter aus vba | | | Autor: Elvis | Datum: 21.08.19 15:38 |
| Hallo,
ich kann ein Objekt einer mehrfach verwendet Applikationsinstanz von aussen nicht ansprechen (leider nur die 1 Instanz). Kann ich aus dieser Applikation (z.B. 3 instanz) mit ihrerm vba eine externe exe. mit einem Objektparameter der instanz ansprechen, so dass ich dann von aussen auf die Applikation (3 Instanz)zugreifen kann?
Ich gebe quasi durch vba von innen das Object nach aussen.
Ich bitte um eure Hilfe.
---
Alles nicht so einfach | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: Elvis | Datum: 21.08.19 17:50 |
| ich würde also gerne folgendes/ähnliches haben haben:
ich sehe sonst keine Möglichkeit an object_x zu kommen.
VBA
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
wsh.Run "C:\VB6_test.exe", object_x, windowStyle, waitOnReturn
(VB6_test.exe)
Private Sub Form_Load(object_x)
MsgBox object_x.Name
End sub
oder
wsh.Run "C:\VB6_test.exe", "test_sub", object_x, windowStyle, waitOnReturn
(VB6_test.exe)
Public Sub test_sub(object_x)
MsgBox object_x.Name
End sub
Hilfe
---
Alles nicht so einfach | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: Souffleurlos | Datum: 21.08.19 18:54 |
| Hallo Elvis,
Form_Load ist ein Event, da kannst Du keine Parameter setzen. Du kannst es allerdings im App-Objekt und in einer Sub Main haben. Hier kannst Du Parameter aus dem Imageaufruf verwerten.
Also Modul einfügen und eine öffentliche Funtion:
Public Sub Main()
END SUB | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: Elvis | Datum: 21.08.19 19:19 |
| Danke, die,
dachte schon ich währe auf dem Holzweg.
Wie spreche ich denn ein Modul in einer Excel mit Object an?
wsh.Run "C:\VB6_test.exe", "Main", object_x, windowStyle, waitOnReturn ???
Bei exe sehe ich immer nur string Parameter.
Wie komme ich an der Form_load vorbei?
Ganz lieben Gruss
---
Alles nicht so einfach | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: Souffleurlos | Datum: 21.08.19 19:42 |
| Hallo
in Situationen, bei denen die Application nicht läuft mit CreateObject(), sonsto mit GetObject()
Typischerweise also, dass man mit GetObject() beginnt. Bekommt man mit der Funktion ObjPtr(oExl) = 0, sodann CreateObject() aufrufen.
Mit diesem Pointer kann mal alle Funktionen aufrufen, die im Modul als public definiert wurden.
schlußendlich:
Obj.Run .... Makro
Beitrag wurde zuletzt am 21.08.19 um 19:43:50 editiert. | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: Elvis | Datum: 21.08.19 19:57 |
| Hallo,
ich kann Dir leider nicht folgen.
ich bin in einem Programm mit vba-editor und möchte die Applikation C:\VB6_test.exe" öffnen und der
public function Main das Object object_x zuweisen.
Danach ist die exe offen und ich möchte einige Befehle aufrufen, die auf dem Object_x aufbauen, so dass ich in die Applikation des vba Editors eingreifen kann.
Ich komme leider nicht weiter
---
Alles nicht so einfach | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: markusxy | Datum: 23.08.19 14:35 |
| Dein Vorhaben ist doch etwas problematisch.
Ich kenne die Zusammenhänge zwar nicht so genau, meines Wissens kann aber eine Anwendung nicht so einfach auf den Speicherbereich einer anderen Anwendung zugreifen. Objekte austauschen geht nicht so einfach.
Bei einer DLL wäre das im Gegensatz schon möglich.
Außerdem ist es schon möglich auf eine beliebige Instanz einer COM Anwendung zuzugreifen.
Google mal nach Running Object Table (kurz ROT), da solltest du Anleitung dazu finden.
Vielleicht erklärst du mal etwas genauer, was du zu erreichen suchst und warum mehrere Instanzen laufen. | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: Souffleurlos | Datum: 23.08.19 20:34 |
| Hallo Elvis,
also mal von vorne und wie ich das verstehe:
Du hat was in VB6 pogrammiert, was Du auch in VBA verwenden willst.
1. Problem: Wenn Du was in vb6 entwickelt hast, was auch für andere VB - Programme gut ist,
dann sollte der Code in einer ActiveX.DLL oder ActiveX.EXE compiliert worden sein. Eine DLL ist still,
aber eine ActiveX.EXE benimmt sich wie ein richtiges Programmm. Die ActiveE.EXE trägt intern eine öffentliche Classe mit über diese die Exe Eigenschaften, Methoden und sogar Events auslösen kann.
Erzeuge eine neue ActiveX.EXE in die Class1 schreibst:
Public Sub SagWas()
MsgBox "I am also I am"
End Sub
Compiliere die ActiveX.EXE in Name = Projekt1
Binde dann in Excel die Projekt1 über Extras Verweise in dein VBA Projekt
Und in Excel (oder sonst wo) VBA:
Sub thisismytest()
Dim o As Object
Set o = New Project1.Class1
MsgBox o.SagWas
End Sub In seiner Latebinding-Variante (zum verstehen eben).
Das ist der Mechanismus. Über diesen Weg können auch fertige Objekte übergeben und
benutzt werden. Das wird auf Deinem PC gut klappen, aber wennn das Proggie auf anderen
PC's laufen soll müssen Die erst über deine ActiveX.EXE informiert werden was meint:
Du musst Deine ActiveX.EXE auf den anderen PC's registrieren lassen. Versierte Anwender
schreiben deshalb keine VB-AcriveX.EXE programme sondern native DLL's und lassen diese
über RunDLL32 - dieFunktion ausführen. So mache ich das. Ich verwende schon lange kein VB
mehr. | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: markusxy | Datum: 24.08.19 12:08 |
| @Souffleurlos,
ich hab mit dll nur sehr wenig Erfahrung.
Kannst du mir sagen, wie das mit dem gemeinsamen nutzen von Speicherbereich verhält?
Eine DLL/COMDLL läuft ja innerhalb der Anwendung und kann daher auf den Speicher der Anwendung zugreifen.
Wenn die dll aber mittels RunDLL32 (ist für mich Neuland) als "Anwendung" gestartet wird - kann die dann auch auf den Speicher der Client-Anwendung zugreifen? Bei der Exe nehme ich mal auch an, dass das standardmäßig nicht geht.
Für welche Anwendungsbereiche setzt du das Konzept mit RunDLL32 ein?
Welche Vorteile und welche Nachteile siehst du gegenüber dem normalen Einbinden einer dll?
Beitrag wurde zuletzt am 24.08.19 um 12:09:22 editiert. | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: Elvis | Datum: 24.08.19 13:47 |
| Hallo Souffleurlos,
danke für deine ausführliche Hilfe.
Ich werde mich damit beschäftigen und mich in ein paar neue Dinge einarbeiten müssen.
Ganz lieben Gruss und ein schönes WE.
Elvis
---
Alles nicht so einfach | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: Elvis | Datum: 24.08.19 13:49 |
| Hallo Souffleurlos,
danke für deine ausführliche Hilfe.
Ich werde mich damit beschäftigen und mich in ein paar neue Dinge einarbeiten müssen.
Ganz lieben Gruss und ein schönes WE.
---
Alles nicht so einfach | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: Elvis | Datum: 24.08.19 13:52 |
| Danke auch für Deine Hilfe,
ich muss mal schauen wie tief ich da abtauchen kann oder ich doch einen
Workaround suche.
---
Alles nicht so einfach | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: markusxy | Datum: 24.08.19 14:05 |
| Hallo Elvis,
warum gehst du nicht auf die Frage ein was du zu erreichen suchst und warum mehrere Instanzen laufen. | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: Elvis | Datum: 24.08.19 14:14 |
| Hallo markusxy,
ich bin kein Informatiker und denke, dass das zu kompliziert und aufwändig für mich wird.
ich programmiere kleine Skripte und noch vb6.
Es wird wohl dann auch zeit zu wechseln, aber eins nach dem anderen.
danke dir sehr für die Mühe.
---
Alles nicht so einfach | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: Souffleurlos | Datum: 24.08.19 16:13 |
| Hallo Markusxy,
der Client-Prozess ist RunDLL32 und es verhält sich hier genauso wie bei den Diensten. Die DLL bietet einen Eintrittspoint, der genau definiert sein muss, und der DLL ist es verboten auf den Speicherbereich des Clienten zuzugreifen. Es hat seinen eigenen. | |
Re: starten einer vb6 exe mit objekt Parameter aus vba | | | Autor: markusxy | Datum: 24.08.19 17:05 |
| Hallo Souffleurlos,
danke für deine Antwort.
Um es etwas zu präzisieren:
Wenn ich eine Referenz an die DLL übergeben will (String, UDT, Object) aus meiner Anwendung - ist dass dann ein Problem? | |
Also Schritt für Schritt | | | Autor: Souffleurlos | Datum: 25.08.19 12:11 |
| von einer VB6-EXE, die Eigenschaften und Methoden an andockende Clients weiterreichen kann:
1. Öffne VB Editor
2. Als Projekt ActiveX EXE auswählen
3. Die Class1 umbenennen in einen sinnvollen Namen ich nenne sie MakeX
4. Diese Klasse mit Leben füllen. Ich verpasse ihr eine Public Property
Public Property Get X() As Long
X = 10
End Property
Public Property Let X(ByVal nPos As Long)
MsgBox "Hat hier jemand X gerufen?"
End Property Der Code taugt nichts, soll ja nur dem Verständnis dienen
5. Projekteigenschaften
Projekt Typ ActiveXExe
Startup Objekt: Sub Main
ProjektName: MakeXLib
sonst kann alles bleiben. OK klicken
6. Weil es eine EXE ist, soll sie auch etwas
arbeiten: Ein Modul einfügen. Und zu Startmodul
umbenennen (was nicht sein muss).
7. In das Editorfenster
Sub Main()
MsgBox "Ich bin die EXE, nicht schließen!!!"
End Sub Nicht schließen? Ja, sonst ist die EXE geschlossen und
damit auch deren öffentliche Klasse!
8. Kompilieren!
9. Testen. Die MakeXLib.EXE aufrufen. Hat alles geklappt,
erscheint die Msgbox aus Sub Main()
10 Registrieren
H:/MakeX/MakeXLib.EXE /regserver
11. Registry checken, ob gefunden. Found
12. VB-Editor schließen, damit man auf dem Moni wieder was sieht
und das Projekt saven.
13. Excel VBA-Editor über Entwicklertools öffnen
14. Modul einfügen, name: FirstBinding
15. Extras-Verweise-MakeXLib ein Häkchen setzen
16 Im Modul Code
Sub test()
Dim objX As MakeXLib.MakeX
Set objX = New MakeXLib.MakeX
objX = 20
End Sub Und es erscheint die Msgbox darüber, dass jemand X aufgerufen hat.
17. Noch ein Modul einfügen. Nenne es LateBinding.
18 Code
Sub TestlateBinding()
Dim objX As Object
Set objX = CreateObject("MakeXLib.MakeX")
If ObjPtr(objX) Then
objX.X = 20
End If
End Sub So kannn das Programm als EXE laufen und gleichzeitig seine Werte über die öffentliche Klasse
an andere abgeben. Durch die Klasse kann man auf das überliegende Modul zugreifen. Das Testen
ist gefährlich, weil die MsgBox der X-Eigenschaft im Hintergrund aufpoppen könnte und die
OLE-Ation damit nicht abgeschlossen werden kann, weil die Msgbox ja modal ist. Mittels
GetObject() holt man sich die Instanz der laufenden Exe.
Es ist klar, dass hier MakeXLib mehrere Klassen haben kann.
Gruß auch:
Der
der sich von
niemanden reinlabern lässt. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevDTA 3.0 Pro
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere InfosTipp des Monats März 2024 Dieter OtterUTF-8 Konvertierung von Dateien und StringsVB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|