Re: Verweise, Fehlersuche mit LateBinding

Tech-Archive recommends: Speed Up your PC by fixing your registry



Hallo Thomas,

"Thomas Raasch" <nospam@xxxxxxxxxx> schrieb im Newsbeitrag
news:uMk1lcMGJHA.3664@xxxxxxxxxxxxxxxxxxxxxxx
Hallo NG,

ich baue kleine Anwendungen in AccessXP. Diese gehen als MDE raus an die
Kunden... manchmal gibts auch ne RT dazu :)


ich habe nun das (wohlbekannte) Problem, dass an manchen Kunden-PCs komische
Sachen passieren (Felder mit "#Name", Fehlermeldungen, ...).
Es stellt sich idR. heraus, dass fehlerhafte Verweise schuld sind.

Da sich diese Probleme nun häufen bin ich derzeit am Erstellen eines
ordentlichen Setups mit InnoSetup. Weiterhin wollte ich meinen Anwendungen
aber einen Start-Test vorschalten, der auf defekte Verweise prüft UND auch
ausgibt welcher Verweis defekt ist.
Entsprechend habe ich (wie von google empfohlen) ein AutoExec-Makro erstellt,
dass als erstes mal die Verweise per Code durchgehen soll.

erstes Problem:
Im Code eine Schleife über die Verweise zu durchlaufen und dann
"References(i).IsBroken" abtesten geht nicht. Dabei kommt es beim Kunden nur
zu einem Laufzeitfehler ohne zu sehen welcher Verweis schuld ist.
...Gelesen und Gesucht...
und die Lösung dessen heißt LateBinding! Habe also meine Funktion umgebaut von
"References(i).IsBroken" auf "CreateObject "Excel.Application"'. Durch diesen
indirekten Aufruf kann ich mit "On Error" die ganze Sache abfangen und gut.

neues Problem:
Nun ist mein Problem, dass ich nicht weiß wie ich die ganzen Objekte
erstellen/benennen soll! Also welcher String (welcher Name) beschreibt mein zu
testenden Verweis?

bei Excel mache ich
CreateObject "Excel.Application"
klaro, kann man überall finden
bei Word
CreateObject "Word.Application"
ebenso einfach
bei Access
CreateObject "Access.Application"
ebenso einfach
bei DAO
CreateObject "DAO.DBEngine.36"
hab ich durch Zufall gefunden
bei ADO
CreateObject "ADODB.Connection"
durch raten und ausprobieren gefunden

soweit OK...
fehlen tun mir

CreateObject "VBA.___"
Verweis: Visual Basic for Applications (VBA6)
evtl. nicht nötig weil wenn das nicht geht, geht sowieso gar nix!?
CreateObject "MSComctlLib.___"
Verweis: MS Windows Common Controls 6.0
CreateObject "Office.___"
Verweis: MS Office 10.0 Object Library

und wenn dann mal irgendwann ein neuer Verweis dazu kommt stehe ich wieder da
und hab keine Ahnung welches "Object" ich "Createn" muss. Ich weiß auch nicht
genau wo ich suchen soll/kann.

Das ist keine so gute Idee, zum Verweise-Check allenthalben entsprechende
Objekte zu erzeugen.
Nicht nur, dass man sich aus jeder Bibliothek erst eine zu erzeugende Klasse
aussuchen und deren ProgID ermitteln muss - das ist z.B. dieses
"DAO.DbEngine36" -, die ganze Sache ist auch noch schwer resourcenraubend, wenn
etwa gleich Word, Excel etc. nacheinander im Hintergrund gestartet werden
müssen.

Vorschlag für ein Modul, das du z.B. in eine Start-Datenbank (> eine andere als
die zu startende!) einbauen könntest, ist angehängt.
- Du setzt zuerst die Prozedur ListReferences in deine zu startende DB ein
(irgendein Modul) und führst sie aus dem VBA-Direktfenster heraus aus.
- Du kopierst das Ergebnis aus dem Direktfenster - es ist eine vollständige
Funktion - zusätzlich zum gesamten Modul unten in die StartDB hinein.
- VerweiseOK) liefert dir dann zurück, ob alle in der zu startenden DB
verwiesenen Dateien vorhanden sind.

