Spaltmaßbeseitigung auf Französisch

7. Juni 2009

Unser MauBus hat zwei Schiebetüren, an denen zur Zierde Innenverkleidungen angebracht sind. An deren Oberseite, bei der Scheibe, war das Wort Spaltmaß für den Abstand „Pappe nach Blech“ nicht ganz zutreffend. Man konnte einen ganzen Schraubendreher mit Griff hineinschieben ohne etwas zu berühren. Einen dünnen Schraubendreher, aber es ging! Mein Sohnemann schaffte das bei kurzem Wegsehen ohne einen Laut.

Also fragte ich beim Freundlichen, ob das serienmäßig so sei. Der konnte sich das auch nicht vorstellen und bat mich, das Auto einen Tag lang dort zu lassen.

Die Lösung, die er fand, war erstaunlich „kreativ“:

DSC_1988sm

Es gab wohl 2007 eine Modellpflege, bei der die Metall-Halteklammern an der Tür wegrationalisiert wurden. Die Werkstatt rief bei Peugeot Deutschland an und von dort wurde vorgeschlagen, die schöne Schraube zu verwenden.

Nun ja, der Spalt ist wenigstens weg.

Tastendrücker

4. Juni 2009

Auf der Suche nach einem MP3-Player für unser neues Gefährt habe ich nichts Gescheites gefunden.

Es gibt Auto-Spezifische Interfaces. Die können nur einen CD-Wechsler simulieren, also max. 9 CDs mit jeweils 99 Liedern.

Es gibt FM-Modulatoren mit ID3-Tag im Radiotext. Die sind nicht viel besser, da Störempfindlich, <2000 MP3s und keine Zufallswiedergabe.

Meine Frau hatte im Schrank noch einen Archos Gmini XS 200. Der hat eine 20GB 1.8″ Platte und kann das alles… aber im Auto ist er nicht zu gebrauchen, weil er nicht mit der Zündung ein- und ausschaltet.

Aber man kann ihn prima fernsteuern. Einschalten lässt er sich, wenn man >3s auf „Play/Pause“ drückt. Dann startet er und nach weiteren 3s steht der Cursor schon auf „Fortsetzen“, kurz „OK“ gedrückt und er spielt dort, wo er das letzte Mal aufhörte, weiter. Abschalten kann man den Player durch >3s drücken auf „Stopp“. Schön! :mrgreen:

Die 3.5″ Klinkenbuchse des Gmini ist 4-polig ausgeführt (wohl zu Debug-Zwecken). Also beschloß ich den vierten Pol als KfZ-Stromanschluss zu benutzen und die Gmini Tasten mit einer kleinen Schaltung im Player fernzudrücken.

Bei ersten Versuchen, eine Logikschaltung zu basteln, die die Tastendrückerei mit der Zündung verknüpft, kam ich rasch an die Platz-Grenzen des Players. Da ich beruflich viel mit Microcontrollern zu tun habe, sah ich mich mal bei Reichelt um, was die denn kosten und siehe da, für 56 Cent gab es einen ATtiny11L. Super Teil das! 6 Ausgänge, interner Oszillator mit 1MHz, <1µA Stromaufnahme im Power down mode, 1k Flash, kein RAM aber 32 Register. Der Chip, eine Diode und zwei Widerstände reichen, um die Schaltung zu basteln:

dsc_3370sm.jpg

Gesagt, getan.

DSC_3363sm

Die Software ist ganze 146 Bytes groß und funktioniert aufs Erste klaglos.

Ein 12V->5V Schaltnetzeil hatte Reichelt für 2 Euro.

Jetzt muss ich nur noch einen Stereo-Vorverstärker basteln, der die 1Vrms des Gmini auf 2Vrms bringt.

Leiterplatten-Lochfraß

19. Mai 2009

Wir haben uns einen gebrauchten 7-Sitzer neu gekauft, der uns vom Namen her immer an den Zeitpunkt unseres Umzugs in die Nordpfalz erinnern wird, das war im August 2007. Ein kurioser Kauf, das war. Im Internet hatten wir ein drejähriges Auto gefunden, das angeblich sehr sauber, Nichtraucher, mit Alu-Felgen plus Winterreifen und Tip Top sein sollte. Die Alu-Felgen waren Radzierblenden, im Aschenbecher noch Asche, der Innenraum an der Verschleißgrenze und total mit Cockpit-Spray verölt, die B-Säulen beide lose, die Winterreifen hin und der erste Vorbesitzer eine Autovermietung… Oh Mann! Ein Tag Urlaub genommen; rote Kennzeichen besorgt; alles nicht Kostenfrei aber Umsonst? Nein! Wir fragten noch, wo man gut Frühstücken konnte: „Neben dem Peugeot Händler“… Das war ein prima Tipp. Denn der hatte noch ein anderthalbjähriges KFZ nach unseren Vorstellungen.

