VB6 DLL schreiben

Hallo,

ich versuche gerade mal, eine eigene dll zu schreiben.
Die Funktion selbst ist unwichtig, es geht mir um die Verwendung der dll

Hier der Code der DLL:

Option Explicit

Public Function ct(txt)
 ct = "\*\*\*" + txt + "\*\*\*"
End Function

ja, dafür braucht man keine dll, ich weiß. :wink: Wenn ich das zum Laufen bekomme, kann ich da aber auch anderes hineinschreiben, dann wird es sinnvoll.

Die dll heißt dann txt.dll

In einem Projekt trage ich die dll dann als Verweis ein und versuche sie so aufzurufen:

Private Declare Function ct Lib "txt.dll" (txt As String)

Private Sub Command1\_Click()
 Label1.Caption = ct(Text1.Text)
End Sub

Das klappt nicht, ich bekomme die Fehlermeldung:
‚Einsprungspunkt ‚ct‘ in txt.dll nicht gefunden.‘

Kann mir jemand sagen, was ich falsch gemacht habe?

Gruß, Rainer

Hallo Rainer
Also erstmal muß ich sagen, ich würde sowas lieber in Assembler machen. Da hab ich sowas nämlich schon geschafft.
Was ich bei VB5 machen kann, ist eine active-x-dll.

Mein Tip wäre der folgende:
Versuch mal
Function ct(txt) usw…, anstatt Public Function. Es gibt auch eventuell noch Global Function.
In einem Standard (.bas) Modul sollte das stehen.
Aber ich muß gleich sagen, das ist nur zum ausprobieren.
Es gibt auch Tools, mit denen man exportierte Namen auflisten kann.
Ist ein Name nicht exportiert, kann er auch nicht gefunden werden.
MfG
Matthias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Matthias,

Also erstmal muß ich sagen, ich würde sowas lieber in
Assembler machen.

*g* wenn ich das könnte, würde ich das auch. kann ich aber nicht, deshalb hätte ich das gern mit VB gemacht.

Da hab ich sowas nämlich schon geschafft.
Was ich bei VB5 machen kann, ist eine active-x-dll.

Mein Tip wäre der folgende:
Versuch mal
Function ct(txt) usw…, anstatt Public Function. Es gibt auch
eventuell noch Global Function.

Nur Function … ? Ich versuch’s. Private Function hatte ich schon … das Selbe.

In einem Standard (.bas) Modul sollte das stehen.
Aber ich muß gleich sagen, das ist nur zum ausprobieren.
Es gibt auch Tools, mit denen man exportierte Namen auflisten
kann.
Ist ein Name nicht exportiert, kann er auch nicht gefunden
werden.

Na ja, das war ja nur ein Versuch, dann bleibe ich halt bei Modulen …

Danke, Gruß, Rainer

Hallo Rainer,

als ich vor einiger Zeit mal mit einer dll gespielt habe, habe ich die ganz anders eingebunden:

  1. Active-X-Dll erstellen, die Funktionen stehen in einem Klassenmodul (MyClass)
  2. Dll kompilieren und im Zielprojekt als Verweis einfügen
  3. Objekt im Zielprojekt erstellen über „Public MyObj as MyDll.MyClass“
  4. Objekt initialisieren: „MyObj = New MyDll.MyClass“
    und schließlich 5. Objekt benutzen: „MyObj.MyMethod“

Daniel

Hallo Rainer,

soviel ich weis kann man mittels VB keine Standart-DLL erzeugen. Das haengt mit dem Aufbau der DLL und den Einsprungpunkten, und mit der Art und Weise wie die DLL in den Speicher geladen wird zusammen.

Mit VB kann man nur Active-X DLLs erzeugen, die dann mittels RegServ im System registriert werden muessen und dann wie alle anderen Active-X Elemente in VB als „Verweise“ eingebunden werden koennen.

Um eine DLL zu erzeugen, die das von dir gewuenschte Verhalten hat, kann man z.B. VC hernehmen.

Tschau
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

1 Like

Hallo Peter,

Um eine DLL zu erzeugen, die das von dir gewuenschte Verhalten
hat, kann man z.B. VC hernehmen.

