OMSI C++ Plug-in Code für Dummies (MS Visual C++)

Das Forum befindet sich im reduzierten Betrieb. Die Addon- und Supportforen bleiben weiterhin verfügbar.
Bitte beachte, dass OMSI nicht mehr weiterentwickelt wird. Ein Teil der Entwickler widmet sich inzwischen der Entwicklung eines neuen Simulators. Weitere Informationen zum LOTUS-Simulator findest Du hier.
  • Hi all
    Ich möchte mich zuallererst bedanken bei holmexx für sein OMSI Plugin Framework. Es hat mir sehr geholfen bei der Programmierung eines Plug-ins für die Motion Platform Software auf www.xsimulator.net
    Allerdings ist dieses Framework für meine einfachen Bedürfnisse viel zu mächtig, da ich für das Plugin lediglich ein paar Werte wie Geschwindigkeit, Längsbeschleunigung, etc. exportieren will.


    Ich habe daher eine DLL geschrieben, die sehr einfach zu benutzen und zu ändern ist:


    Erstelle ein neues Projekt in Visual C++ (New Project… → Win32 Project → spezifiziere Name und Location (z.B. OMSIDLL) → OK → Next → Application type: DLL → Finish)
    Die automatisch erstellte Datei "dllmain.cpp" kannst du gleich löschen, da wir lediglich die Datei OMSIDLL benutzen.
    Kopiere den Code unten (OMSIDLL.cpp) in die Datei "OMSIDLL.cpp"; der bereits vorhandene Code wird komplet überschrieben.


    Erstelle nun im Windows Explorer eine leere Textdatei in deinem Projektordner ("\OMSIDLL" oder so) und benenne sie "OMSIDLL.def".
    Kopiere die Zeilen unten (OMSIDLL.def) in diese Datei und speichere sie (mit der Endung .def).


    Im VisualStudio wählst du nun im Menu Project → OMSIDLL Properties… → Configuration Properties → Configuration: All Configurations → Linker → Input → Module Definition File → <Edit…> → gib "OMSIDLL.def" ein → OK → OK


    Build das Project und kopiere die erhaltene OMSIDLL.dll in den Ordner <OMSI installation folder>\plugins zusammen mit der (zu erstellenden) Datei OMSIDLL.opl; in der Datei definierst du ja bekanntlich deine Variabeln und Trigger (wie, siehe hier; die möglichen Variablen findest du hier und in den entsprechenden Dateien in <OMSI installation folder>\program)


    Viel Spass!

    :D



  • Zitat

    Wäre es vielleicht möglich, dass du den Beitrag durch einige Beispiele ergänzen würdest?
    Ich denke dabei an ein Beispiel, welches einfach nur - sagen wir - drei Variablen untereinander in einem Textfenster ausgibt

    Hier also ein Beispiel, wie man drei solche Variablen in einem Console-Window ausgeben kann:

    Unter Project – Omnibus2 Properties… – Configuration Properties – General – Character Set auf Not Set setzen!


    Die def.Datei darf natürlich auch nicht fehlen, ist aber analog wie oben:

    Die dazugehörige opl-Datei sieht so aus:

  • Hallo zusammen,


    also ich hatte mal eine Frage hier gestellt, weil ich gerne Daten aus Omsi an eine VB6-Applikation zu übergeben und auswerten. Leider bekomme ich da keine nützlichen Hinweise. Value1, du hattest mir geschrieben, das ich die Frage in deinem Thread stellen sollte, welches ich hiermit offiziel tue. Also ich such nach einer Möglichkeit, die Daten wie Geschwindigkeit, Tüerauf oder zu und so weiter in eine VB6- Applikation zu übertragen. Zu meinem Bedauern kann ich keine DLL programmieren. Ich benötige dies um mein USB-Board anzusteuern, mit dem ich dann entsprechende Funktionen zu starten. Leider kann ich mir aus dem Beispiel hier nicht herausnehmen, da ich nicht weis wie ich das in VB6 umsetzen kann. Aber irgendwie müsste es doch möglich sein, auch mit VB6 diese Daten aus OMSI zu erhalten?. Oder geht das überhaupt nicht? Also schonmal ein großes Danke und ich bin für alle Vorschläge offen und würde mich freuen, wenn mir einer helfen könnte. Also dann allen ein herzliches Dankeschön.

  • Also ich such nach einer Möglichkeit, die Daten wie Geschwindigkeit, Tüerauf oder zu und so weiter in eine VB6- Applikation zu übertragen.


    Ich habe selbst versucht, eine für Omsi passende DLL in VB.net zu erstellen und hab mir sogar Hilfe von value1 geholt (der mir sehr viel geholfen hat!), letzten Endes haben wir aber feststellen müssen, dass es nicht möglich ist. Ich habe verschiedene Ansätze versucht, jedoch hat es nicht geklappt. VB6 ist schon eine relativ in die Jahre gekommene Programmiersprache, wenn man das so mal sagen darf, und ich vermute, dass es da auch nicht anders ist.
    Trotzdem gibts eine Lösung! Eine von value1 vorgeschlagene Variante, die ich erfolgreich in Verwendung habe:
    -) DLL in C++ erstellen (hier das Beispiel nehemen)
    -) DLL so anpassen, dass sie alles gewünschte in Memory Mapped Files schreibt
    -) Programm in VB schreiben
    -) im Programm das Memory Mapped File auslesen, Daten verarbeiten


    lG, David

  • Zitat

    VB6 ist schon eine relativ in die Jahre gekommene Programmiersprache, wenn man das so mal sagen darf

    :D


    Zitat

    und ich vermute, dass es da auch nicht anders ist.

    Well, möglicherweise geht das mit VB6. Das Problem mit VB.net ist, dass es managed code ist und wenn ich das richtig sehe, ist das noch nicht der Fall mit VB6. Allerdings bin ich nicht sehr sattelfest in VB6 und kann mich erinnern, dass ich die .dll zum Auslesen einer Darts-Scheibe damals auch mit C++ geschrieben habe und die Daten dann in ein VB-Programm übergeben habe. War offenbar auch damals tricky mit nur VB.

  • Naja das klingt doch schonmal interessant. Um aber nochmal auf die Beispiele oben zurück zu kommen. Also ich habe es endlich geschafft diese DLL aus dem oben genannten Beispielen zu erstellen. Nun habe ich diese Dll in den Plugin-Ordner von Omsi hineinkopiert und die dazugehörige opl-Datei erstellt. Wenn ich Omsi jetzt starte geht ein Consolenfenster auf(welches die DLL gestartet hat), bleibt aber vorerst schwarz, da omsi ja noch nicht geladen ist. Und dann

    ;(

    kommt immer die Fehlermeldung "Zugriffsverletzung bei Adresse 0000000000.".

    :cursing:

    Ich habe schon einige Zeit damit zugebracht, um herauszufinden, warum Visual Studio 10 diese Dll nicht erstellen wollte, dann nach einer kleinen Einstellung im Projekt und dann klappt es endlich. Da hatte ich mich schon gefreut, es geschafft zu haben

    8o

    , aber leider kommt jetzt diese Fehlermeldung

    ?(

    . Was mach ich nur Falsch

    :?:

    . Naja aber immerhin schonmal ein kleiner

    :thumbsup:

    Erfolg. Zur Zeit habe ich ein Nebenprojekt für Omsi laufen. Mit dem kann ich mir bestimmte zustände schonmal anzeigen lassen. Nur leider ein kleiner Fehler und nichts stimmt da mehr, daher möchte ich das gerne über ein Plugin erreichen. Notfalls auch in c++ oder was auch immer. Also schonmal danke auch für die beiden Beispiele oben.

  • Nur leider ein kleiner Fehler und nichts stimmt da mehr, daher möchte ich das gerne über ein Plugin erreichen. Notfalls auch in c++ oder was auch immer. Also schonmal danke auch für die beiden Beispiele oben.


    Hast Du schon mal über Delphi nachgedacht. Ich habe damit auch gerade angefangen und bereits erste Erfolge gefeiert. Das heißt, ich konnte bereits das von M&R erstellte Plugin nachbasteln, bis auf eine Sequenz, und auch schon erweitern. Vielleicht kann man sich ja ergänzen?


    Gruß Zehlendorfer35465

  • Und dann

    ;(

    kommt immer die Fehlermeldung "Zugriffsverletzung bei Adresse 0000000000.".

    :cursing:


    Diese Fehlermeldung kommt bei mir auch, gibt es hier schon eine Lösung ???
    Es steht hinter der Zugriffsverletzung auch noch Lesefehler 0000000000


    Danke für eure Hilfe

    :?:
  • Nun ich versuche mich grade in C++, aber auch da komme ich nicht weiter, wenn ich versuche einige Beispiele in eine Dll zu schreiben, bekomme ich von VisualC++Express immer eine Fehlermeldung, das die Dll nicht erstellt werden konnte. Auch das Beispiel von "Value" funktioniert leider nicht. Auch hier bekomme ich diese Fehlermeldung, obwohl ich genau die Schritte wie unter OMSI C++ plug-in code for dummies (MS Visual C++) beschrieben, leider ohne Erfolg und mit dem selben Fehler. Anscheinend bin ich nur zu doof dafür. Und mit Delphi will ich auch nicht anfangen ( zum einen zu teuer) und für viele andere Projekte leider auch unnötig, daher würde ich schon gerne bei C++ bleiben. Aber ich bekomme es einfach nicht hin eine Dll zu schreiben, die die Daten aus Omsi ausliest und in eine externe Datei schreibt.
    Dann könnte ich die Datei mit VB6.0 einlesen und auswerten.

    ;(


    PS: Eine Frage direkt an DAVIDPS
    Kannst du mir da mal ein paar Beispiele geben wie du das angestellt hast, mit den Daten für VB6. Würde mich wirklich brennend interessieren, wie du das gemacht hast.