Jetzt haben wir einen „MauBus“ 😀

Die bisherige Fortbewegungshilfe meiner Frau, ein tapferer kleiner neunjähriger Fabia I der immer prima funktioniert hat, soll nun verkauft werden.

Also wurde das Auto gründlichst gereinigt und auf eventuelle Verkaufshindernisse hin untersucht.

Ich stellte unter anderem eine teilweise defekte Beleuchtung des Tacho fest.

Gut, nach neun Jahren und 155.000km kann so ein Lämpchen mal ausfallen. (Von meinem ersten Audi A6 kannte ich das Spiel schon: Alle ~90.000km fallen innerhalb einer Woche alle 12 Lämpchen im Kombi-Instrument aus, von denen jede einzeln stolze 2,5 Europäische Währungseinheiten kostet. 😡 )

Also ab zum Skoda Händler, das Problem geschildert und 😯 : Der Fabia I hat gar keine Lampen im Tacho! Nicht mal eine kleine! Der hat Leuchtdioden. Das ist gut, denn die gehen nie kaputt. 🙂 …ok nach 100.000 Stunden schon, aber das ist bei einem 30er Schnitt bei 3.000.000 Kilometern… also nie!

Oooh-Kay: LEDs haben wir in der Firma von der Rolle. Also „Auf, das Ding“.

Nachdem vom Kombi-Instrument nur noch die Platine übrig war…

Fabia_1

…und zur ich Leitungsverfolgung einen Aufkleber entfernen mußte, sah ich unter dem Aufkleber das:

Fabia_3

…Der Witz: Die schlecht aussehende Leiterbahn ist in Ordnung! Die darunter war durchgegammelt; wahrscheinlich vom Aufkleber-Kleber.

Kabel löt an; alles leuchtet wieder. 😀

LEDs gehen halt nicht so schnell kaputt 🙂

RunAsLoggedOnUser…macht keiner!

19. Mai 2009

Seit SuRun 1.1 entsprechend markierte Programme automagisch administrativ startet und seit SuRun 1.1.0.4 die netten Smileys in der Taskbar hat ist mir eine Sache übel aufgestoßen: Schlecht entworfene Installationsprogramme.

Viele brauchen Administratorrechte und sind für Windows Vista mit einem entsprechenden Manifest markiert. SuRun will diese Installer auch brav mit erhöhten Rechten starten. Verneint man den automagischen Start, melden die Installer, dass man sich als Administrator anmelden soll.

Aber selbst die Installationen häufig attackierter Programme bieten nach erfolgter Installation mit Adminitratorrechten an, das Programm direkt zu starten, per Checkbox die per Voreinstellung aktiviert ist! 👿 Wer da z.B. bei FireFox auf Fertigstellen drückt, fällt dem erstbesten Werbe-Flash-Virus gleich zum Opfer.

Vor über zwei Jahren schrieb ich hier, wie man aus einem Programm, das mit gehobenen Rechten läuft, eins startet, dass die gleichen Rechte wie der angemeldete Benutzer hat.

Wenn man schon administrative Rechte für Installation/Update braucht, sollte man wenigstens dies „nach Drücken auf Fertigstellen das Programm starten“ Checkbox deaktivieren oder das Programm dann mit eingeschränkten Rechten starten. Grrrr!

Benutzer wechsle Dich

19. Mai 2009

Aufgrund eines Feature-Requests (wow wass’n das in deutsch?) im SuRun Forum, entschloss ich mich, herauszufinden, wie man programmatisch die Sitzung eines anderen angemeldeten Benutzers auf den Bildschirm bekommt. Das ist einfacher, als ich erst dachte und funktioniert mit dem undokumentierten Windows API WinStationConnect (und zwar mindestens in Windows XP, Vista und dem RC1 von Windows 7):

BOOL SwitchToSession(DWORD SessionId)
{
  HMODULE hWinSta = LoadLibraryW(L"winsta.dll");
  if (!hWinSta)
    return FALSE;
  typedef BOOL (WINAPI *WSCW)(HANDLE,DWORD,DWORD,PWCHAR,BOOL);
  WSCW WinStationConnectW=(WSCW)GetProcAddress(hWinSta,"WinStationConnectW");
  if (!WinStationConnectW)
    return FALSE;
  return WinStationConnectW(0,SessionId,-1,L"",TRUE);
}