Ciao, Sascha

--------------------------------------
Option Compare Database
Option Explicit

Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type

Private Declare Function QueryPathOfRegTypeLib Lib "oleaut32.dll" ( _
UUID As GUID, _
ByVal wMaj As Integer, _
ByVal wMin As Integer, _
ByVal lcid As Long, _
LibName As String) As Long

Private Declare Function CLSIDFromString Lib "ole32.dll" ( _
ByVal lpsz As Long, _
pclsid As GUID) As Long

Sub ListReferences()
Dim oRef As Reference

Debug.Print "Function VerweiseOK() As Boolean"
Debug.Print vbTab & "Dim flag As Boolean"

For Each oRef In Application.References
Debug.Print vbTab & "If Not IsLibraryOK(" & _
oRef.GUID & "," & oRef.Major & "," & _
oRef.Minor & ") Then flag = True"
Next oRef
Debug.Print vbTab & "VerweiseOK = Not flag"
Debug.Print "End Function"

Set oRef = Nothing
End Sub

Function IsLibraryOK(ByVal strGUID As String, _
ByVal VersionMajor As Integer, _
ByVal VersionMinor As Integer) As Boolean
Dim strFile As String

strFile = GetLibraryPath(strGUID, VersionMajor, VersionMinor)
IsLibraryOK = Len(strFile) > 0
End Function

Function GetLibraryPath(ByVal strGUID As String, _
ByVal VersionMajor As Integer, _
ByVal VersionMinor As Integer) As String
Dim UID As GUID
Dim ret As Long
Dim LName As String

ret = CLSIDFromString(StrPtr(strGUID), UID)
If ret <> 0 Then Debug.Print "ERR CLSID " & Hex(ret)
LName = String(512, 0)
ret = QueryPathOfRegTypeLib(UID, VersionMajor, VersionMinor, _
ByVal 1033&, LName)
If ret <> 0 Then Debug.Print "ERR Query " & Hex(ret)
LName = StrConv(LName, vbFromUnicode)
LName = Left(LName, Len(LName) - 1)
If Len(Dir(LName)) > 0 Then GetLibraryPath = LName

End Function
------------------------------------


.



Relevant Pages

  • Re: Ini Funktion fehlerhaft?
    ... Was ein bissl merkwürdig aussieht, ist, daß der Buffer mit MAX_ENTRY als Array Obergrenze angelegt wird. ... Private Declare Auto Function GetPrivateProfileSectionNames Lib "kernel32" (ByVal lpszReturnBuffer As IntPtr, ... ByVal nSize As Integer, _ ... Public Function GetSectionNames(ByVal iniFilename As String) As IEnumerable ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: Addition mit einer Zahl, welche führende Nullen hat
    ... txtAngebotsnummer.Text liefert einen String und den ... wie z.B. Integer, Double usw. enthält. ... Private WithEvents mTB As TextBox ... ByVal e As System.EventArgs _ ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: Ini Funktion fehlerhaft?
    ... As Byte, ByVal nSize As Integer, ByVal lpFileName As String) As Integer ... Public Function GetSectionNamesAs ArrayList ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Ini Funktion fehlerhaft?
    ... As Byte, ByVal nSize As Integer, ByVal lpFileName As String) As Integer ... Public Function GetSectionNamesAs ArrayList ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: UserControl-PropertyGrid
    ... Public Shared ReadOnly Empty As PointXYZ ... Private _X As Integer ... Public Sub New(ByVal x As Integer, ByVal y As Integer, ByVal z As Integer) ... End Property ...
    (microsoft.public.de.german.entwickler.dotnet.vb)