vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
starten 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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel