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

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

Windows: Welcher Prozess blockiert eine Datei?

Wer mit Bordmitteln herausfinden will, welcher der bsplw. drölf “java.exe”-Prozesse auf eine Datei zugreift, der kann den “Resource Monitor” verwenden – “resmon.exe” im Startmenü:

  • Tab “CPU”
  • Reiter “Processes”: Alle zu untersuchenden Prozesse anwählen
  • Reiter “Associated Handles”: In das Suchfeld den Dateinamen eingeben
  • Prozess finden und direkt von hier aus beenden

via

Internet Explorer: “Protected Mode” Registry Key

Wer bsplw. Selenium gegen den IE fährt, der wird auf den “Protected Mode” stoßen, doch wer den per Skript setzen will, der muss schon etwas länger suchen: In der Registry gibt es einen entsprechenden Schlüssel “2500” (“Turn on Protected Mode”).

Dazu:

Unless stated otherwise, each DWORD value is equal to zero, one, or three. Typically, a setting of zero sets a specific action as permitted, a setting of one causes a prompt to appear, and a setting of three prohibits the specific action.

In Code sieht das dann so aus:

Danke, Johann!

EDIT: Scheint nicht (persistent) zu funktionieren. Ein Workaround scheint

zu sein, und dies könnte man auch probieren:

For IE 11 only, you will need to set a registry entry on the target computer so that the driver can maintain a connection to the instance of Internet Explorer it creates.

For 32-bit Windows installations, the key you must examine in the registry editor is HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE.

For 64-bit Windows installations, the key is HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE.

Please note that the FEATURE_BFCACHE subkey may or may not be present, and should be created if it is not present.

Important: Inside this key, create a DWORD value named iexplore.exe with the value of 0.

Windows 8 Update als Clean Install in Parallels 6 [UPDATE]

Ausgangssituation: Ein Parallels 6 mit Windows XP. Wunsch: Ein möglichst günstiges Windows 8 Pro 🙂 PS: Bootcamp kann offiziell noch nicht mit Windows 8 umgehen.

Ab inklusive XP bietet Microsoft noch bis Ende des Monats ein Upgrade für 29,99 € an – allerdings unterliegt das einigen Einschränkungen, und es stellen sich die folgenden Fragen:

  1. Es handelt sich um eine reine Download-Version (die DVD kostet 10 Euro plus Versand extra), die als Dateiordner abgelegt wird – man benötigt zum Download also ein Windows. Schöner wäre ein bootfähiges ISO.
  2. Parallels 6 ist alt (aktuell ist Version 8), und nirgendwo ist offiziell dokumentiert, ob Win 8 unterstützt wird… aber ein neues Parallels wäre teurer als Windows 8 selbst 🙂
  3. Es muss ein aktiviertes Windows XP (oder höher) installiert sein, nicht nur zum Download, sondern vor allem auch zum Ausführen des Upgrades – schöner wäre eine “cleane” Installation auf ein frisches System

Die Lösung für Punkt 1 findet sich auf heise.de (ein erfolgter Download des Upgrades vorausgesetzt)

  • imgburn runterladen
  • C:ESDWindows als Quelle auswählen (Achtung, der Ordner ist versteckt)
  • Unter Advanced/Bootable Disc/”Boot Image” die Datei C:ESDWindowsbootetfsboot.com auswählen
  • “Sectors To Load” von 4 auf 8 ändern
  • Brennvorgang starten; im Dialog mit “Ja” antworten, um statt des Ordners seinen Inhalt zu brennen

Zu Punkt 2: Die gebrannte Disc/das erstellte Image funktioniert in Parallels 6. Das erkennt das zu installierende System zwar nicht automatisch, aber die manuelle Wahl von “Windows 7” funktioniert völlig. Win 8 wird installiert, auch ohne, dass eine Windows-Installation vorhanden ist. Es gibt eine Anleitung dazu, aber alles ist ziemlich straight forward. UPDATE: Wichtig ist der Hinweis (der in der Parallels-Hilfe unfairerweise entfernt wurde), dass man im Menü unter Virtual Machine/Configure/Hardware/Boot flags das Folgende einträgt:

devices.video.pci_device_id=0×5005

Andernfalls bekommt man nach Installation der Parallels Tools einen schwarzen Bildschirm. Ich konnte das auch nachträglich noch eingeben.

