Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1084to1088
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

DLL-Erstellung mit Visual Studio 2008

DLL-Erstellung mit Visual Studio 2008
Nico
Hallo Excel Freunde,
ich bin mittlerweile echt am Verzweifeln. Wer kann mir Helfen?
Ich möchte eine DLL (VB) mit einer einfachen Function/Sub erstellen und diese dann in Excel (VBA-Editor) als Verweis einbinden und dann per Makro die Function/Sub ansprechen.
Ich arbeite mit Visual Studio 2008 und auch mit Visual Basic 2006 Express Edition. (in beiden Fällen bekomm ich es nicht hin)
Mit Visual Studio 2008:
Datei->neues Project->Visual Basic/Windows - Klassenbibliothek
Nun habe eine ClassLibrary2 in Ihr my Project und Class1.vb
Class1.vb:
Public Class Class1

Public Sub sagHallo()
MsgBox("Text aus DLL")
End Sub

End Class
Nach dem ich nun auf "Erstellen->ClassLibrary2 erstellen" gehen, erhalte ich:
ClassLibrary2.dll
ClassLibrary2.pdb
So weit so gut, doch leider funktioniert es nicht die Dll unter Ecxel->VBA-Editor->Verweis erstellen
Fehlermeldung: Verweis auf angegebene Datei kann nicht hinzugefügt werden.
Auch die Registrierung per regsvr32 kann nicht durchgeführt werden.
Felhermeldung: Das Modul wurde geladen, aber der DllRegisterServer-Eingangspunkt wurde nicht gefunden.
Ich bin echt Dankbar über Euere Hinweise. Im Inet findet man nur Anleitungen welche sich auf Visual Basic 6.0 beziehen.
Ich habe auch Projecte von Visual Basic 6.0 und diese dlls funktionieren. Öffne ich dieses Project mit Visual Studio 2008 wird diese konvertiert und die neue dll geht nun auch nicht mehr einzubinden. Fehlermeldungen sind die selben.
Schonmal Danke im Voraus!!
AW: DLL-Erstellung mit Visual Studio 2008
12.07.2009 10:28:28
mumpel
Hallo!
Das kann auch nicht gehen. Du musst ein ActiveX-Control erstellen. Aber so wie Du das machst wird es nie funktionieren. Und einfach nur ein Makro in eine dll/ocx schreiben geht schon mal gar nicht. Und zwischen einer normalen dll/ocx und einem ActiveX-Control bestehen Unterschiede. Also Suche in Google mal nach ActiveX-Controlsize>color>. Die Vorgehensweisen zum Programmieren eines ActiveX-Controls in VS2008 dürften ähnlich sein wie in VB06. Ob man in VS2008 überhaupt ein ActiveX-Control erstellen kann ist mir nicht bekannt.
Gruß, René
Anzeige
AW: DLL-Erstellung mit Visual Studio 2008
12.07.2009 13:10:21
Nico
Vielen Dank erstmal. Ich werde mal schauen ob ich mit diesem Hinweis etwas im Inet finde.
Aber vieleicht kannst Du mir ja sagen wie mit welchem Programm ich meine Umsetztungen machen kann, wenn es mit VS2008 wahrscheinlich nicht geht.
AW: DLL-Erstellung mit Visual Studio 2008
12.07.2009 13:20:57
Tino
Hallo,
ist es für Dich nicht viel einfacher ein Addin zu erstellen?
Zudem kommt noch die Admin Sache mit der Du dich rumschlagen musst um eine dll zu registrieren, vor allem unter Vista muss man die Benutzerkonensteuerung deaktivieren.
Sind diese rechte überall vorhanden um dies umzusetzen?
Ein Addin kannst Du auch als Verweis an bestimmte Dateien koppeln.
Gruß Tino
Anzeige
AW: DLL-Erstellung mit Visual Studio 2008
12.07.2009 18:28:38
Nico
Normalerweise hast Du ja Recht. Nur ich möchte kleine Excel-Tools (welche ich geschrieben haben) zur Nutzung veröffentlichen. Damit ich eine kleine Vorstellung bekomme ob und wieviel diese Tools genutzt werden, habe ich eine Zwangsregistrierung in einer Klasse erstellt, welche aus bestimmten Nutzerdaten das Richtige Passwort erstellt.
Da man gerade passwortgeschütze Excel-Projekte knacken kann, würde man auch an meine Verschlüsselungsmethoden kommen und genau das möchte ich nicht.
Ich denke an den Quelltext einer DLL kommt man nicht so schnell ran (wenn überhaubt).
Mein Problem ist einfach das ich sehr wenig C++ kann (dort soll es einfacher sein mit der dll). Ich bin ehr spezi von VB, VBA, ASP, Perl und JavaScript
Anzeige
AW: DLL-Erstellung mit Visual Studio 2008
12.07.2009 22:06:48
Herby
Hallo Nico,
kennst du VSTO - Visual Studio Tools for Office. Damit müsste
die Verbindung zwischen VB.Net und Office doch möglich sein !
Leider kenn ich es auch nur aus der Ferne.
Viele Grüße
Herby
AW: DLL-Erstellung mit Visual Studio 2008
13.07.2009 15:45:17
Nico
Hmmm, habs mir mal kurz durch gelesen ... Ich denke das es nicht das Richtige ist, da es nur für Office 2003 + Office 2007 sein soll.
###################################################################
Nun möchte ich abschliessend meinen Weg erklären, auch wenn diese nicht über Visual Studio 2008 erfolgen konnte. (mangels meines Wissens und wenig aussagekräftige Internetrecherchen
Ich habe mir Visual Basic 6.0 zugelegt und kann dort bequem COM-DLLs erstellen.
Visual Basic 6.0 öffnen
File -> New Project ... -> ActiveX DLL
in Class1 kommt folgender Code:
Public Sub sagHallo2(ByVal strX As String)
MsgBox (strX)
End Sub

Die Eigenschaften von Class1 werden wie folgt umgestellt:
(Name) = Testing
Instancing = GlobleMultiUse
Danach File-->Make Project1.dll
Fertig!!
1. Diese Dll muss nun noch als Verweis ins Excel-VBA-Projekt hinzugefügt werden
Exceldatei öffnen -> zum VBA-Editor wechseln und dort auf Extras-->Verweise ...
2. Die DLL muss registriert werden mit regsvr32.exe "pfad\Dll" (regsvr32 /u "Pfad\dll" unregistriert diese wieder)
Start-->Ausführen-->Code eingeben
Im Excel-Modul muss nun folgendes stehen:
Public Sub meinMakro()
Dim X as Testing 'So heisst meine Klasse im VBProject - (Testing.cls)
'Debuger meldet "Fehler beim Kombilieren ..." - Dies weisst darauf hin, das kein Verweis auf  _
Dll erstellt wurde
Set X = New Testing 'kurzschreibweise um nicht immer Testing schreiben zu müssen
Call X.sagHallo2("Mein Text")
'Kommt Fehler 429, deutet dies auf eine nicht registrierte DLL hin
End Sub

Anzeige
AW: DLL-Erstellung mit Visual Studio 2008
13.07.2009 16:55:35
Tino
Hallo,
hier noch ein Beispiel wie es mit VBA geht die Registrierung.
https://www.herber.de/forum/archiv/1000to1004/t1000559.htm
Wie schon erwähnt unter Vista sind volle Admin rechte erforderlich, daher die Benutzerkontensteuerung muss für die Registrierung abgestellt werden.
Gruß Tino
AW: DLL-Erstellung mit Visual Studio 2008
14.07.2009 21:20:31
Nico
Mit VBA habe ich noch folgendes um den Verweis per Script zu erstellen. Aber auch hier muss VBA-Project vertraut werden.
Man erstelle ein Klassenmodul namens "clsDLLreg" unbd kopiert diesen Code rein:
Option Explicit
Private Declare Function LoadLibrary Lib "kernel32" Alias _
"LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" _
(ByVal hModule As Long, ByVal lpProcName As String) As _
Long
Private Declare Function WaitForSingleObject Lib "kernel32" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) _
As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal _
hObject As Long) As Long
Private 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
Private Declare Function GetExitCodeThread Lib "kernel32" _
(ByVal hThread As Long, lpExitCode As Long) As Long
Private Declare Sub ExitThread Lib "kernel32" (ByVal dwExitCode _
As Long)
Private Declare Function FreeLibrary Lib "kernel32" _
(ByVal hLibModule As Long) As Long
Const STATUS_WAIT_0 = &H0
Public Sub RegServeDLL(ByVal Path As String, mode As Boolean)
Dim insthLib As Long, lpLibAdr As Long, hThd As Long, lpExCode As Long
Dim procName As String, Result As Long, okFlag As Boolean
'DLL in den Speicher laden
insthLib = LoadLibrary(ThisWorkbook.Path & "\" & Path)
'Aktion wählen
If insthLib Then
If mode Then
procName = "DllRegisterServer"
Else
procName = "DllUnregisterServer"
End If
'Adresse der DLL im Speicher
lpLibAdr = GetProcAddress(insthLib, procName)
If lpLibAdr  0 Then
'Aktion starten
hThd = CreateThread(ByVal 0, 0, ByVal lpLibAdr, _
ByVal 0&, 0&, 0&)
If hThd Then
'Maximal 5 sec warten
Result = WaitForSingleObject(hThd, 5000)
If Result = STATUS_WAIT_0 Then
'Vorgang erfolgreich in 5 sec beendet
Call CloseHandle(hThd)
Dim test
test = CloseHandle(hThd)
okFlag = True
Else
'5 sec überschritten -> Thread schließen
Call GetExitCodeThread(hThd, lpExCode)
Call ExitThread(lpExCode)
Call CloseHandle(hThd)
End If
End If
End If
'Speicher wieder freigeben
Call FreeLibrary(insthLib)
End If
If Not okFlag Then
' MsgBox ("Fehler! Der Vorgang wurde abgebrochen.")
Else
' MsgBox ("Der Vorgang war erfolgreich!")
End If
End Sub

Public Sub REGmyVerweis(dllName As String, reg As Boolean, Optional dllFileName As String)
'Registriert/Unregistriert den Verweis (myDll) --> VB-Editor - Extras/Verweise...
'dll muss sich im selben Verzeichnis befinden wie die Excel-Datei
'registrieren --> Call REGmyVerweis("atest", True, "myFirst.dll")
'unregistrieren --> Call REGmyVerweis("atest", False)
On Error GoTo error
Dim project As String
Dim checkProject As String
Dim x As Object
Dim i As Integer
Dim j As Integer
Dim y As Object
Dim myDll As Boolean
Dim myVerweisItem As Integer
project = ThisWorkbook.Path & "\" & ThisWorkbook.name
Set x = Application.VBE.VBProjects
myDll = False
For i = 1 To x.Count
checkProject = x.Item(i).Filename
If checkProject = project Then
Set y = x.Item(i).References
For j = 1 To y.Count
If (UCase(y.Item(j).name) = UCase(dllName)) Then
myDll = True
myVerweisItem = j
j = y.Count
End If
Next j
If myDll = False Then
y.AddFromFile ThisWorkbook.Path & "\" & dllFileName
Else
If reg = False Then y.Remove y.Item(myVerweisItem)
End If
i = x.Count
End If
Next i
error:
Dim errNumber
errNumber = Err.number
Select Case (errNumber)
Case 0
'Resume Next
Case Else
'MsgBox (Err.Number & vbCr & Err.Description)
Debug.Print Err.number
'error 1004 bei set x = application --> Zugriff auf das VBA-Project wird nicht vertraut!!
'error -2147319779 bei if(y.item...) --> Zugriff auf References nicht möglich korrupter  _
Verweis-Eintrag
End Select
End Sub

Nun ein neues Modul erstellen mit folgenden Code:
'###################################################################
'## Klassenmodul-Variablen ##
'###################################################################
Public objDLLreg As New clsDLLreg
Sub auto_open()
'Verweise und Registrierung erstellen
Call objDLLreg.REGmyVerweis("Titel_der_DLL_Verweisname", True, "Dateiname.dll")
Call objDLLreg.RegServeDLL("Dateiname.dll", True)
Call starts
End Sub Sub auto_close()
'Verweise und Registrierung entfernen
Call objDLLreg.REGmyVerweis("Titel_der_DLL_Verweisname", False)
Call objDLLreg.RegServeDLL("Dateiname.dll", False)
End Sub Sub starts()
Call codiere
End Sub
Aber Tino ich habe gesehn das Du auch Auftragsarbeiten machst. Weisst Du nicht vieleicht wie ich eine Dll mit VS2008 erstelle um diese dann genau so anwenden zu können wie die unter VB6.0 erstellte?
Anzeige
AW: DLL-Erstellung mit Visual Studio 2008
14.07.2009 21:35:09
Tino
Hallo,
habe kein VS2008, hätte gedacht dies wäre wie bei VB 5 oder 6.
Gruß Tino

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige