Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge

Visual Basic Modul kompilieren - Dateien fehlen

honsel01 / 9 Antworten / Baumansicht Nickles

Hallo,


versuche mich gerade in Visual Basic (Visual Studio 6).
Da habe ich ein Frontend gebastelt, welches via ADODC auf eine SQL-Datenbank zugreift und dort gespeicherte Tabellen bearbeiten lässt.


Das Tool läuft auf meinem Rechner ganz wunderbar, nur wenn ich die kompilierte Exe auf einem anderen Rechner starten will, erscheind folgende Fehlermeldung:


Laufzeitfehler 339 Die Komponente "msadodc.ocx" oder ein ihrer Abhängigkeiten ist nicht registriert: Ein der Datein ist nicht registriert.


Höchst warscheinlich muss ich da wohl auf dem anderen PC noch ein Modul nachinstallieren, welches auf meinem PC mit der vb6-Installation eingerichtet wurde,... aber wo finde ich das???


ODBC-Treiber ist installiert (-> für SQL-Server mit Verweis auf Datenbankname)


Danke schonmal

bei Antwort benachrichtigen
Borlander honsel01 „Visual Basic Modul kompilieren - Dateien fehlen“
Optionen

Liegt bei Visual Studio 6 kein Setup-Builder bei? Damit solltest Du eine Setup-erstellen können das die DB-Unterstützung mit installiert... (vermute ich zumindest - mit InstallShieldExpress aus dem Delphi/C++Builder Lieferumfang ist dies nämlich problemlos möglich, auch andere Tools sollten also eine ähnliche Möglichkeit bieten)

bei Antwort benachrichtigen
pfORchT honsel01 „Visual Basic Modul kompilieren - Dateien fehlen“
Optionen

Alle Dateien aus dem Build-Rechner in das Verzeichnis der EXE kopieren (msadodc.*) - sind meist im System32. Wenn die Dateien im selben Verzeichnis liegen ist es so, als ob sie auch im System registriert wären - bei mir zumindest.

Wenn ich eine EXE irgendwo weitergebe hangele ich mich an den Fehlermeldungen entlang und pack die benötigten Dateien in das EXE Verzeichnis - wenn alle da sind, dann läufts.
:-)

bei Antwort benachrichtigen
PaoloP honsel01 „Visual Basic Modul kompilieren - Dateien fehlen“
Optionen

Ein aktuelles mdac zu installieren löst das problem höchstwarscheinlich.
Versuch macht klug :-)

Jedes mal wenn jemand "Cloud" sagt, verliert ein Engel seine Flügel.
bei Antwort benachrichtigen
honsel01 Nachtrag zu: „Visual Basic Modul kompilieren - Dateien fehlen“
Optionen

Mdac installieren wars nicht, die ocx-Datei ins Verzeichnis kopieren beseitigt zwar die Fehlermeldung, das Datenbankfeld bleibt aber leer, einen Setup- oder Exe-Builder habe ih leider nicht dabei. Da bin ich mit meinem Latein auch am Ende.
Hat noch jemand eine Idee?
Vielen Dank

bei Antwort benachrichtigen
Sovereign Sylvia honsel01 „Visual Basic Modul kompilieren - Dateien fehlen“
Optionen

Hi,

die OCX-Datei einfach in einen Ordner zu kopieren, reicht womöglich nicht; die Datei muss auch registriert werden.
Anbei findest du den Code, um einen Registrierer selbst zu bauen. Wenn der Registrierer gestartet ist, bleibt er oben auf, und man kann im Explorer die Datei aufsuchen und mit Drag'n'Drop in das Textfeld bringen.
Dann einfach die "Register"- oder - je nachdem - die "Un-Register"-Taste betätigen. Erfolg oder Misserfolg werden angezeigt.
Der Registrierer arbeitet nur mit OCX- oder DLL-Dateien.

OCX- oder DLL-Dateien sollten nach Möglichkeit immer in das Windows-System-Verzeichnis
kopiert werden. Mit Hilfe dieses Registrierers ist das dann eine saubere Lösung.
Sollte die eine oder andere OCX oder DLL ausgetauscht werden müssen, empfiehlt sich immer die Reihenfolge:
Registrierer aufmachen;
Datei einlesen (Drag'n'Drop);
Taste zum De-Registrieren ausführen. Registrierer offen lassen !
Datei austauschen;
Taste zum Registrieren drücken. Fertig.


Sollte irgend etwas nicht funktionieren, kannst du dich bei SG@SGSiS.de melden.

Gruss

