Seite 1 von 1

laufende exe triggern + Struktur an Procedure übergeben [OK]

Verfasst: 11.11.2016 11:07
von MenschMarkus
Hallo Leute,

folgendes Problem. Ich habe ein laufendes Programm, welches eine Datenbank im RAM aufgebaut hat. Wie kann ich das laufende Programm von außen, also von einem anderen Programm aus triggern und Daten zur Suche in der RAM DB zu übergeben, und eine entsprechende Antwort mit dem Ergebnis zurück geben?
Man könnte zwar das Programm mit Übergabeparameter jedesmal neu starten, da der Aufbau der Datenbank aber ca. 20 Sekunden dauert, ist das keine Option.

Jemand eine Idee?
Danke schon mal für hilfreiche Antworten.

menschmarkus

Re: laufende exe triggern

Verfasst: 11.11.2016 11:34
von RSBasic
Du kannst das z.B. mit einem Callback machen.
Programm A sendet an Programm B: http://www.rsbasic.de/aktualisierung/wi ... mclient.pb
Programm B empfängt die Nachricht: http://www.rsbasic.de/aktualisierung/wi ... mserver.pb

Re: laufende exe triggern

Verfasst: 12.11.2016 00:23
von Derren
Nicht verzagen, RSBasic fragen. :allright:

Re: laufende exe triggern

Verfasst: 12.11.2016 00:31
von ts-soft
Naja, wenn mir jemand sagen kann, was RegisterWindowMessage_("MyOwnMessage") im Code da sucht :mrgreen:

Re: laufende exe triggern

Verfasst: 12.11.2016 00:39
von RSBasic
Stimmt. Das wird in diesem Fall gar nicht benötigt. Danke für den Hinweis.

Re: laufende exe triggern

Verfasst: 13.11.2016 19:57
von MenschMarkus
Ok, erst mal Danke für Eure schnelle Rückantworten.

Es ist schon mal ein Lösungsansatz.
Wie sieht es aber aus, wenn einer mit einem in z.B. C++ geschriebenen Programm auf mein Programm triggern möchte.


Gehört zwar nicht mehr zum Thema aber dennoch eine anschließende Frage

Ich bin am überlegen, ob es da nicht besser ist eine DLL zu erzeugen, die dann, so hoffe ich, auch von Programmen welche in C++/C#/Java o.ä. geschrieben wurden, aufgerufen werden kann. Kann ich leider selbst mangels Wissen nicht testen.

Einige Versuche unter PB habe ich schon erfolgreich durchgeführt. Allerdings die DLL sowie das aufrufende Programm in PB geschrieben.

Hier mal ein Beispiel der DLL mit Parameterübergabe

Code: Alles auswählen

; **********
; Program name: mydll.dll
; **********
EnableExplicit
Structure par
    value1.s
    value2.s
    value3.s
EndStructure
Global parameter.par

ProcedureDLL.s apitest(value1.s,value2.s,value3.s)
    Protected dllreturn.s
    parameter\value1 = value1
    parameter\value2 = value2
    parameter\value3 = value3
    ; ... weiterer Code
    dllreturn = parameter\value1 + " / " + parameter\value2 + " / " + parameter\value3
    ProcedureReturn dllreturn
Endprocedure
Der aufrufende code lautet:

Code: Alles auswählen

EnableExplicit
Define result.i

if OpenLibrary(0,"mydll.dll")
    result = CallFunction(0,"apitest",@"Dies",@"ist",@"ein Text")
    CloseLibrary(0)
    MessageRequester("DLL Rückgabe",PeekS(result))
else
    MessageRequester("Fehler","Konnte DLL nicht öffnen")
endif
Würde der Aufruf dieser DLL auch mit anderer Programmiersprache funktionieren?
Die nächste Frage wird lauten, wie kann ich eine Struktur an die DLL übergeben und wie nehme ich diese in der DLL an?

Danke schon mal für Eure Hilfe
menschmarkus

[edit 15.11.2016]

Einmal kurz nachgedacht und die angekündigte Frage hat sich gelöst. Hier das umgesetzte Beispiel (Der Vollständigkeit halber :) )

DLL mit beiden Varianten:

Code: Alles auswählen

; **********
; Program name: mydll.dll
; **********
EnableExplicit
Structure par
    value1.s
    value2.s
    value3.s
EndStructure
Global parameter.par

ProcedureDLL.s apitest(value1.s,value2.s,value3.s)
    Protected dllreturn.s
    parameter\value1 = value1
    parameter\value2 = value2
    parameter\value3 = value3
    ; ... weiterer Code
    dllreturn = parameter\value1 + " / " + parameter\value2 + " / " + parameter\value3
    ProcedureReturn dllreturn
Endprocedure

ProcedureDLL.s apitest2(*struktur.par)
    Protected dllreturn.s
    ;... weiterer Code
    dllreturn = *struktur\value1 + " / " + *struktur\value2 + " / " + *struktur\value3
    ProcedureRetrn dllreturn
EndProcedure
Der aufrufende code mit beiden Varianten lautet:

Code: Alles auswählen

EnableExplicit
Define result.i

;Struktur definieren
Structure par
    value1.s
    value2.s
    value3.s
EndStructure
Global parameter.par

;Aufruf der DLL mit Übergabe einzelner Parameter
if OpenLibrary(0,"mydll.dll")
    result = CallFunction(0,"apitest",@"Dies",@"ist",@"ein Text")
    CloseLibrary(0)
    MessageRequester("DLL Rückgabe",PeekS(result))
else
    MessageRequester("Fehler","Konnte DLL nicht öffnen")
endif

;Struktur mit Werten füllen
parameter\value1 = "Dies"
parameter\value2 = "ist"
parameter\value3 = "ein Text"

;Aufruf der DLL mit Übergabe einer Struktur
if OpenLibrary(0,"mydll.dll")
    result = CallFunction(0,"apitest2",parameter)
    CloseLibrary(0)
    MessageRequester("DLL Rückgabe",PeekS(result))
else
    MessageRequester("Fehler","Konnte DLL nicht öffnen")
endif