Startseite
Impressum
Skills
Referenzen
pfeil Produkte
Links
pfeil Tips
Benutzerverwaltung 1
Benutzerverwaltung 2
Das ideale Paßwort
Datum und SQL-DB
DSL-Probleme
Dr. Watson Teil 1
Dr. Watson Teil 2
DTS Automatisierung
Installation autom.
Kalender und Zeit
Mail Automatisierung
Office Automation
Stack Frame
SQL Server
Strings + Unicode
VB 6 Tips & Tricks
Windows-Uhrzeit

 

Drucker - freundliche Darstellung


  zalando.de - Schuhe und Fashion online

 

Letzte Aktualisierung: 14.11.2015



Tips zu Visual Basic 6

Einige Tips und Links zu Visual Basic 6.0

Eine Combobox programmgesteuert aufklappen

Der VB - Editor und das Mausrädchen

Die "war story": runtime error 50003

Noch mehr runtime errors

Buchtips

Links (meine VB6 - Favoriten)

Eine Combobox programmgesteuert aufklappen

Das Aufklappen einer Combobox durch Programmcode ist im Grunde sehr einfach, aber undokumentiert. Man muß der ComboBox einfach eine Message mit einer bestimmten Nummer schicken, und dann klappts:

SendMessage cboComboBox.hWnd, &H14F, True, 0

Dazu muß natürlich irgendwo im Programm die benutzte API-Funktion "SendMessage" deklariert werden:

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _ lParam As Any) As Long

Der VB - Editor und das Mausrädchen

Ein ständiges Ärgernis in VB 6 ist die fehlende Unterstützung des Mausrädchens im Code-Editor, nachdem man einen Rechner neu aufgesetzt hat. Das Problem resultiert aus der Tatsache, daß die Microsoft - WheelMouse - Produkte mit VB 6 Schwierigkeiten haben, wenn man den aktuellsten Treiber installiert. Es hat offensichtlich nichts mit VB6 selbst zu tun, denn das Problem ist uralt, und auch das aktuelle ServicePack 6 behebt es nicht.

Bei Microsoft bekommt man für die IntelliMäuse als Treiber die Software "IntelliPoint 5.0" angeboten, welche die Probleme im VB6 - Editor macht. In diversen Internet-Foren kann man nachlesen, daß die 4er Version des Treibers das Problem nicht habe. Auf meinem Windows Server 2003 läßt sich die 4.12 aber partout nicht installieren; die Installationsroutine bricht stets ab mit der Meldung, der Treiber sei für mein Betriebssystem nicht geeignet. Dies passiert auch dann, wenn man den Treiber im Kompatibilitätsmodus für WinXP oder Win2000 startet (für Windows 2000 ist der Treiber explizit ausgelegt laut Doku). Glücklicherweise fand ich noch die uralte Original - CD der Maus, auf der "IntelliPoint 3.2" drauf ist. Der alte Treiber beschwert sich zwar auch, er sei für mein System nicht geeignet, installiert sich am Ende aber trotzdem tadellos und läuft einwandfrei.

In VB6 funktioniert jetzt also das Scrollrädchen; ich habe aber noch nirgendwo im Web eine Möglichkeit gefunden, die 3.x - Version für Windows als Download angeboten zu bekommen.

Aber Microsoft ist sich des Problems ebenfalls bewußt: Microsoft - Artikel zum Thema

*UPDATE 1* Microsoft bietet mittlerweile sogar eine Umgehungslösung für das Problem, und sie funktioniert :-)

*UPDATE 2* Es gibt ein Tool, welches systemweit das Mausrädchen steuern kann, und das ebenfalls für Programme wie VB6 die fehlende Unterstützung schafft:

Die "war story": runtime error 50003

Im August 2004 erlebte ich eines meiner unvergeßlichen Erlebnisse mit VB6.

Ich hatte gerade eine Applikation entwickelt, so wie schon hunderte vorher, es war überhaupt nichts besonderes neues dabei. Visual Basic 6.0, einige SQL Server 2000 - Zugriffe drin, kleine Suchmaske, Datenanzeigemaske, das war alles. Es funktionierte alles gut, und so sollten die ersten Pilotanwender damit beglückt werden. Auf einem PC funktionierte es sofort, auf zwei weiteren kam während der Laufzeit plötzlich ein runtime error 50003, jederzeit reproduzierbar. Ich kannte bis dahin viele runtime errors, die üblichen Bekannten eben, aber 50003 ? Der war mir neu.

Also wurde fleißig im Web recherchiert, aber es gibt einen einzigen Artikel in der Microsoft Knowledge Base dazu, und der besagt, daß dieser runtime error ein sehr allgemeiner sei, da könne man nichts genaues zu sagen. Ein Tip ist, daß gewisse GIF - Dateien nicht geladen werden können. Die Form, in der es bei mir knallte, hatte aber weder ein GIF, noch sonst irgendein Image- oder Picture - Control. Weitere Web - Recherchen ergaben immer wieder den Hinweis, daß es an DLL - Konflikten liegen könnte, nichts konkretes.

