tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
13
ZUGRIFFE
3304
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Sep 2004
    Beiträge
    8
    Liebe Programmierer,

    ich habe eine DLL zum ausprobieren bekommen.
    Die DLL hat drei Aufgaben:
    1. MsgBox aufrufen
    2. ein String in einer MsgBox darzustellen
    3. liefert ein Wert zurück (1.23456)

    im Anhang findet ihr die DLL ihrer VC++ Quellcode.

    Wie binde ich diese DLL in VB 6.0? kann jemand mir ein Beispiel bezogen auf die DLL im Anhang basteln.

    Mit freundlichen Grüßen
    Scherbel
     

  2. #2
    Registriert seit
    Sep 2004
    Beiträge
    8
    Der Anhang ist zu Groß,
    hier ist der Quellcode (VC++):

    CCtcConfig::CCtcConfig()
    {
    }
    CCtcConfig::~CCtcConfig()
    {
    }
    CCtcConfig::Test1(void)
    {
    MessageBox ( 0 , "DLL-Aufruf erfolgreich" , "Moin" , MB_OK ) ;
    }

    CCtcConfig::Test2(std::string sMyString)
    {
    MessageBox ( 0 , sMyString.data(), "Moin" , MB_OK ) ;
    }

    double CCtcConfig::Test3(void)
    {
    return(1.2345);
    }
    Angehängte Dateien Angehängte Dateien
     

  3. #3
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Habe den Code jetzt nicht ausprobiert, aber so sollte es funktionieren:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    Private Declare Function Test1 Lib "ctctest.dll" ()
    Private Declare Function Test2 Lib "ctctest.dll" (ByVal sMyString As String)
    Private Declare Function Test3 Lib "ctctest.dll" () As Double
     
    Private Sub Form_Load()
       Call Test1
     
       Call Test2("Das ist ein Test")
     
       Dim doubleWert As Double
       doubleWert = Test3()
       Msgbox "doubleWert: " & doubleWert
    End Sub
    Eventuell must du die DLL noch ein wenig anpassen. Ich weiß nicht, wie das mit Klassen in einer DLL ist (zu sehen am Konstruktor und Destruktor).

    Einfach mal ausprobieren!


    mfG,
    MAN
     
    BLT - Die Bundesliga Tabelle der Saison 2011 / 2012 - http://www.spacehoster.de/blt/ NEU: mit Tippspiel!
    EMail: mstangel@gmx.de

  4. #4
    Registriert seit
    Sep 2004
    Beiträge
    8
    Vielen Dank für die schnelle Antwort. Wirklich nett
    Ich habe folgendes Probiert:

    Private Declare Function Test1 Lib "ctctest.dll" ()

    Private Sub Form_Load()
    Call Test1

    End Sub

    Dann kam die Fehlermeldung:
    DLL-Einsprungpunkt Test1 in ctcdll.dll nicht gefunden.

    Die DLL-Datei befindet sich im gleichen Verzeichnis wie das VB-Project
     

  5. #5
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Dann ist es so, wie ich es schon vermutet habe: Du must die DLL ein wenig umschreiben und zwar in der Art (wie auch in dem anderen Beitrag):
    Code :
    1
    2
    3
    4
    
    __declspec(dllexport) void __stdcall Test1( void )
    {
       MessageBox ( 0 , "DLL-Aufruf erfolgreich" , "Moin" , MB_OK ) ;
    }

    mfG,
    MAN
    Geändert von MAN (13.09.04 um 20:02 Uhr)
     
    BLT - Die Bundesliga Tabelle der Saison 2011 / 2012 - http://www.spacehoster.de/blt/ NEU: mit Tippspiel!
    EMail: mstangel@gmx.de

  6. #6
    Registriert seit
    Sep 2004
    Beiträge
    8
    Ich habe es fast geschafft, Bezogen auf die Beispiele unter dem Link:
    http://www.mvps.org/EDais/Tutorials/CDLL/CDLLch1a.html
    und die Hilfe vom MAN (Super nett und sehr hilfsbereit )habe ich das Beispiel wie folgt verändert:

    // VCDLL.cpp : Defines the entry point for the DLL application.
    #include "stdafx.h"
    #include <string>

    BOOL APIENTRY DllMain( HANDLE hModule,
    DWORD ul_reason_for_call,
    LPVOID lpReserved
    )
    {
    return TRUE;
    }

    int _stdcall ReportVersion() {
    return 1;
    }

    //***************************

    void _stdcall Test1( void )
    {
    MessageBox( 0 , "DLL-Aufruf erfolgreich", "Moin", MB_OK ) ;
    }
    void _stdcall Test2( std::string sMyString )
    {
    MessageBox( 0 , sMyString.data(), "Moin" , MB_OK ) ;
    }
    double _stdcall Test3( void )
    {
    return 1.2345;
    }

    und in der Datei VCDLL.def habe ich Test1 bis Test3 eingetragen.


    In VisualBasic:
    Hier habe ich die Vorschläge vom MAN befolgt. Test1 und Test3 Liefen Ohne Probleme. Bei Test2 hat es gehackt. Das Programm stürzte ab (Debug Assertion Failed).
    Lieber MAN Du bist echt Klasse. Bitte Um Hilfe.
    Danke im Voraus
    Geändert von scherbel_mousa (15.09.04 um 16:23 Uhr)
     

  7. #7
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Also hier steht zum Beispiel genau drin, wie du eine DLL in Visual C++ Schritt für Schritt programmierst: http://www.mvps.org/EDais/Tutorials/CDLL/

    Ich dachte, dass du schon alles davon programmiert hast, dir nur noch die Schnittstelle fehlt!

    Hab mir dein Projekt angekuckt und verbessert. Mustes nur noch kompilieren.

    Was ich jetzt vergessen hab: du must noch die .def-Datei aus dem Archiv in dein Proekt einbinden. Einfach bei QuellcodeDateien rechte Maustaste => Datei hinzufügen => CtcConfig.def angeben => Öffnen => neu kompilieren => fertig!


    mfG,
    MAN
    Geändert von MAN (15.09.04 um 14:09 Uhr)
     
    BLT - Die Bundesliga Tabelle der Saison 2011 / 2012 - http://www.spacehoster.de/blt/ NEU: mit Tippspiel!
    EMail: mstangel@gmx.de

  8. #8
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Benutze einfach statt std:string char*:
    Code :
    1
    
    __declspec(dllexport) void __stdcall Test2( char* sMyString )
    Dann müßte es theoretisch gehen (habs nicht ausprobiert)


    mfG,
    MAN
     
    BLT - Die Bundesliga Tabelle der Saison 2011 / 2012 - http://www.spacehoster.de/blt/ NEU: mit Tippspiel!
    EMail: mstangel@gmx.de

  9. #9
    Registriert seit
    Sep 2004
    Beiträge
    8
    Wie Du vorgeschlagen hast, Habe ich die Funk. Test2 wie folgt geändert

    //void _stdcall Test2( std::string sMyString )
    _declspec(dllexport) void __stdcall Test2( char* sMyString )

    {
    MessageBox( 0 , sMyString.data(), "Moin" , MB_OK ) ;
    }

    Somit Kam die die Fehler Meldung:
    Der linke Teil von '.data' muss eine Klasse/Struktur/Union sein

    dann habe ich .data() die in dem Aufruf von der MessageBox gelöscht und wie folgt geändert.
    MessageBox( 0 , sMyString, "Moin" , MB_OK ) ;
    Die DLL wurde dann erstellt.
    Als ich Test2 von VB aus aufgerufen habe,

    Private Declare Function Test2 Lib "vcdll.dll" (ByVal sMyString As String)
    ...
    ...
    Call Test2("WWW")

    kam eine leere MsgBox und zeigte den Folgenden Fehler an:
    Falsche DLL-Aufrufkonvention

    Was muss ich noch ändern Bitte um Hilfe
    Geändert von scherbel_mousa (16.09.04 um 08:34 Uhr)
     

  10. #10
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Dann versuch doch nochmal, das mit dem string in der DLL zu machen, aber ein wenig anders, und zwar so:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    #include <string>
     
    [COLOR=red]_[/COLOR]_declspec(dllexport) void __stdcall Test2( char* sMyString )
    {
       std:string sMessage = sMyString;
     
       MessageBox( 0 , sMessage.data(), "Moin" , MB_OK );
    }
    Dabei kannst du den Aufruf von VB lassen.
    Wenn das nicht funktioniert, wüßt ich auch nicht weiter, da ich das genau so selbst gemacht hatte.


    mfG,
    MAN
    Geändert von MAN (16.09.04 um 09:09 Uhr)
     
    BLT - Die Bundesliga Tabelle der Saison 2011 / 2012 - http://www.spacehoster.de/blt/ NEU: mit Tippspiel!
    EMail: mstangel@gmx.de

  11. #11
    Registriert seit
    Sep 2004
    Beiträge
    8
    Vielen Dank Lieber MAN

    Jetzt hat es FUNKTIONIERT, wirklich KLASSE Danke MAN
    Den Aufruf in VB musste ich aber auch ändern:
    Private Declare Function Test2 Lib "vcdll.dll" (ByVal sMyString As String) As Long

    Noch mal möchte ich den MAN loben.

    Keiner könnte mir so Hilfen wie Er.
    1000000 Dank
     

  12. #12
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Ist ja gut - ich fühl mich geehrt!

    Aber nochmal zu dem "As Long": das brauchst du nur, wenn du deine Funktion noch umschreibst und einen Long-Wert zurückgeben läßt. Wenn du die Funktion aus meinem letzten Post nimmst, gibt es ja keinen Rückgabewert.

    Aber wenn jetzt alles so läuft wie du es haben wolltest, dann ist ja alles klar!


    mfG,
    MAN
     
    BLT - Die Bundesliga Tabelle der Saison 2011 / 2012 - http://www.spacehoster.de/blt/ NEU: mit Tippspiel!
    EMail: mstangel@gmx.de

  13. #13
    Registriert seit
    Sep 2004
    Beiträge
    8
    Ich Brauch keine Rückgabewert aber anders hat es nicht funktioniert

    Danke noch mal für die tolle Hilfe
     

  14. #14
    JapanHauke Tutorials.de Gastzugang
    Hallo MAN und scherbel_mousa,
    ich stehe vor einem ähnlichen Problem (glaube ich) und würde mich freuen, wenn Ihr mir Eure Testapplikation zuschicken könntet.
    Merci!
    Hauke
     

Ähnliche Themen

  1. EventHandler per JS anbinden
    Von FrankWST im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 28.08.10, 19:20
  2. Wie SQL Server an VB .Net anbinden?
    Von thomas38 im Forum .NET Windows Forms
    Antworten: 12
    Letzter Beitrag: 20.10.09, 13:24
  3. Webservice anbinden
    Von kerstel im Forum .NET Web und Kommunikation
    Antworten: 1
    Letzter Beitrag: 01.06.09, 18:50
  4. Datenbank anbinden
    Von Crash123 im Forum Java Grundlagen
    Antworten: 1
    Letzter Beitrag: 23.04.09, 12:36
  5. COM Objekt anbinden
    Von Reticent im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 19.04.06, 14:35