Samstag, 2. März 2013

Fix for ssubtmr6.dll (related to VB6 / Win7)

If you still develop or maintain applications written in VB6, you possibly use the component ssubtmr6.dll from Steve McMahon to simplify subclassing in your code. This component is also used by numerous other controls. It turned out that this DLL may cause a runtime error in a Win7 64bit environment that seems hard to track down. I experienced this bug at least with the control vbalsgrid6.ocx, which depends on ssubtmr6.dll. As the source code for both components is available, I could trace it down to a set of Win32 API function used by ssubtmr6.dll: GetProp() and SetProp(), which store a kind of name/value pair inside of a window class. It looks like the GetProp function in Win7 fails for an unknown reason with error 5. This may be related to UIPI (User Interface Privilege Isolation). So it's eventually not ssubtmr6.dll causing the bug, but the API function. I'm really not sure what's going on. Who knows ...

The error messages you will see if your component fails looks like this:

"Run time error 372. Failed to load control vbalgrid from vbalsgrid6.ocx. Your version of vbalsgrid6.ocx may be outdated. Make sure you are using the control provided with the application." - or simply: "Runtime error 0."

What's really annoying about this bug is the fact that the error won't disappear until you relogin to your Windows session. And it is even more annoying if this happens while you are coding!

Ok, enough said about the bug, here is the fix you are waiting for ;-) I simply replaced the API calls in ssubtmr6.dll with a VB dictionary object. I have used this solution in a well spread commercial app for more than a half year now, and it does fine. No more runtime errors.

The fixed version of ssubtmr6.dll is binary compatible with the original version. That means you don't have to recompile your apps, just replace the DLL file and you are done (and no need to do regsvr32, too). The class module CPropList.cls contains my replacement functions for the Get/SetProp APIs.

The original DLL and source code from the VBAccelerator web page can be found here:

http://www.vbaccelerator.com/home/VB/Code/Libraries/Subclassing/SSubTimer/article.asp

Download the fixed DLL (source and binary):

ssubtmr6_fixed.zip

Update 2013-16-03

Looks like there is a another fix out there, including an explanation what causes the problem (even if there remains the question why it happens only on Win7/64, not on XP). I have not tested this solution, but I think it's plausible. The article contains an excerpt of the ssubtmr6 source (msubclass.bas) that has to be fixed.

Link: Solution found in vbforums.com

Donnerstag, 21. Februar 2013

Scripts unter Win64 im 32-Bit-Subsystem ausführen

Eine VBS-Datei startet unter Win64 mit der 64-Bit-Version des Scripting Hosts. Meistens fällt dies nicht weiter auf. Scripte, in denen 32-Bit-Datenbanktreiber verwendet werden, funktionieren aber nicht mehr. Mit folgendem Scriptcode kann man dynamisch eine Ausführung im 32-Bit-Subsystem erzwingen:

