Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Bitte Hilfe bei Dll

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 ]
000
21.06.2003, 00:18 Uhr
CPlusPlus



Ich schreibe meine Thread hier noch mal hin weil irgend einer meinen andern thread ins C#/NET. Framework Forum verschoben hat da wo es garnicht hin gehört.

Ich habe folgendes problem. Ich habe mir eine DLL geschrieben und dazu ein Programm, das diese öffnet und die darin definierte Funktion verwenden kann.
Nur habe ich ein Problem eine Zeiger auf die Funktion zu bekommen.
Hier mal der Code:

Code:
#include <windows.h>
#include <iostream>

BOOL __stdcall DllMain(HMODULE hInst,
                       DWORD dwMessage,
                       LPVOID pvReserved)
{
    return TRUE;
}

__declspec(dllexport) void Summe(void)
{
    std::cout << "Summe";
}




Code:
#include <windows.h>
#include <iostream>

typedef void (__stdcall* LPAUSGABE)(void);

int main()
{
    HMODULE hDll;
    LPAUSGABE lpAusgabe;
    hDll = LoadLibrary("C_Projekt.dll");
    if (hDll != NULL)
    {
        lpAusgabe = (LPAUSGABE)GetProcAddress(hDll, "Summe");

        lpAusgabe();

        FreeLibrary(hDll);
    }
    return 0;
}



Die Fehler meldung ist eine Access Violatio beim Aufruf von

Code:
lpAusgabe();


Der Fehler liegt also in

Code:
lpAusgabe = (LPAUSGABE)GetProcAddress(hDll, "Summe");



Nur leider weis ich nicht was ich falsch machen. Ich würd mich freuen wenn mir einer helfen könnte, dann wäre ich schon mal weiter.
Vielen dank schon mal für die mühe.

Markus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.06.2003, 00:46 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
CPlusPlus postete
Ich schreibe meine Thread hier noch mal hin weil irgend einer meinen andern thread ins C#/NET. Framework Forum verschoben hat da wo es garnicht hin gehört.


Nur so als Anmerkung: ich hatte diesen Thread verschoben, weil Du ihn in das ANSI C/C++ Forum gepostet hattest, wo er garnicht hin gehört. Daß das nichts mit .NET zu tun hatte, konnte ich nicht riechen, weil ich Windows nicht so dolle kenne. Ich habe jetzt den Thread in .NET Forum geschlossen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.06.2003, 00:50 Uhr
CPlusPlus



Ok jeder macht mal fehler

PS: Mein Problem besteht immer noch

Gruß Markus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.06.2003, 00:57 Uhr
virtual
Sexiest Bit alive
(Operator)


Also kenn mich wie gesagt nicht ganz so dolle mit Windows aus, aber ich möchte meinen Popo drauf verwetten, daß es am cout liegt. Laß doch einfach mal das cout draußen und laß das Summe irgendwas zurückgeben und dann ausgeben.
Klar, es kann auch das GetProcAddress selbst sein, das läßt sich aber leicht rausfinden, weil das einen NULL Pointer zurück liefert, wenn ihm was nicht gefällt. Deshalb würde ich einfach mal vor dem Aufruf von lpAusgabe gucken, ob lpAusgabe NULL ist.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.06.2003, 01:20 Uhr
CPlusPlus



Also am Cout denk ih nicht das es liegt ich habe vohrer eine funktion verwendet die zwei parameter über nimmt und deren summe zurück gibt.

JA lpAusgabe ist NULL das ich ja auch der fehler LEIDER
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.06.2003, 07:46 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


schreib mal in deiner DLL als export deiner funktion folgendes:


C++:
[b]extern "C"[/b] __declspec(dllexport) void Summe(void)
{
    std::cout << "Summe";
}


da er sonst nicht "Summe" als name der funktion hat sondern z.b Summe@34435 (<- war etz nur mal so frei erfunden der Name, nicht das einer meckert :P)
mit extern "C" heisst deine Funktion in der Dll auch wirklich Summe!

in deinem Programm würde ich erstmal überprüfen ob er die Funktion laden konnte:


C++:
lpAusgabe = (LPAUSGABE)GetProcAddress(hDll, "Summe");
[b]if(lpAusgabe)[/b]
  lpAusgabe();
else
  std::cout << "Kann DLL C_Projekt.dll nicht laden";


sonst bekommst du die Access Violation beim Versuch die nicht geladene Funktion aufzurufen!
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.06.2003, 14:45 Uhr
CPlusPlus



Ok vilen dank es hat geklappt aber was genau macht das eytern "C" und wie muss ich vorgehen wenn ich eine Klasse meiner DLL hinzu definiere muss ich die auch in extern "c" { } setzen??

Gruß
Markus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.06.2003, 15:02 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ich würde immer alles in dlls mit extern "C" exportieren, dann kann man die funktionsnamen eben einfacher ermitteln
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.06.2003, 15:20 Uhr
CPlusPlus



hm ok ich hab das jetzt mal mit einer Klasse probiert aber irgendwie funktioniert das nicht.

Code:
extern "C"
{
    __declspec(dllexport) void Summe(void);

    class __declspec(dllexport) CTest
    {
        public:
            void Ausgabe(void);
    };
}



Code:
#include <windows.h>
#include <iostream>
#include "main.h"


BOOL __stdcall DllMain(HMODULE hInst,
                       DWORD dwMessage,
                       LPVOID pvReserved)
{
    return TRUE;
}

__declspec(dllexport) void Summe(void)
{
    std::cout << "Summe";
}

void CTest::Ausgabe(void)
{
    std::cout << "Ausgabe";
}



Code:
#include <windows.h>
#include <iostream>
#include "main.h"

typedef void (__stdcall* LPAUSGABE)(void);

int main()
{
    HMODULE hDll;
    LPAUSGABE lpSumme, lpAusgabe;
    hDll = LoadLibrary("C_Projekt.dll");
    if (hDll != NULL)
    {
        lpSumme = (LPAUSGABE)GetProcAddress(hDll, "Summe");
        if(lpSumme)
        {
            lpSumme();
        }
        lpAusgabe = (LPAUSGABE)GetProcAddress(hDll, "CTest");
        if(lpAusgabe)
        {
            lpAusgabe();
        }
        FreeLibrary(hDll);
    }
    return 0;
}


Ich weis ich kann nerven aber wenn ich das mit den Klasen weis dann dürft ich eigentlich keine probleme mehr haben

MArkus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.06.2003, 18:14 Uhr
CPlusPlus



kann mir keiner helfen? Also die Klassen definition müßte eigentlich richtig sein so wie ich es der msdn entnehmen kann.
Aber leider finde ich in der msdn nicht über die Aufrufe eine Classe und deren Methoden aus einer DLL.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


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: