Auf Fremdes Programm zugreifen, Funktionen benutzen



  • Guten tag Community,
    Vorab: Ich habe gewisse kenntnisse, sind zwar eher Java basierend, aber bis dato bin ich mit C++ auch gut klar gekommen.

    Das Problem:
    In der Firma in der ich Arbeite, programmieren wir Kassen, momentan bin ich an einem Projekt beteiligt, das auf windows basiert. Nun will ich ein programm schreiben, das ein Fenster im Programm erzeugt, das geht ohne Probleme.
    Nun will ich aber Funktionen, aus der Kassensoftware für mich nutzen, da klemmt es.
    Die Software ist in Borland C geschrieben,(war nicht meine Idee ;).)
    Die funktionsnamen kenn ich, jetzt müsste ich nur wissen, wie ich sie aufrufe, da ich unter Java soetwas nochnie gemacht hab, bin ich total planlos.

    Meine Frage:
    Selbst wenn ich es schaffe die funktionen mit meinem Programm aufzurufen, werden die funktionen dann auf mein Programm oder auf an der Kassensoftware ausgeführt? Wenn es nur in meinem Programm ausgeführt wird, wie kann ich das ändern, und klicks aus meinem Programm, auf der Kasse ausführen.

    Wenn ihr sagt, das macht kein sinn, das ist zu aufwendig, bitte mitteilen. Dann weiß ich gleich, ob es sich lohnt oder nicht.

    Vielen Dank.
    Mit Freundlichsten Grüßen,
    - CerealGuy



  • Eeeeigentlich soll so was nicht gehen. Wenn du in deinem Programm immer drauf vorbereitet sein müsstest, dass jemand anders kommt und irgendwelche Funktionen neben deinem Programmlauf aufruft, wäre die Programmierung deutlich schwieriger. Ich wäre auch sehr überrascht, wenn die Kassensoftware darauf vorbereitet wäre, dass du so etwas machst.

    Kurzum: Lass es lieber.

    Wenn du wild entschlossen bist, ist CreateRemoteThread wohl, wonach du suchst. In Java direkt wirst du das nicht machen können (weil systemspezifisch), aber per JNI ist es möglich. Dann gehört der Thread aber eher ins WinAPI-Forum.

    Oder meinst du mit "Funktionen aufrufen" das klicken von Knöpfen und Drücken von Tasten? In dem Fall solltest du dir eher SendInput ankucken.



  • Kannst du bitte etwas genauer schreiben, was du möchtest? Also was macht deine Software, was macht die Kassensoftware und was genau willst du aufrufen? Willst du die Kassensoftware "fernsteuern"? Oder willst du lediglich einige Funktionalitäten verwenden, die im Rahmen der Kassensoftware geschrieben wurden?



  • Interresant wäre auch ob es den Quelltext dazu gäbe oder evt. auch ein Plugin Interface.

    Gibt es Doku zu der Kassen-SW, welche sich näher mit dem Interna's beschäftigt?



  • [Vorab]
    Danke für die ganzen Antworten :).

    Die software ist nicht darauf vorbereitet.

    Ich erkläre nochmal:
    Ich habe eine Kassensoftware XY, da ich die Funktionen ein bisschen erweitern möchte, um es für den kunden einfacher zumachen.
    Ich habe die DLL's gefunden, in den die Funktionen "verborgen" sind.
    Nun möchte ich diese Funktionen aufrufen. Habe aber die beführchtung, das wenn ich die funktion aufrufe, nicht an der Kasse ausgeführt wird, sondern in meinem Programm, das damit nichts anfagen kann.

    Mein Ziel ist es, ein Fenster im Programm anzuzeigen mit ein paar buttons(Das ist kein Problem, das hab ich). Wenn einer der Buttons gedrückt wird. Ruft das Programm eine Funktion der Kassensoftware auf.

    MFG
    -CerealGuy



  • CerealGuy schrieb:

    Ich habe die DLL's gefunden, in den die Funktionen "verborgen" sind.

    Dann sollte es dazu Doku, Header und sonstiges was man braucht geben 😃

    Wenn man dann weiss was die Funktionen genau machen, dann weiss man auch ob es Sinn macht die von einem externen Programm aus aufzurufen 😮



  • Es gibt keine Doku, aber ich nehm jetzt mal als alias die funktion buchen(string artk) in der xy.dll.
    Ist es dann nicht machbar, das ich ein programm schreib, das klamm & heimlich die funktion buchen("Kleine Spezi"); aufruft?

    MFG
    -CerealGuy



  • Klar, kannst du die Funktion buchen aufrufen. Allerdings sind dein buchen-aufrufendes Programm und die laufende Kassensoftware zwei verschiedene Prozesse mit ihrem eigenen Datensegmenten für Variablen, die sich lediglich den Funktionscode über die DLL teilen würden. Du würdest das Verhalten der Kassensoftware also dadurch nicht verändern. Wenn die Kassensoftware keinen Mechanismus vorgesehen hat, mit dem andere Prozesse ihr sagen können, was sie zu tun und lassen hat, und du den Quellcode der Kassensoftware nicht hast, dann sieht es schlecht für dich aus.



  • Vielleicht suchst du sowas?



  • API Hooking hilft hier wohl nicht, da TE gezielt Funktionen der DLL aufrufen möchte, um eigene Aktionen zu starten. Das ist möglich, aber mit viel Fummelei und bösen Hacks verbunden. Vielleicht gibt es elegantere Lösungen, aber ich kann mir vorstellen, dass das so funktioniert:

    1. Eigenen Funktionscode per VirtualAllocEx in den fremden Prozess laden.

    2. Dieser Funktionscode wird dann per CreateRemoteThread als eigener Thread im fremden Prozess gestartet.

    3. Synchronisierung mit dem Hauptthread der fremden Anwendung. Wenn die fremde Anwendung ein Fenster hat kann man den Nachrichtenhandler auf eine eigene Funktion umbiegen. Diese Funktion leitet alle Fensternachrichten an die Originalfunktion weiter, enthält aber Handler für eigene Fensternachrichten. Die Synchronisierung erfolgt dann über SendMessage , das dann ggf. einen Kontextwechsel herbeiführt, um die Nachricht im Hauptthread der Anwendung zu behandeln.

    Alles in Allem viel Frickelei, und nicht durch Anfänger umsetzbar.



  • Ich bin ehrlich. 🙂

    Api Hooking, SendInput und anderes Gehacks verursachen bei mir Bauchweh. Insbesonders wenn ich an die Unsummen von Geld denke, die eine solche SW bearbeitet. 😞

    Wenn du nicht an die Sourcen herankommst, kein Plugins Interface hast, keine Doku vorhanden ist, wäre es für mich ein starkes Indiz die Finger wegzulassen. Unbekannte Seiteneffekte der einzelnen Funktionen verderben hier den Spaß.

    Nachher verursacht die Funktion buchen() einen massiven Schaden, weil diese Funktion nicht nach der Funktion abrechnung() aufgerufen werden darf, und dann kommt man zu dir und motzt: "Was für ein Sch.... hast du programmiert!" -> Nein danke.



  • @TE

    Haste mal den Hersteller kontaktiert und dich erkundigt, welche Möglichkeiten es da gibt?



  • CerealGuy schrieb:

    Es gibt keine Doku, aber ich nehm jetzt mal als alias die funktion buchen(string artk) in der xy.dll.
    Ist es dann nicht machbar, das ich ein programm schreib, das klamm & heimlich die funktion buchen("Kleine Spezi"); aufruft?

    MFG
    -CerealGuy

    Klar kannst Du die Funktion aufrufen.

    Aber wenn Du nicht weißt was die Funktion intern macht und wie die Synchronisation mit der Kassen-SW abläuft macht das keinen Sinn und ist Stochern im Dunkeln.


Anmelden zum Antworten