'ensure script execution in Win32 subsystem on Win64 OS
f1 = (InStr(1, WScript.FullName, "system32", 1) > 0)
f2 = CreateObject("Scripting.FileSystemObject").FolderExists("C:\Windows\SysWOW64")
If f1 And f2 Then
   Dim wsh
   Set wsh = CreateObject("WScript.Shell")
   wsh.CurrentDirectory = "C:\Windows\SysWOW64"
   'keep possible command line arguments
   For Each arg In WScript.Arguments
      If InStr( arg, " " ) Then arg = """" & arg & """"
      s = s & " " & arg
   Next
   wsh.Run "wscript.exe """ & WScript.ScriptFullName & """" & s, 1, False
   WScript.Quit
End If
'test: show that actually the 32 bit version of wscript is now running
MsgBox WScript.FullName
'script code referencing 32 bit DLLs goes here
'(...)

Mittwoch, 20. Februar 2013

UDL-Dateien mit Zugriff auf 32-Bit-Datenbanktreiber öffnen

Wenn man auf einem 64-Bit Windows-OS eine UDL-Datei öffnet, werden nur die installierten 64-Bit-Treiber angezeigt. Per Registry kann man einen Kontextmenü-Eintrag erzeugen, der Zugriff auf die 32-bit Treiberliste ermöglicht. Dazu importieren Sie einfach die verlinkte Registry-Datei. Danach sehen Sie bei Rechtsklick auf eine UDL-Datei einen neuen Menüeintrag Open32. Bitteschön!

Download udlfile_open32_reg.zip

Windows-Sicherheit: 10-Punkte-Liste

Dies ist eine kurze Zusammenstellung von sicherheitsrelevanten Punkten, die ich berücksichtige, wenn ich für andere Leute einen Windows-PC herrichte. Es handelt sich mitnichten um eine vollständige Liste, aber sie ist ausreichend, um aus dem sprichwörtlichen Scheunentor ein Mauseloch zu machen ;-)
In eigener Sache: Ja, ich empfehle hier diverse Produkte/Anbieter. Nein, es handelt sich nicht um bezahlte Werbung. Mein Blog ist in dieser Hinsicht vollkommen unabhängig, und darauf lege ich großen Wert.

  1. MSE installieren
  2. Windows-Firewall aktivieren
  3. Automatische Updates aktivieren
  4. Java, Adobe Reader und Flashplayer deinstallieren 
  5. Chrome installieren und zum Defaultbrowser befördern
  6. Chrome zum Default-PDF-Viewer machen
  7. In Chrome "Click-To-Play" aktivieren
  8. GMail als Sammelpostfach verwenden
  9. Passwort-Manager verwenden
  10. Desktop-Banking-Software verwenden

1. MSE installieren

Ein kostenloser Virenscanner hat einfach den Vorteil, dass das Abo nicht abläuft. Ich habe schon öfters an Rechnern gesessen, auf denen schlichtweg kein Schutz mehr vorhanden war, weil der Besitzer es versäumt hatte, das Abo zu verlängern (oder das einfach nicht wollte). MSE (Microsoft Security Essentials) bietet einen Grundschutz und hält sich dezent zurück, was die alltägliche Arbeit am Rechner betrifft.

2. Windows-Firewall aktivieren

Dazu muss man wohl nichts weiter sagen ... außer, dass ich immer wieder an Rechnern sitze, bei denen die Firewall ausgeschaltet ist, warum auch immer.

3. Automatische Updates aktivieren

Sollte ebenfalls selbstverständlich sein. Wenn sie es mit einem Paranoiker zu tun haben, der Angst hat, Microsoft könnte seinen Rechner ausspionieren (und deshalb vorsorglich das Auto-Update deaktiviert hat), weigern sie sich, an dem Rechner auch nur einen weiteren Handgriff zu machen.

4. Java, Adobe Reader, Flashplayer deinstallieren

Diese Softwareprodukte sind dermaßen stark in der Windows-Welt verbreitet, dass sie ein lohnendes Ziel für Exploits darstellen. Damit sind sie für einen großen Teil der Sicherheitsprobleme verantwortlich, die viele Rechner gleichermaßen betreffen. Die Funktionalität von Acrobat Reader und Flash wird bei meiner Lösung ausreichend durch Google Chrome abgedeckt (siehe Punkt 5); Java ist im Privatbereich normalerweise verzichtbar.

5. Chrome installieren und zum Defaultbrowser befördern

Chrome gilt derzeit als sicherster Browser. Außerdem verfügt Chrome über eigene Plugins für die Wiedergabe von Flash-Inhalten und für die Anzeige von PDF-Dateien, die sich bislang als weniger anfällig für Sicherheitsprobleme gezeigt haben. Durch das automatische Software-Update von Chrome werden natürlich auch diese Plugins aktualisiert, auf das nervige Update-Prozedere der Adobe-Produkte können sie also verzichten.

6. Chrome zum Default-PDF-Viewer machen

Das geht ganz einfach: Rechtsklick auf eine PDF-Datei, "Öffnen mit ..." auswählen, dort dann auf "Durchsuchen ...". Unter  C:\Users\<Benutzername>\AppData\Local\Google\Chrome\Application\ wählen sie dann chrome.exe aus, fertig.

7. In Chrome "Click-To-Play" aktivieren

Diese Einstellung verhindert, dass Plugins auf Webseiten automatisch ausgeführt werden. Damit haben sie erstens einen Flashblocker (und allein das ist es schon wert, diese Funktion zu aktivieren), zweitens gewinnen sie etwas Sicherheit. Für diverse Seiten kann man einzelne Plugins auch standardmäßig zulassen (z.B. Flash für für Youtube).

8. GMail als Sammelpostfach verwenden

Schon wieder Google? Ja. ich schere mich bei meinen Empfehlungen ausdrücklich nicht um die politischen Probleme in der IT-Welt. Es mag gute Gründe geben, seine Mails nicht bei Google zu verwalten, aber der Spam- und Virenschutz ist sehr leistungsfähig. Wenn ihnen die politische Seite am Herzen liegt, kaufen sie sich einen Mail-Account bei einem Web-Hoster, z.B. bei Strato für 99 Cent/Monat. Das ist dann die sauberste Lösung (statt einem Account bei einem anderen kostenlosen Anbieter).

9. Passwort-Manager verwenden

Die Verwendung eines Passwort-Managers wie z.B. KeePass ist nicht nur im Hinblick auf Sicherheit empfehlenswert. Es ist auch für unbedarfte Nutzer eine große Hilfe, ihnen einen Ort in die Hand zu geben, wo der ganze Pin/Login- und sonstige Kram hin soll, den man sonst nie findet, wenn man ihn braucht. Ich speichere dort auch Dinge wie Software-Registrierungsschlüssel, Bankkonto-Daten, PINs und PUKs von Telefonen, Hotline-Nummern für das Sperren von Kreditkarten usw.

10. Desktop-Banking-Software verwenden

Das ist ein Thema, das mir am Herzen liegt: Die Verwendung einer Offline-Banking-Software eliminiert etliche Sicherheitsprobleme, die beim Web-Banking systembedingt unvermeidbar sind. Außerdem ist es komfortabler. Da es keine wirklich gute kostenlose Offline-Banking-Software gibt, müssen sie hier Geld in die Hand nehmen. Aber nicht viel: 20 Euro reichen für meinen Favoriten Subsembly (im Vergleich zu Starmoney keine nervige und teure "Abo-Versionsabzocke").