Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Visual Basic 6.0 / VBA » Dll mit Vc++ 6.0 erstellt. Aufruf unter Vb Wie ??

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
25.08.2003, 08:37 Uhr
~Micha
Gast


Hallo Forumsteilnehmer,

folgende Frage:
Ich habe eine DLL in VC++ 6.0 erzeugt, die zwei Funktionen exportiert.

C++:
__declspec(dllexport) char  * get_version(void);
__declspec(dllexport) char  * get_FileName(char * suchstring, char * pfad);


es funktioniert wenn ich mit einem C - Testprogramm die Funktionen meiner erzeugten DLL verwende.
Die importe in meinem C-Testprogramm habe ich so deklariert:

C++:
extern __declspec(dllimport) char  * get_version(void);
extern __declspec(dllimport) char  * get_FileName(char * suchstring, char * pfad);


Ich bin mir aber nicht sicher ob ich die definitionen der exporte richtig gemacht habe !! Wie ist es wenn ich die Funktionen aus einem VisualBasic Programm aufrufen möchte wird es auch so einfach funktionieren ?? Oder muss ich eine allgemeinere Definition verwenden und wenn JA welche und wie ??

Ich habe auch keine DllMain() Funktion in meinem Projekt definiert.
Ist es ein muss ?

Danke für eure Infos.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.08.2003, 13:09 Uhr
Pablo
Supertux
(Operator)


Es funktioniert wie bei den Aufrufen von API Funktionen. In Prinzip handelt sich um dasselbe. Wie du die Funktion in VC++ weiß ich wirklich nicht, weil ich nie eine gemacht habe, aber es ist notwendig (meiner Meinung nach), dass DllMain() deklariert ist.

Du öffnest am besten ein neues BAS Modul (.BAS Datei) und fügst ganz oben hinzu:

Visual Basic:
Option Explicit
Declare Sub [b]NameDerFunktion[/b] Lib "[b]datei.dll[/b]" ([[b]Parameter[/b]]) [As Long]



Ob es einen Rüchgabetyp geben muss, hängt von der C++ Funktion ab, ob sie void oder nicht void ist.

In den Parametern musst du entweder byRef oder byVal hinzufügen. Wenn die C++ Funktion nur den Wert braucht, bsp: int f(int z); dann ist das Parameter in VB byVal i As String. Wenn aber ein Pointer oder Referenz erfordelich ist, byRef. Bsp: int f(int& z, int* p); Die Parameter in VB sind byRef z As Integer, byRef p As Integer

Für deine Funktionen würde ich so deklarieren:

Visual Basic:
Option Explicit
Declare Sub get_version Lib "mylib.dll" () As String
Declare Sub get_FileName Lib "mylib.dll" (byRef suchstring As String, byRef pfad As String) As String


Das funktioniert genau dann, wenn die DLL Datei mylib.dll heißt. Solltest du eine Funktion einbinden, deren Namen schon in VB gibt, kannst du den Namen ändern, indem du vor Lib Alias "neuer Name der Funktion" hinzufügst.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 25.08.2003 um 13:10 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.08.2003, 19:34 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
kleiner Einspruch, da nicht ganz korrekt.
Wenn Du die Dll in Vb verwendest muß die Funktion wie folgt gebaut werden.

C++:
extern "C" __declspec(dllexport) char  * __stdcall get_version();


extern "C" bewirkt, dass keine C++ - Namensergänzung durchgeführt wird.
Das Schlüsselwort __declspec() bestimmt das eine Instanz eines Typs zusammen mit einem Microsoft spezifischen Speicherkalssenattribut gespeichert wird. "dllexport" legt fest das eine Funktion anderen Modulen zugänglich gemacht wird.
__stdcall ist notwendig, damit Parameter von rechts nach links übergeben werden und die Funktion den Stack aufräumt.

Durch diese Aktion wird jedoch eine weitere Namensergänzung eingefangen.
Deine exportierte Funktion sieht etwa so gemäß Depedency-Walker aus : _get_version@4(was Du natürlich selbst ermitteln mußt).


Zitat:
Pablo Yanez Trujillo postete
...Solltest du eine Funktion einbinden, deren Namen schon in VB gibt, kannst du den Namen ändern, indem du vor [i]Lib Alias "neuer Name der Funktion" hinzufügst.[/i]