Die ersten Maßnahmen waren also, die VB6 Service - Pack - 6 - DLLs alle einzeln zu identifizieren, und auf den PCs aufzuspielen. Keine Änderung. Alle DLLs, die mein Programm so benötigt (zum Glück gibts den Package- und Deployment-Wizard) würden einzeln abgeklappert und überprüft, keine Behebung der Ursache möglich.

Dann habe ich Message-Boxen eingebaut, um die Zeile zu identifizieren, in der es knallt; ich habe eine Suchmaske, und die öffnet ein Form mit einer Detailanzeige. Im aufgehenden Form knallt es an zwei Stellen, sobald der MousePointer verändert wird ("Me.MousePointer = vbHourGlass"), und sobald eine Textbox gefüllt wird (txtDateninhalt.Text = "..."). Seltsam ! Wenn DLL- Konflikt, kann es doch nur die VB runtime sein ?

Jetzt war ein Tag Analyse draufgegangen, und ich habe schweren Herzens das Geld für einen Microsoft Support Call investiert. Ein netter schwedischer Microsoftie nahm sich des Falles an. Ich habe es übrigens nicht bereut, denn wenn ich es mal umrechne, hatte Microsoft unterm Strich nur einen einstelligen Euro - Stundensatz für den Mitarbeiter eingenommen.

Nun gut, wir hatten in der Folge einige Dinge geprüft und ausprobiert, unter anderem jede, wirklich jede einzelne DLL des gesamten Prozesses untersucht und verglichen, wir haben die regionalen Einstellungen der PCs untersucht, mit REGMON und FILEMON die üblichen Analysen gemacht, welche Dateien und welche Registry-Keys benutzt werden, und wo der Unterschied liegen könnte. Parallel dazu haben wir noch beim Kunden etliche Rechner getestet, um eventuelle Systematiken herauszufinden, also etwa Betriebssystem, ServicePack, was auch immer. Doch es gab keine, völlig durcheinander hat es auf dem einen funktioniert, auf dem anderen nicht. Ich habe einen jungfräulichen Rechner aufgesetzt, von Grund auf, nach Arbeitsanweisung der Admins beim Kunden, und nach jedem Schritt geprüft, ob es geht oder nicht. Es klappte leider bis zum Schluß.

Es ging also etwa eine Woche ins Land, und wir hatten schon befürchtet, daß wir viele Rechner komplett neu aufsetzen müßten. Bis plötzlich von Microsoft aus Schweden der Hinweis kam: Ich habe eine Maschine gefunden, auf der es nicht geht. Ein Entwicklungsrechner. Im Visual Studio wird angemeckert, das Icon sei ungültig.

Und das war es tatsächlich: Ich hatte mir selbst ein ICON - Resourcefile entwickelt, in das ich eine Menge unterschiedlicher Images eingefügt hatte, also unterschiedliche Auflösungen und unterschiedliche Formate, um dem Betriebssystem ein breites Spektrum an Auswahlmöglichkeiten zu bieten, jeweils ein gut passendes Image zu finden. Ich war in dem irrigen Glauben, das Betriebssystem ermittle je nach Anforderung (also der Symbol-Einstellung im Windows - Explorer, der Desktop-Einstellung, etc) stets das beste passende Image aus dem Icon - File. Ich mußte nun mit ansehen, daß mein Programm überall dort lief, wo die Farbtiefe auf True Colour (32 Bit) eingestellt ist, und auf anderen Rechnern nicht. Und das, obwohl bei allen Images, die mehr als 256 Farben anbieten, immer auch eines mit 256 Farben oder 16 Farben in der identischen Pixelabmessung verfügbar war. Ich verstehe es also bis heute nicht, und wer Lust hat, es zu analysieren, kann das "böse" Icon hier herunterladen.

Nachdem ich das eine oder andere hochauflösende Image entfernt hatte, funktionierte es wieder. Ich habe es ganz bewußt an dieser Stelle veröffentlicht, weil im Web über diesen Fehler praktisch nichts zu finden ist, und vielleicht kann ich dazu beitragen, daß jemand anderes nicht ganz eine Woche Suchen muß. Hier noch der Link zur offiziellen Microsoft - Doku zu Icons und dem Umgang des Betriebssystems mit ihnen. Ach ja, und ich möchte noch IconCool empfehlen, ein guter Icon - Editor, den man 30 Tage testen kann, und der danach für wenig Geld zu haben ist.

Noch mehr runtime errors

Wenn der runtime error 3704 auftritt, dann ist die zugehörige Fehlermeldung nicht immer passend zur Ursache. Meist ist der Fall einfach; man hat einen Recordset, und greift darauf zu (zum Beispiel mit .MoveNext() oder mit .EOF), obwohl noch kein Open auf dem Recordset aufgerufen worden ist. In diesem Fall paßt die Fehlermeldung, die zusammen mit der Nummer 3704 angezeigt wird.

Bisweilen kommt dieser runtime-error aber in einem anderen Zusammenhang: Wenn man eine stored procedure aufruft, von der man ein "SELECT" erwartet, und unmittelbar nach dem Recordset.Open() auf den Recordset zugreift (z.B. mit .EOF oder .MoveFirst), dann kommt dieser Fehler genau dann, wenn die stored procedure keine Daten selektiert hat. Der Meldungstext paßt zu dieser Problematik allerdings überhaupt nicht.

