Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Funktion aus fremder .dll aufrufen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
minispect
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.05.2012
Beiträge: 6
Beitrag minispect Mitglied 13:15:42 14.05.2012   Titel:   Funktion aus fremder .dll aufrufen            Zitieren

Hallo!

Ich habe eine "fremde" .dll inklusive .h und .lib-Datei, aus der ich gerne eine Funktion aufrufen würde. Benutze Dev-C++ und habe erstmal die .h-Datei zu meinem Projekt und auch die .lib unter "Linker" hinzugefügt.

Habe nun folgendes geschrieben, um die Funktion "TwGetDllVersion" aufzurufen:

C++:
1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
extern "C" __declspec(dllimport) double TwGetDllVersion(void);
 
int main(void){
double result = TwGetDllVersion();
printf ("DLL hat Version ", result);
return 0;
}


Kompilieren funktioniert, beim Ausführen kommt "_.exe hat ein Problem festgestellt und muss beendet werden."

Was mache ich falsch? Bitte nicht steinigen, dass ich kein C++ kann, ich will nur die Funktion aufrufen und kein C++-Profi werden.

Beste Grüße
minispect
pumuckl
Moderator

Benutzerprofil
Anmeldungsdatum: 21.06.2005
Beiträge: 7326
Beitrag pumuckl Moderator 13:20:33 14.05.2012   Titel:   Re: Funktion aus fremder .dll aufrufen            Zitieren

minispect schrieb:
Was mache ich falsch?


erster Fehler: Du benutzt keinen Debugger, um herauszufinden was schief läuft.
zweiter Fehler: Du benutzt printf falsch.
dritter fehler: Du benutzt printf.*

___________________
* Ist nicht grundsätzlich ein Fehler, aber als Anfänger darf man sich sehr gerne erstmal auf die typsichere Variante mit Streams verlassen. printf kommt dann später, wenn man die Performance braucht. Ich will jetzt hier keine OT-Diskussion lostreten, die schon zigmal geführt wurde.

_________________
Du brauchst Hilfe? - Forenregeln. Den richtigen Code posten - machs uns einfacher dir zu helfen
Don't feed the Help Vampires!
minispect
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.05.2012
Beiträge: 6
Beitrag minispect Mitglied 13:42:31 14.05.2012   Titel:   Re: Funktion aus fremder .dll aufrufen            Zitieren

pumuckl schrieb:
erster Fehler: Du benutzt keinen Debugger, um herauszufinden was schief läuft.

Wenn ich den Debugger einschalte kommt ein Warning:
"An Access Violation (Segmentation Fault) raised in your program."

pumuckl schrieb:
zweiter Fehler: Du benutzt printf falsch.

Wäre
C++:
printf("Version ist: %.6f\n", result);

richtig?

Vielen Dank schon mal!


Zuletzt bearbeitet von minispect am 13:42:54 14.05.2012, insgesamt 1-mal bearbeitet
berniebutt
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.11.2007
Beiträge: 2609
Beitrag berniebutt Mitglied 14:14:52 14.05.2012   Titel:              Zitieren

Wenn du keinen Debugger benutzen möchtest, geht das mit mit Testausdrucken während des Programmlaufs auch. Noch besser ist ein Logfile "test.txt" geeignet. Einen solchen Logfile kann man sich bequem im Editor ansehen.

Nun zu pumuckls Vorschlag:
C++:
cout << "testgroesse   " << testgroesse << endl; // Typ der Ausgabe ist egal!

_________________
http://berniebutt.npage.de
pumuckl
Moderator

Benutzerprofil
Anmeldungsdatum: 21.06.2005
Beiträge: 7326
Beitrag pumuckl Moderator 14:23:22 14.05.2012   Titel:   Re: Funktion aus fremder .dll aufrufen            Zitieren

minispect schrieb:
Wenn ich den Debugger einschalte kommt ein Warning:
"An Access Violation (Segmentation Fault) raised in your program."


Jetzt musst du nurnoch rausfinden wo der Zugriffsfehler passiert, dann hast dus :)

_________________
Du brauchst Hilfe? - Forenregeln. Den richtigen Code posten - machs uns einfacher dir zu helfen
Don't feed the Help Vampires!
minispect
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.05.2012
Beiträge: 6
Beitrag minispect Mitglied 15:21:27 14.05.2012   Titel:              Zitieren

so, ich habe fprint jetzt durch berniebutts vorschlag ersetzt und den Debugger laufen lassen:

Die Access Violation tritt bei
C++:
double result = TwGetDllVersion();

auf.
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16258
Beitrag hustbaer Mitglied 19:16:16 14.05.2012   Titel:              Zitieren

Bist du sicher dass der Prototype passt?

Und (nur weil ich neugierig bin): steht das Tw vielleicht für TouchWare?

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
minispect
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.05.2012
Beiträge: 6
Beitrag minispect Mitglied 19:50:01 14.05.2012   Titel:              Zitieren