Sovereign Sylvia

P.S.: Ich würde an deiner Stelle kein ADODC verwenden, das sind echte Speed-Bremser. Benutze lieber ein ADODB.Recordset und binde das Frontend-Listenelement (oder was auch immer) daran.





Project "OCX-DLL-Register" für VB6:

1) Neues Project öffnen; eine Form ist autmatisch hinzugefügt.
Eigenschaft "BorderStyle" auf "1 - Fest Einfach"
2) Ein Module hinzufügen.
3) Auf der Form werden gebraucht:
3 Command Buttons (Namen: "cmdReg", "cmdUnReg" und "Command1")
(Captions: "Register", "Un-Register" und "Close")
1 Text-Feld ("txtReg") mit Height=255 und Width=4695
WICHTIG: Eigenschaften "OLEDragMode" auf Automatisch und "OLEDropMode" auf Manuell.
1 Label ("Label1"); "AutoSize" = True und "Visible" = False
Dieses Label dient nur dazu, bei Dateien, die über Drag'n'Drop eingeladen werden, sich auf die Länge des Pfad-Textes einzuschiessen und in gewissen Grenzen die Breite des Textfeldes und der Form anzupassen.

4) Auf der Form folgenden Code eingeben (kann direct von hier kopiert werden:
'#############################################
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long

Private Sub Form_Load()
On Error GoTo errorhandler
If Command$ "" Then
Me.Label1.Caption = Command$
Me.txtReg.Width = Me.Label1.Width + 100
Me.Width = Me.Label1.Left + Me.Label1.Width + 300
If Me.txtReg.Width If Me.Width Me.txtReg.Text = Me.Label1.Caption
If InStr(Me.txtReg.Text, Chr(34)) = 1 Then Me.txtReg.Text = Mid$(Me.txtReg.Text, 2, Len(Me.txtReg.Text) - 2)
End If
Me.Show
SetWindowPos Me.hwnd, -1, 0, 0, 0, 0, &H3 'Keeps the window on top
Me.Left = Screen.Width / 2 - Me.Width / 2
Me.Top = Screen.Height / 2 - Me.Height / 2
Exit Sub
errorhandler:

End Sub

Private Sub cmdReg_Click()
Dim p_return As String
If Me.txtReg.Text "" Then
p_return = RegUnReg(Me.txtReg.Text)
If p_return "" Then
MsgBox p_return, 16, "Registering failed !"
Else
MsgBox "Registering succeeded !", vbInformation, "RegUnReg"
End If
Else
MsgBox "Nothing entered.", 48, "We don't register empties."
End If
End Sub

Private Sub cmdUnReg_Click()
Dim p_return As String
If Me.txtReg.Text "" Then
p_return = RegUnReg(Me.txtReg.Text, "U")
If p_return "" Then
MsgBox p_return, 16, "Un-Registering failed !"
Else
MsgBox "Unregistering succeeded !", vbInformation, "RegUnReg"
End If
Else
MsgBox "Nothing entered.", 48, "We don't unregister empties."
End If
End Sub

Private Sub Command1_Click()
Unload Me
End Sub

Private Sub txtReg_Change()
If Dir(Me.txtReg) = "" Or _
Me.txtReg = "" Or _
(LCase$(Right$(Me.txtReg, 3)) "ocx" And _
LCase$(Right$(Me.txtReg, 3)) "dll") Then
Me.cmdReg.Enabled = False
Me.cmdUnReg.Enabled = False
Else
Me.cmdReg.Enabled = True
Me.cmdUnReg.Enabled = True
End If
End Sub

Private Sub txtReg_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
On Error GoTo errorhandler
Me.txtReg.Text = ""
Me.Label1.Caption = Data.Files(1)
Me.txtReg.Width = Me.Label1.Width + 100
Me.Width = Me.Label1.Left + Me.Label1.Width + 300
If Me.txtReg.Width If Me.Width Me.txtReg.Text = Me.Label1.Caption
Exit Sub
errorhandler:

End Sub
'#############################################

5) Auf dem Module folgenden Code eingeben:
'#############################################

Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long

Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _
(ByVal lpLibFileName As String) As Long

Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _
ByVal lpProcName As String) As Long

Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, _
ByVal dwStackSize As Long, ByVal lpStartAddress As Long, _
ByVal lParameter As Long, ByVal dwCreationFlags As Long, _
lpThreadID As Long) As Long

Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long

Declare Function GetExitCodeThread Lib "kernel32" (ByVal hThread As Long, _
lpExitCode As Long) As Long
Declare Sub ExitThread Lib "kernel32" (ByVal dwExitCode As Long)