Aber, und das ist quasi auch Punkt 3: Man muss ein wenig Hand anlegen, um das auf diese Art installierte Win 8 auch aktivieren zu können (auf heise gibt’s eine Kurzanleitung, die längere ist hier):

  • Metro-Ansicht öffnen (dazu auf dem Desktop nach unten rechts fahren, “Start” wählen)
  • regedit suchen (einfach lostippen, das öffnet automatisch die Suche)
  • Folgenden Schlüssel ändern: HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionSetupOOBEMediaBootInstall auf 0
  • Eingabeaufforderung suchen
  • Rechtsklick, als Admin ausführen
  • “slmgr /rearm” eingeben
  • neu starten

Den Aktivierungsstatus kann man dann in der Systemsteuerung einsehen: Metro-Ansicht, “Systemsteuerung” eingeben, Punkt “System” öffnen, unten unter “Windows-Aktivierung”

Next step: Windows Apps UPDATE: Leider läuft der Windows Phone Emulator nicht in Parallels 6

Windows (Phone) 8 [Update]

Video via Malte.

Die Geräte sind zu groß. (Eine Abart von) Office ist vorinstalliert – hoffentlich gibt das keine Kartellklagen 😉 Die “Rooms” sind cool: Win Phones haben Facebook und Twitter tief verankert, aber das emanzipiert sie davon. Coole Idee. Die Cloudfunktionen sind standard, aber die Integration von iPhone und OS X machen Sinn – und sind nochmal deutlich weniger restriktiv und kontraproduktiv als Apple. “Kids Corner” ist Quatsch, glaube ich 🙂

Übrigens: Es mehren sich positive Stimmen zu Windows (Phone 8) auf Spon (Link1, Link2), aber auch auf apfeltalk (Link1, Link2) und im Facebook-Freundeskreis. Da geht was!

Spon meldet eine Art Tablet/Notebook-Hybrid, mit zugegebenermaßen “nur” Win RT, aber 8-16 Stunden Akkulaufzeit!

[Windows:] Statische Firefox-Verknüpfung

firefox

Es gibt diese “fixen” Icons auf dem Desktop – “Arbeitsplatz”, “Netzwerkumgebung”, “Eigene Dateien” und den allseits beliebten “Internet Explorer”… alle mit ihrem eigenen Kontextmenü. Wer sowas für den Firefox haben will, möge folgendes in die Registry schreiben:

Die Pfade (“D:\Programme\…”) sind natürlich entsprechend anzupassen. Löschen kann man das Ganze wieder mit

Download:

Mausgeschwindigkeit

mouse

Wer ein Notebook mal mittels Maus, mal mittels Touchpad bedient, wird das kennen: Der Mauszeiger ist entweder zu schnell oder zu langsam, je nachdem, was man benutzt. Unter Windows kann man das über die Systemsteuerung -> Maus -> Zeigeroptionen ändern, aber wer will das schon jedes mal. Leichter geht es, wenn man sich zum Beispiel mit dem kostenlosen (und “Runtime”-freien!) Tool AutoIt ein Skript schreibt. Das sieht dann ungefähr so aus (gefunden hier):

Const $SPI_SETMOUSESPEED = 0x0071
$MySpeed = 11; A number between 1-20.
DllCall(“user32.dll”, “int”, “SystemParametersInfo”, “int”, $SPI_SETMOUSESPEED, “int”, 0, “int”, $MySpeed, “int”, 0)

Ich habe da schon mal was vorbereitet…: www.crusy.net/files/mousespeed.zip 🙂 in dem ZIP findet ihr drei EXE-Dateien inklusive der zugehörigen Skripte. Eines setzt die Geschwindigkeit auf 8 (meine Einstellung für die Maus), eines auf 17 (Touchpad), eines setzt die Usereingabe (eine Zahl zwischen 1 und 20) als Mausgeschwindigkeit. Hf

Caps Lock

caps_lock

Wer die Caps Lock Taste nicht leiden kann (und wer kann das?) und einen Windows PC sein Eigen nennt (OK…), der möge folgenden Schlüssel in die Registry einfügen:

oder hier herunterladen. Caps Lock verhält sich nun (=nach einem Neustart) wie die Shift Taste. HTH

PS: Das Ganze unter OS X