Hier Falsch! Weil:
Dieser Funktionsname wird dann in der Visual-Basic-Deklaration als Aliasname angegeben.

Visual Basic:
Declare Sub get_version Lib "mylib.dll" Alias "_get_version@4" () As String


--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 25.08.2003 um 19:39 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.08.2003, 22:33 Uhr
Pablo
Supertux
(Operator)


Es gibt einige API Funktionen, bei denen es notwendig ist, Alias zu benutzen, andere nicht. Ich hab vielleicht den Fehler gemacht, dass ich Alias an der falschen Stelle geschrieben hab, weil ich seit so langer Zeit VB nicht mehr progg. und dann vergisst man die Reihenfolge.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.08.2003, 23:10 Uhr
Uwe
C/C++ Master
(Administrator)


Deswegen hab ich auch "Hier falsch" geschrieben(eigentlich Falsch ).
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.08.2003, 11:14 Uhr
~Micha
Gast


Hallo Uwe,

ich habe in mein C++ Programm die definition geändert
von:

Code:
__declspec(dllexport) char  * get_version(void)
{
.....
}


auf Definition NEU

Code:
extern "C" __declspec(dllexport) char  * __stdcall get_version(void)
{
..
..
}


gesetzt.
Der Compiler meldet einen Fehler "error C2059: Syntaxfehler : 'string'" er mag nicht das "C".
Hab ich es richtig verstanden oder muß ich auf eine andere Stelle diesen Eintrag mit "C" machen.

Danke Micha.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.08.2003, 12:05 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hallo,
nur die Prototypen so ausstatten!
Also


C++:
extern "C" __declspec(dllexport) char  * __stdcall get_version(void);
//...

char  * __stdcall get_version(void)
{
}


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
26.08.2003, 13:03 Uhr
~Micha
Gast


Leider klappt es nicht ich habe die Prototypen nur so ausgestattet aber trotzdem bekomme ich die Fehlermeldung : error C2059: Syntaxfehler : 'string'.

Wa skann es noch sein. Habe ich andere Einstellungen im meinem VC++ 6.0
Nur wenn ich "C" wegnehme kann ich ohne Fehlermeldung compilieren.

Hier nochmals der CODE:

C++:
/****************************************************************************/
/*  DLL                                                                     */
/****************************************************************************/
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

// Versionsangabe und Datum -------------------------------
#define VERSION_ABOUT "1.01"         //////////////////////
#define COMPILIERT    "26.08.2003"   //                  //
#define DATE          "August 2003"  //  VERSIONS-DATEN  //
#define ART_NR        "000000000"    //////////////////////
// --------------------------------------------------------

#ifdef BASEFCT
#define METH_DECL_LIC __declspec(dllexport)
#else
#define METH_DECL_LIC __declspec(dllimport)
#endif

extern  "C" METH_DECL_LIC char  * __stdcall get_version(void);

char * VersionsString;

// ---------------------------------------------------------
BOOL WINAPI DllMain(HINSTANCE hDllInst, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason) {
        case DLL_PROCESS_ATTACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    }
    return TRUE;
}

// -----------------------------------------------------------------
char  * __stdcall get_version(void)
{
   sprintf(VersionsString,"DLLName.dll; Version %s; %s", VERSION_ABOUT, COMPILIERT);
   strcpy(VersionsString,VersionsString);
   return VersionsString;
}



Danke nochmals für weitere Tipps.

Dieser Post wurde am 26.08.2003 um 13:39 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
26.08.2003, 13:53 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


sollte zwar nichts ausmachen aber lass mal das 2te leerzeichen nach extern raus, wer weiß ob der vc so kleinlich ist
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
26.08.2003, 18:28 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
@Flo
Nee... kann nicht der Fehler sein. So penibel ist der VC Compiler nicht.Hab zwar nicht die DllMain nachgebaut, aber der Rest läuft durch.
@micha
so wie Du das gepostet hast, ist die Aufrufkonvention ok. Deine Fehlermeldung kann ich mir nicht erklären, da das bei mir ohne Fehler kompilliert.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ Visual Basic 6.0 / VBA ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: