Programme + Verständigung untereinander

Hallo zusammen
mein problem is das mein programm sich unter ganz bestimmten vorausetzungen unvermeidbar aufhängt das wär noch kein sooo großes problem wenn dieses programm kein server wäre und deshalb im normalfall niemand in der gegend ist um die 3 magischen tasten zu drücken :wink:

um das ganze zu vermeiden habe ich aus dem kritischen quelltext eine eigene anwendung geschrieben die je nach bedarf von dem eigentlichen programm gestartet wird
das funktioniert auch allerdings mangeld es an der kommunikation zwischen den beiden programmen deshalb mein frage(n):

  1. Lösung
    jemand erklärt mir wie ich in beiden programmen entsprechende API-schnittstellen schaffe :smile:
  2. Lösung
    jemand hat eine völlig andre (nach möglichkeit simple) methode parat die er mir kurz beschreibt

Danke im voraus
mfg Luemmel

das zauberwort heißt COM oder ActiveX

aus dem kritischen code schreibst du eine ActiveX-dll, die du dann im hauptprogramm über referenzen einbindest = auslagerung eines klassenmoduls in ein eigenes programm.

2Fragen noch
THX
COM scheint wohl keine alternative zu sein oda? :wink:

kann ich die ActiveX.DLL dann wie eine WinAPI deklariern und wie auf eine normale prozedur zugreifen?
muss ich in der ActiveX.DLL noch irgendwelche vorausetzungen schaffen oder reicht es die einzelnen prozeduren darin als public zu deklariern damit ich zugriff habe?

TIA
mfg Luemmel

THX
COM scheint wohl keine alternative zu sein oda? :wink:

…naja, würd ich nicht sagen. Der Vorteil ist, das die ActiveX-Komponenten nicht auf dem Client installiert werden und laufen müssen. Da nimmt man einfach einen Transaction-Server, auf welchem dann die DLL ausgeführt werden.

kann ich die ActiveX.DLL dann wie eine WinAPI deklariern und
wie auf eine normale prozedur zugreifen?

Deklarieren mußt Du nicht unbedingt, sondern nur über Projekt/Referenzen das Library hinzufügen - und sofort stehen Dir alle Methoden, Funktionen und Eigenschaften Deiner DLL zur Verfügung.

muss ich in der ActiveX.DLL noch irgendwelche vorausetzungen
schaffen oder reicht es die einzelnen prozeduren darin als
public zu deklariern damit ich zugriff habe?

Naja, Vorraussetzungen brauchst eigentlich keine, ausser vielleicht den Eigenschaften des Klassen-Moduls (Instancing, etc.) Die Methoden etc. einfach als Public deklarieren, und schon sind sie über jedes Programm aufrufbar (VB, VC++, Delphi usw.) Zusätzlich kannst Du noch Sachen wie „Public Property“ oder „Public Event“ verwenden, sodass die DLL gut kontrollierbar wird. Wenn Du fertig bist, einfach Kompilieren und DLL schreiben, und sie wird automatisch in der Registry Registriert. Wenn Du die ActiveX-DLL durchtesten willst, dann starte Sie mit F5 und klicke „Warten bis Komponent erstellt ist“ an. Dann öffnest Du irgendein anderes VB-Projekt und fügst sie als Referenz hinzu. Wenn Du das Projekt startest, geht VB direkt in den Code der ActiveX-DLL. Mit Haltepunkten usw. kannst dann gut debuggen.

TIA
mfg Luemmel

/dev/stefan

irgendwas versteh ich nicht :frowning:
hmmm ich hab noch nie mit ActiveX.dll’s gearbeitet und bin mir nicht sicher ob ich dich verstehe
zur verdeutlichung ein kleines beispiel (addieren zweier zahlen)
so hatte ich mir das ursprünglich vorgestellt:
########################################################
hauptprogramm:
Private Declare Function addition Lib „C:\WINDOWS\Desktop\Projekt1.dll“ (ByVal a As Long, ByVal b As Long) As Long

Private Sub Command1_Click()
erg = addition(1, 2)
Label1 = erg
End Sub

