Missing vcruntime140.dll / vcruntime140d.dll

Deine Visual Studio Anwendung beschwert sich über eine fehlende vcruntime140d.dll? Das “d” steht für debug, bitte als “Release”-Version kompilieren.

Deine Visual Studio Anwendung beschwert sich (nun) über eine fehlende vcruntime140.dll? Dann bitte das aktuelle Microsoft Visual C++ Redistributable Package installieren. Achtung: Ob x64 oder x86 entscheidet sich nicht an der Systemarchitektur, sondern an der Programm-Version! Also: Win32-Anwendung läuft nicht -> x86-Package installieren.

hth

C++ println

Dem nächsten, der mir erzählt, Strings wären in Java nicht ganz selbsterklärend (was sich im Wesentlichen darauf beschränkt, dass es keine Primitives sind), dem lach ich ins Gesicht und verweise ihn auf diese gewachsene String/char/…-Welt in C++.

Also. Modulo weiterer Anwendungsfälle, die ich dann ergänze, scheint Textausgabe wie folgt ganz gut zu funktionieren. Ich wollte an der Stelle kein printf verwenden, weil ich jede Ausgabe (zentral) prefixen wollte. Vermutlich könnte man printf einfach wrappen, indem man dessen Signatur kopiert, egal:

Aber bitte auch an den Anfang der Datei, sonst werden die Funktionen nicht gefunden m(

Update: Schön (wenn auch ohne Prefix) ist auch

Java: C/C++ über JNI einbinden

Neulich musste ich eine DLL aus Java heraus ansprechen. Zur Wahl stehen JNI und JNA, wobei JNA “nur” ein Wrapper für JNI ist – und bei mir nicht funktioniert hat. In der Theorie ist JNI aber auch nicht schwer, allerdings legt Visual Studio einem mir Steine in den Weg. Ein Grund mehr, bei Java zu bleiben.

Der Java-Teil ist dann auch denkbar einfach:

Diese DllBridge wird dann in eine Headerdatei übersetzt:

Und diese Header-Datei dann in “das” C/C++-Projekt kopiert. An “das” Projekt kommt man wie folgt:

  • Visual Studio installieren; ich habe Visual Studio Community 2017 mit den Standardkomponenten genommen
  • Neues C++/Win32-Projekt anlegen, im Dialog unter “Anwendungseinstellungen” den Anwendungstyp “DLL” wählen
  • Ich habe das Projekt testweise MyDll genannt, die entstehende .dll heißt später genauso

Nachdem man die DllBridge.h in das Projekt kopiert und über Rechtsklick > Include In Project eingebunden hat, kann man ihre Methoden implementieren. O.g. Code erzeugt genau eine Methode Java_DllBridge_hello, siehe DllBridge.h. Deren Implementierung in der .c-Datei:

Alleine die Importe und die korrekte Version von MessageBox herauszufinden, hat sicher eine Stunde gedauert 😡 Oh, Stichwort “Importe”: jni.h wird vom  JDK mitgebracht, die entsprechenden Ordner muss man in VS bekannt machen. Das funktioniert nicht über einen Symlink, sondern über die Projekteinstellungen, indem man unter Configuration Properties > C/C++ > General > Additional Include Directories diese drei Verzeichnisse hinzufügt (Rekursion wäre ja auch zu einfach.):

  • C:\Program Files (x86)\Java\jdk1.8.0_121\include
  • C:\Program Files (x86)\Java\jdk1.8.0_121\include\win32
  • C:\Program Files (x86)\Java\jdk1.8.0_121\include\win32\bridge
    PS Ja: Das ist ein 32-Bit-Java, weil ich letztlich eine 32Bit dll ansprechen will.

Das Ganze sollte jetzt bauen (Build > Build solution, oder STRG+Shift+B) und eine <Projektname>.dll erzeugen, siehe Konsolenausgabe. Der Name der .dll muss dem im initialen Java-Code entsprechen.

Ein Aufruf von

öffnet dann die MessageBox:

Sowie die erwartete Ausgabe auf der Konsole. Für reine C-Anbindung könnte man hier aufhören.

Interessant wird es nun, wenn man langlebigere C++-Objekte von Java aus referenzieren möchte. Idee:

  • Eine Klasse auf Java-Seite, die die dll lädt, sowie die nativen Methoden bereitstellt, und eine Klasse auf C++-Seite, die diese implementiert
  • Die C++-Klasse wird initialisiert, ihren Pointer gibt man in Form einer long an Java zurück (bzw. jlong, vgl. hier), vermutlich ist das die Speicheradresse
  • Über diese long kann Java dann das Objekt referenzieren
  • Braucht man das C++-Objekt nicht mehr, wird es deleted.

(via, längeres Beispiel, Danke Nils!)

Hier sieht das so aus:

Bzw. in C++:

Aufruf in Java dann:

Last but not least die andere Richtung, also C++ nach Java. Die Methode

lässt sich von C++ aus aufrufen über

Weiterführendes dazu hier.

hth

Yamaha Fernbedienung programmieren

Seit 5 Jahren habe ich einen Yamaha RX-V671 Receiver, und beschwere mich seit dem, dass ich mit seiner Fernbedienung nicht den CD Player fernbedienen kann – ebenfalls ein Yamaha, ein CD-S 300. Stellt sich raus: Kann man doch. Und auch den Panasonic Plasma (ein TX-P42GW30) und den BD Player DMP-BD77EG-S. Funktioniert halt nur nicht per Kabel, wie damals zu meiner Zeit, sondern einfach per Programmierung über die Fernbedienung (eine RAV438, btw):

  1. “Code Set” oben rechts drücken; die Grüne LED sollte zwei mal kurz blinken.
  2. Den zu programmierenden Input wählen. Für TV heißt das: Den roten Power Knopf ganz unten im TV Panel. Für alle anderen (CD, DVD, …) heißt das, den entsprechenden Kanal zu wählen: HDMI1, 2, …, AV1, 2, … usw. Die LED blinkt ein mal.
  3. Den vierstelligen Code des Zielgeräts eingeben (lokale Kopie). Die LED blinkt wieder.

 

[Ubuntu] Dateien ohne Umbenennen ausblenden

Normalerweise würde man einen Datei foobar in .foobar umbenennen, um sie unsichtbar zu machen. Das ist natürlich nicht immer praktikabel.

Als Workaround für Nautilus kann man eine Datei .hidden anlegen, in der man alle zu versteckenden Dateien auflistet (Dateinamen mit Leerzeichen o.ä. kommen in Hochkommata, klar).

Das wird von ls so erst mal nicht berücksichtigt, man kann es ihm aber per

beibringen (Quelle), beispielsweise in der ~/.bashrc. UPDATE: Funktioniert nur mit ls, nicht mit bsplw. ls -al m(