Weiterer Fall für den 3704: Man ruft eine stored procedure oder einen Select-Befehl auf, in der Hoffnung auf zurückzuliefernde Daten. Dabei treten datenbankinterne Warnungen auf, wie z.B. "Warnung: NULL-Wert wurde durch eine Aggregat- oder eine andere SET-Operation gelöscht." oder etwas ähnliches. Auch dann kommt dieser Laufzeitfehler; diese Warnung kann man visualisieren mit der Registerkarte "Meldungen" im Query Analyzer.

Vertrackt ist auch der "Laufzeitfehler 1004: Die XXXX-Eigenschaft des PageSetup-Objekts kann nicht zugeordnet werden". Das XXXX kann dabei z.B. LeftMargin, RightMargin, TopMargin, BottomMargin oder Orientation sein, Eigenschaften, mit denen man bei der Fernsteuerung von Word oder Excel die Druck-Eigenschaften der Seite festlegen kann. Wenn dieser Laufzeitfehler kommt, dann ist entweder kein Drucker eingerichtet, oder es können keine Eigenschaften des Standard-Druckers erfragt werden. Dies ist dummerweise nötig, um die genannten Einstellungen festzulegen.

Bisweilen bekommt man den Fehler "Da der manuelle oder verteilte Transaktionsmodus aktiviert ist, kann keine neue Verbindung erstellt werden.". Dieser Fehler trat bei mir bisweilen in folgender Situation auf: Man hat eine Datenbankverbindung, auf der man z.B. eine Abfrage laufen hat, völlig ohne Locking (also sogar explizit mit NOLOCK-Option in der Query). Gleichzeitig macht man in einer Schleife, in der man die Abfrage abarbeitet, UPDATES oder INSERTS in die Datenbank, innerhalb einer Transaktion. Dann kommt dieser Fehler. Abhilfe: Für die transaktionellen Befehle öffnet man kurzfristig eine weitere, zusätzliche Datenbankverbindung, dann klappts. Verstanden habe ich es nie (weil die Abfrage rein lesend ist, wie gesagt ohne jegliches Locking), aber manche Wege müssen eben etwas anders beschritten werden.

Nach einem Wechsel der SQL-Server Datenbank von SQL2000 auf SQL2005, dabei auch gleich auf 64 Bit und Windows Server 2008, bekam ein Kunde plötzlich den Fehler "-2147467259 [DBNMPNTW] Zugriff verweigert". Ursache war offenbar, daß das Netzwerkprotokoll nun anders eingestellt werden muß. Abhilfe schafft folgender Zusatz im Connection-String zur Datenbank: "Network=DBMSSOCN" Eigentliche Ursache könnte eventuell auch sein, daß der neue Server in einer anderen Domäne als der Anmeldedomäne steht, und die Named Pipes trotz Vertrauensstellung nicht funktionieren.

Buchtips

cover

"Visual Basic 6" von Michael Kofler ist der Klassiker unter den Lehrbüchern für Visual Basic. Das Buch ist sowohl für den Einsteiger interessant, als auch als Referenzwerk für den Profi. Es deckt im Grunde alles ab, was man über Visual Basic 6 wissen muß.

Informationen zum Buch


cover




"Essential COM" von DonBox ist der Klassiker, um den Einstieg in das COM - Komponentenmodell zu bekommen. Für jemanden, der C (oder C++) kann, ist der Einstieg sogar noch etwas leichter. Für den Visual Basic - Entwickler lohnt es sich auf jeden Fall, zu Wissen, was "unter der Haube" passiert, wenn New oder CreateObject aufgerufen wird, und wie Events gefeuert werden.

Auch in .NET wird in Bezug auf die Komponentenarchitektur auf COM zurückgegriffen, so daß es keine vergeudete Investition ist.

Informationen zum Buch



Links (meine VB6 - Favoriten)

Service Pack 6 für Visual Basic 6.0 (englisch)

Merge - Module für Installationen / Visual Studio 6.0 SP6 (englisch)

VB-@rchiv, eine sehr umfangreiche Site mit vielen Tips und Know-How-Artikeln (deutsch). Hat außerdem eine sehr schöne Icon-Galerie zum kostenlosen Download.

Microsoft IntelliPoint 4.12 Maustreiber (deutsch)

Microsoft Knowledge-Base Atrikel KB 321368 zu IntelliPoint-Installationsproblemen (deutsch)

Code Advisor, das offizielle Tool von Microsoft, um VB6 - Programme zu Untersuchen in Bezug auf Migrationsfähigkeit nach .NET. Hinweise werden als Kommentare in den Sourcecode geschrieben.

Ein interessanter Artikel über function pointers in Visual Basic, nichts für Anfänger, aber hochinteressant mit einem tiefen Blick ins innere von VB6.


Support, Feedback, Anregungen

Alles verstanden ? Oder noch Fragen ? Wir freuen uns über Feedback zu den Tips, auch über Verbesserungsvorschläge. Schreiben Sie an support@a-m-i.de.