Projekt1.dll:
Function addition(a As Long, b As Long)
addition = a + b
End Function
########################################################
das funktionier nicht (fehler: keine einsprung… gefunden…)
########################################################
so glaub ich das du es meinst:
hauptprogramm:
Dim obj as Projekt1
Private Sub Command1_Click()
set obj = new Projekt1
erg = obj.addition(1,2)
set obj = nothing
End Sub

Projekt1.dll
genauso
########################################################
das funktionier vielleicht allerdings habe ich in meinem editor unter dem menüpunkt Projekt keinerlei „Referenz…“
ich hab dann den punkt „Verweise“ ausgewählt und wollte die Projekt1.dll hinzufügen —> fehler: „…konnte nicht hinzugefügt werden“

Hauptprogramm:
Name: TestMain
Form: frmMain
Referenz: TestDLL
Code:

Private Sub Test
 Dim ActiveX\_DLL As TestDLL.TestClass
 Set ActiveX\_DLL = New TestDLL.TestClass
 Debug.Print ActiveX\_DLL.Addition(1,1)
 Set ActiveX\_DLL = Nothing
End Sub

ActiveX-Dll

Name: TestDLL
Klassenmodul: TestClass
Code:

Public Function Addition(ByVal intZahl1 As Integer, \_ 
 ByVal intZahl2 As Integer) As Integer
 Addition = intZahl1 + intZahl2
End Function

Alles klar?

Editor mukt auf

Hauptprogramm:
Name: TestMain
Form: frmMain

**-----Da liegt das Problem-----> :Referenz: TestDLL
immer wenn ich versuche genau das zu tun bringt er den fehler:
„Name steht im Konflikt mit vorhandenem Modul, Projekt oder vorhandener Objektbibliothek“

wenn ich Instancing etc als public einstelle kommt der fehler:
„Keine erstellbare öffentliche Komponente vorhanden. …“
?!?

den quelltext selbst habe ich völlig verstanden danke :smile:

mfg Luemmel**

Die DLL und das Klassenmodul darf nicht den selben Namen tragen!

Auch wenn Du im Hauptprogramm ein gleichnamiges Klassenmodul hast, ensteht dieser Konflikt.

/dev/stefan

Die DLL und das Klassenmodul darf nicht den selben Namen
tragen!

jo des kling logisch
das merkwürdige daran:
TestDLL.dll
TestClass.cls

Auch wenn Du im Hauptprogramm ein gleichnamiges Klassenmodul
hast, ensteht dieser Konflikt.

ist ebenfalls nicht der fall

(hab auch schon andre namenskombinationen getestet)
mystisch ich weiss :wink:
mfg Luemmel

„Name steht im Konflikt mit vorhandenem Modul, Projekt oder
vorhandener Objektbibliothek“

Guck mal unter „Project / References…“, dort sollte entweder Deine DLL ODER das DLL-Projekt angehakt sein - beides gleichzeit auf keinen Fall.
Ich weiss jetzt nicht wie ich das halbwegs vernünftig erklären soll, aber in VB hat man ja die Möglichkeit unter „References…“ die ActiveX-DLL direkt auszuwählen, oder eine andere VB-Instance, in der gerade die ActiveX-DLL läuft, um diese besser debuggen zu können.

Beides gleichzeit kann natürlich nicht funktionieren —> darum „References…“ abchecken!!

Bei der Gelegenheit:
Des weiteren sollte „OLE Automation“ angehakt sein. Ich weiss nicht warum (und ehrlich gesagt, es interessiert mich auch nicht so), aber wenn „OLE Automation“ angehackt ist, ersparst Du Dir jede Menge Fehler schon beim Kompilieren.

greets from michL (vienna)

hiho
das hat direkt zwar ned geholfen aber es hat immerhin dazu geführt das ich mir das ganze nochmal angeschaut und rumprobiert hab
inzwischen gehts aber ich seh nich worans lag
ich vermute das es ein bug im editor war?! :wink:
also Thx und mfg Luemmel