Die Funktion hat vier Parameter:

  • HANDLE hServer
    WTS_CURRENT_SERVER_HANDLE(==0) bezeichnet den lokalen Computer
  • DWORD TargetSessionID
    Das ist die ID der Sitzung, die man auf dem Bildschirm haben will. Die bekommt man mit WTSEnumerateSessions und die entsprechenden Benutzernamen mit WTSQuerySessionInformation.
  • DWORD SessionID
    Das ist die ID der Terminal Server Konsole, die TargetSessionID anzeigen soll. Auf dem lokalen System gibt es nur einen Terminal und damit nur eine SessionID: WTS_CURRENT_SESSION(==-1)
  • LPTSTR Password
    Das Passwort der Sitzung, die angezeigt werden soll. Ist der Aufrufer der Funktion berechtigt, die Sitzung anzuzeigen, kann Password auf einen leeren String zeigen, sonst muss das korrekte Passwort angegeben werden.
  • BOOL bWait
    Legt fest, ob WinStationConnect sofort zum Aufrufer zurückkehrt oder erst, nachdem auf die andere Sitzung umgeschaltet wurde.

SuRun ab 1.2.0.7 Beta 9 benutzt etwa folgende Funktion:

BOOL DoFUS(LPCTSTR ToUser) //Do Fast User Switching
{
  //ToUser can be 'UserName' or 'DomainName\\UserName'
  DWORD SessID=-1;
  DWORD n=0;
  WTS_SESSION_INFO* si=0;
  WTSEnumerateSessions(0,0,1,&si,&n);
  //get Session ID for ToUser
  if (si && n)
  {
    for (DWORD i=0;i<n;i++)
    {
      TCHAR* un=0;
      TCHAR* dn=0;
      DWORD unl=0;
      DWORD dnl=0;
      WTSQuerySessionInformation(0,si[i].SessionId,WTSUserName,&un,&unl);
      WTSQuerySessionInformation(0,si[i].SessionId,WTSDomainName,&dn,&dnl);
      CBigResStr undn(L"%s\\%s",dn,un); //this just combines domain\\user
      WTSFreeMemory(dn);
      dn=0;
      if ((_tcsicmp(un,ToUser)==0)||(_tcsicmp(undn,ToUser)==0))
      {
        WTSFreeMemory(un);
        SessID=si[i].SessionId;
        break;
      }
      WTSFreeMemory(un);
      un=0;
    }
    WTSFreeMemory(si);
  }
  if (SessID==-1)
    return FALSE;
  return SwitchToSession(SessID);
}

So! Das ist einfach… aber auch nicht ganz:

  1. Der Aufrufer braucht administrative Rechte für WTSQuerySessionInformation und für WinStationConnect ohne Passwort.
  2. Der aufrufende Prozess muss in der Logon-Sitzung laufen, die momentan auf dem Bildschirm zu sehen (mit dem Terminal verbunden) ist.

Programmstart-Cursor Blues

10. März 2009

Ein SuRun-Tester hatte bemerkt, dass nach dem Anzeigen der SuRun-Dialoge der „Programmstart-Mauszeiger“ nicht verschwand. Es sah so aus, als wenn im Hintergrund noch etwas startet und zwar für mehr als 5 Sekunden.

Nach etwas Suchen hatte ich die Ursache. Wenn Windows einen GUI-Prozess startet, zeigt es den Programmstart-Zeiger an, bis der Prozess läuft.

Man kann das unterbinden, wenn man bei CreateProcess in dwFlags der STARTUPINFO die Flag STARTF_FORCEOFFFEEDBACK setzt. Tja, und wenn SuRun.exe von Explorer gestartet wurde, der das Flag nicht setzt? Dann pappt die Sanduhr am Pfeil!

Das ein Prozess läuft, erkennt Windows übrigens daran, dass er Nachrichten für ein Fenster abfragt (PeekMessage/GetMessage)[, also daran, dass er gerade nicht läuft…(David Solomon: (in etwa) „When Task Manager says, a Process is running, it is not running“)].

Was aber, wenn der Prozess gar kein Fenster erstellt, weil er das nur macht, wenn er mit dem Benutzer kommunizieren muss, wie SuRun? Einfach den Mauszeiger setzen geht nicht. Windumms setzt ganz auf den Pfeil mit Sanduhr, egal, was man macht.

Ein Fenster erstellen und GetMessage rufen muss man! Also habe ich eine Mini-Routine geschrieben, die ein unsichtbares Fenster erstellt, eine Nachricht dahin schickt, diese Nachricht abholt, verwirft und das Fenster dann freigibt:

static void HideAppStartCursor()
{
  HWND w=CreateWindow(_TEXT("Static"),0,0,0,0,0,0,0,0,0,0);
  PostMessage(w,WM_QUIT,0,0);
  MSG msg;
  GetMessage(&msg,0,0,0);
  DestroyWindow(w);
}

Nun glaubt Windows, SuRun würde laufen und entfernt ganz schnell die Sanduhr vom Pfeil.

Eine schnöde Windumms-Funktion für „Alles ok ich bin am laufen“ hätte es doch auch getan…