Function RegUnReg(ByVal sFile As String, Optional sHandle As String = "") As String

Dim lLib As Long
Dim lpDLLEntryPoint As Long
Dim lpThreadID As Long
Dim lpExitCode As Long
Dim mThread
Dim mResult

lLib = LoadLibrary(sFile)

If lLib = 0 Then
' //File not exists or not a valid DLL file
RegUnReg = "Error loading control DLL"
Exit Function
End If

If sHandle = "" Then
lpDLLEntryPoint = GetProcAddress(lLib, "DllRegisterServer")
ElseIf sHandle = "U" Or sHandle = "u" Then '//Unregister Server
lpDLLEntryPoint = GetProcAddress(lLib, "DllUnregisterServer")
Else
RegUnReg = "Unknown command handle"
Exit Function
End If

If lpDLLEntryPoint = vbNull Or lpDLLEntryPoint = 0 Then
GoTo Exit1
End If

mThread = CreateThread(ByVal 0, 0, ByVal lpDLLEntryPoint, _
ByVal 0, 0, lpThreadID)

If mThread = 0 Then
GoTo Exit1
End If

mResult = WaitForSingleObject(mThread, 10000)
If mResult 0 Then
GoTo Exit2
End If
CloseHandle mThread
FreeLibrary lLib
Exit Function

Exit1:
RegUnReg = "Registration failed in obtaining entry point or creating thread for " & sFile & "."
FreeLibrary lLib
Exit Function

Exit2:
RegUnReg = "Registration failed in signaled state or time-out for " & sFile & "."
FreeLibrary lLib
lpExitCode = GetExitCodeThread(mThread, lpExitCode)
ExitThread lpExitCode
End Function
'#############################################

Mein sz streikt heute wieder ------ Nobody is perfect, and we prove it every day.
bei Antwort benachrichtigen
honsel01 Nachtrag zu: „Visual Basic Modul kompilieren - Dateien fehlen“
Optionen

Vielen Dank für die umfangreiche Hilfe, Jedoch komme ich mir langsam vor wie ein Dummie. Habe die exe gebaut und auf dem Zielrechner ausgeführt "registration suceeded". Mein Tool startet nach wie vor nur auf Daten besteht immernoch kein Zugriff. Das ADODC-Feld bleibt blass und man kann nicht durch die Daten blättern.
Ich würde übrigends auch ADODB nehmen, aber wie heisst das Ausgeschrieben? Ich suche es in der Komponentenliste in VB.
Grüße und Danke

bei Antwort benachrichtigen
Sovereign Sylvia honsel01 „Vielen Dank für die umfangreiche Hilfe, Jedoch komme ich mir langsam vor wie...“
Optionen

Hi again,
ADODB ist keine Komponente, sondern eine Library. In VB in den Verweisen muss dazu "Microsoft ActiveX Data Objects 2.5 Library" (oder mit anderer VersionsNummer, je nach Verfügbarkeit) hinzugefügt werden. Dann kann man zumindest schon mal versuchen, ob man mit einer ACCESS-Datenbank Datenaustausch vornehmen kann, auch auf dem Zielrechner. Für SQL empfiehlt sich dann das ADODB.CommandParameter Object.

Gruss Sovereign Sylvia

Mein sz streikt heute wieder ------ Nobody is perfect, and we prove it every day.
bei Antwort benachrichtigen
Sovereign Sylvia Nachtrag zu: „Hi again, ADODB ist keine Komponente, sondern eine Library. In VB in den...“
Optionen

Hi,
ich habe noch vergessen zu fragen, welche SQL- und Windows-Version auf dem Zielrechner installiert ist, und ob dort auch die VB-Runtime-DLL (MSVBVM60.Dll) installiert ist.
Gruss Sovereign Sylvia

Mein sz streikt heute wieder ------ Nobody is perfect, and we prove it every day.
bei Antwort benachrichtigen
honsel01 Nachtrag zu: „Visual Basic Modul kompilieren - Dateien fehlen“
Optionen

Auf dem Server läuf Windows 2003 und SQL-Server 2000 sp3
VB6runtime ist nicht explizit installiert, wenn ja, dann höchstens mit der sql-server-Installation.
Habe jetzt übrigens einen Setup-Builder gefunden, der die Bibliotheken mitkopiert. Allerdings läuft das Programm immer noch nicht. die Namen der Datenfelder sind nicht bekannt. Ich forsch weiter...

bei Antwort benachrichtigen