danke, schade. ;-(

Das hätte mir irgendwie gefallen. Dann bleibe ich bei Modulen. :wink:

Gruß, Rainer

Hi Daniel,

als ich vor einiger Zeit mal mit einer dll gespielt habe, habe
ich die ganz anders eingebunden:

  1. Active-X-Dll erstellen, die Funktionen stehen in einem
    Klassenmodul (MyClass)
  2. Dll kompilieren und im Zielprojekt als Verweis einfügen
  3. Objekt im Zielprojekt erstellen über „Public MyObj as
    MyDll.MyClass“
  4. Objekt initialisieren: „MyObj = New MyDll.MyClass“
    und schließlich 5. Objekt benutzen: „MyObj.MyMethod“

hmmm. Das klingt interessant. Kannst Du mir da den Quellcode von einem Beispiel mailen? Aber bitte nur das nötigste, also so, daß die dll (fast) nichts macht, aber Daten übergeben werden? Ähnlich wie das, was ich da oben versucht habe? Die Beispiele, die ich finde sind immer zu kompliziert, da brauche ich immer Tage, bis ich das Überflüssige entfernt habe und das für mich Wesentliche übrig bleibt, das ich dann verstehe. :wink:

Ein Beispiel dafür:
Das Beispiel für ‚exists‘ in API-Guide

Private Const GCT\_INVALID = &H0
Private Const GCT\_LFNCHAR = &H1
Private Const GCT\_SEPARATOR = &H8
Private Const GCT\_SHORTCHAR = &H2
Private Const GCT\_WILD = &H4
Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long
Private Declare Function PathFindOnPath Lib "shlwapi.dll" Alias "PathFindOnPathA" (ByVal pszPath As String, ByVal ppszOtherDirs As String) As Boolean
Private Declare Function PathGetCharType Lib "shlwapi.dll" Alias "PathGetCharTypeA" (ByVal ch As Byte) As Long
Private Declare Function PathGetDriveNumber Lib "shlwapi.dll" Alias "PathGetDriveNumberA" (ByVal pszPath As String) As Long
Private Sub Form\_Load()
 'KPD-Team 2000
 'URL: http://www.allapi.net/
 'E-Mail: [email protected]
 Dim sSave As String, Ret As Long
 'set the form's graphical omde to 'persistent'
 Me.AutoRedraw = True
 'determine whether the file exists
 Me.Print "Does the file 'win.com' exist? " + CStr(CBool(PathFileExists("c:\windows\win.com")))
 'is the file 'autoexec.bat located in one of the directories specified in the PATH environment variable?
 Me.Print "Is the file 'autoexec.bat' located a PATH-directory? " + CStr(CBool(PathFindOnPath("win.com", vbNullString)))
 'check whether a specified character can be used in a path
 Select Case PathGetCharType(Asc("\*"))
 Case GCT\_INVALID
 sSave = "invalid"
 Case GCT\_LFNCHAR
 sSave = "valid in a long file name"
 Case GCT\_SHORTCHAR
 sSave = "valid in a short (8.3) file name"
 Case GCT\_WILD
 sSave = "a wildcard character"
 Case GCT\_SEPARATOR
 sSave = "a path separator"
 End Select
 Me.Print "The character '\*' is " + sSave
 'get the corresponding drive number of a file
 Me.Print "The file is located on drive " + Chr$(65 + PathGetDriveNumber("e:\test.txt"))
End Sub

Da bleibt für mich am Schluß noch …

'Deklaration:
Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long
'Aufruf:
Ergebnis = CStr(CBool(PathFileExists(Datei\_oder\_Verzeichnis)))

… übrig.
Es ist ja schön, daß Da ein lauffähiges Beispiel ist, das Wesentliche herausfiltern dauert aber immer ein wenig. Oft sind die Beispiele sehr viel länger, was für mich übrig bleibt aber nicht. :wink:

Hast Du ein kurzes Beispiel für mich, das mir ausreicht, die Funktion zu verstehen?

Gruß, Rainer

Hi Rainer,

kommt sofort.

Daniel

1 Like

Hallo Daniel,

Danke! Genau so etwas habe ich mir gewünscht!
Danke für die Hilfe, nun muß ich mir nur noch alles ansehen und selbst versuchen. Wenn Probleme auftreten darf ich 'ne Mail schicken?

Gruß, Rainer

Hallo Daniel,

ach so geht das. Danke für die Hilfe, das hätte ich so nicht geschafft.
Ist klar, verstanden.

Gruß, Rainer

Hallo Rainer,

versuchen kannst du’s gerne. Leider checke ich das Postfach nur sehr unregelmäßig, daher kann’s u.U. etwas dauern (ich werde aber versuchen, in nächster Zeit mal wieder öfters dort reinzukucken).

Daniel