hustbaer schrieb:
Bist du sicher dass der Prototype passt?

nein, nicht 100-prozentig. Hab das so aus der Header-Datei übernommen. Da steht:
TW_DAQ_API double TwGetDllVersion(void);
//returns the DLL version

hustbaer schrieb:
Und (nur weil ich neugierig bin): steht das Tw vielleicht für TouchWare?

Nein, Tw ist die Abkürzung der Firma, von der die dll stammt.
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16258
Beitrag hustbaer Mitglied 22:27:01 14.05.2012   Titel:              Zitieren

Erm. Wieso verwendest du nicht gleich das Original-Header-File?

Ansonsten... guck mal als was TW_DAQ_API definiert ist.
Vielleicht ist da noch ein __stdcall oder so mit drinnen?

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
314159265358979
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.03.2010
Beiträge: 4658
Beitrag 314159265358979 Mitglied 22:31:34 14.05.2012   Titel:              Zitieren

Ist es nicht unter Windows so, dass Funktionen in DLLs immer als __stdcall definiert sein müssen?
Swordfish
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.03.2005
Beiträge: 4344
Beitrag Swordfish Mitglied 01:05:01 15.05.2012   Titel:              Zitieren

njet.
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16258
Beitrag hustbaer Mitglied 03:10:54 15.05.2012   Titel:              Zitieren

314159265358979 schrieb:
Ist es nicht unter Windows so, dass Funktionen in DLLs immer als __stdcall definiert sein müssen?

Ist so Usus, aber Muss ist gar nix.
Kannst auch __cdecl oder __fastcall machen oder __super_new_calling_convention_that_only_my_compiler_supports oder was auch immer.
Und natürlich __thiscall, hätte ich bald vergessen.

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
minispect
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.05.2012
Beiträge: 6
Beitrag minispect Mitglied 11:48:54 15.05.2012   Titel:              Zitieren

Hallo!

Ich hab jetzt DependencyWalker benutzt und festgestellt, dass die Funktionen in der dll mit einem Unterstrich anfangen :o)

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <TofDaqDll.h>
#include <string>
 
using namespace std;
 
typedef double (_stdcall *FNPTR)(void);
 
int main()
{
    HINSTANCE hinstLibrary = LoadLibrary("TofDaqDll.dll");
    FNPTR pFn;
    if (!hinstLibrary) {
              cout << "LoadLibrary failed: " << GetLastError() << endl;
              return 1;
              }
 pFn=(FNPTR)GetProcAddress(hinstLibrary, "_TwGetDllVersion");
 if (!pFn) {
            cout << "GetProcAddress failed: " << GetLastError()  << endl;
            return 1;  
            }
            double result = pFn();
            cout << result << endl;
            FreeLibrary(hinstLibrary);
system("PAUSE");
return 0;
}


Das funktioniert soweit! :) Vielen Dank für Eure Hilfe!

Die anderen Funktionen der dll haben eine Rückgabevariable "TwRetVal". Wenn ich so eine Funktion aufrufe, bleibt das Programm beim Ausführen stehen. Wie gehe ich richtig mit diesem TwRetVal um?
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16258
Beitrag hustbaer Mitglied 12:50:23 15.05.2012   Titel:              Zitieren

Dazu müsste man nun wissen was TwRetVal ist, nen?

BTW: du musst auch nix dynamisch laden, mach einfach so
C++:
// extern "C" __declspec(dllimport) double TwGetDllVersion(void);
extern "C" __declspec(dllimport) double __stdcall TwGetDllVersion(void);

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
minispect
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.05.2012
Beiträge: 6
Beitrag minispect Mitglied 13:49:36 15.05.2012   Titel:              Zitieren

darüber schweigt leider die dll-Beschreibung.

zum Befehl
TW_DAQ_API TwRetVal TwStartAcquisiton(void);
steht z.B.

Return value type: TwRetVal

Value kann z.B. TwAcquisitonActive, TwTimeout, TwSuccess, TwError sein.
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 16258
Beitrag hustbaer Mitglied 18:54:44 15.05.2012   Titel:              Zitieren

Hast du ein Header-File zu der DLL?
Ja?
Dann steht da drin was TwRetVal für nen Typ hat.

Ich meine, irgendwoher musst du doch auch wissen was TwAcquisitonActive, TwTimeout, TwSuccess, TwError etc. sein sollen. Das werden ja wohl Symbolische Konstanten sein (=Zahlen), aber welcher Name für welche Zahl steht kannst du ja schwer erraten.

Und dort wo du die Zahlen zu den Namen findest, wirst du wohl auch finden was TwRetVal für ein Typ ist.

Und im Zweifelsfall halt int, nen?

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
c++.de :: C++ (auch C++0x und C++11) ::  Funktion aus fremder .dll aufrufen   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.