Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Problem bei der erstellung einer DLL mit einer class

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 <
000
24.04.2008, 11:32 Uhr
Lev1332



Hey.


Ich wollte meine classe in eine DLL auslagern.
Hab auch etwas im Netz gefunden und dachte es wäre sehr einfach.
Da hab ich wohl falsch gedacht.

Hier ist mein DLL Code.

main.c

Code:
#include <windows.h>

#include "InDLL.h"

#ifdef __cplusplus    // If used by C++ code,
extern "C" {          // we need to export the C interface
#endif


// a sample exported function
void CLASSINDLL_CLASS_DECL __cdecl msgbox(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}

#include <stdio.h>
#include <string>

using namespace std;

// Ein File Objekt wird erzeugt das zum schreiben des Log-Files verwendet wird.
FILE * pLogFile;

class CLASSINDLL_CLASS_DECL log_creator
{
public:

    log_creator()
    {
        // Classen-Funktion zum öffnen des Log-Files wird aufgerufen
        open_log();
    }

    ~log_creator()
    {
        // Classen-Funktion zum Schließen des Log-Files wird aufgerufen.
        close_log();
    }

    void log(char* ctext)
    {
        /*
        Ein einfacher Text wird hier mit Datum und Uhrzeit in den Log geschrieben.

        Als übergabe wert kann nur ein einfacher char Variablen Text verwendet werden.
        Hier kann der Text einfach direkt eingegeben werden.
        */
        char buffer [80];
        time_t rawtime;
        time ( &rawtime );
        struct tm * timeinfo;

        timeinfo = localtime ( &rawtime );
        strftime (buffer,80,"%c",timeinfo);
        fprintf (pLogFile, "%s\t %s\n",buffer,ctext);
    }

    void log(string &ctext)
    {
        /*
        Ein Text wird mit Datum und Uhrzeit in den Log geschrieben.

        Hier wird eine String Variable verwendet die Vorher mit verschiedenen Programm
        Variablen gefülllt worden ist. Die Variable muss zuvor im Programm erzeugt und
        gefüllt worden sein, und kann nur als Variable Übergeben werden.
        */
        char buffer[80]="";
        char buffer2[1024]="";
        int length;
        time_t rawtime;
        time ( &rawtime );
        struct tm * timeinfo;

        timeinfo = localtime ( &rawtime );
        strftime (buffer,80,"%c",timeinfo);
        length=ctext.copy(buffer2,ctext.size());
        buffer2[length]='\0';
        fprintf (pLogFile, "%s\t %s\n",buffer,buffer2);
    }

protected:

    void open_log(char* cfile="log.txt")
    {
        /*
        Log-File wird geöffnet.
        Wird keine spezielle Datei angegeben wird automatisch "log.txt" verwendet.
        Anschließend wir eine zeile in den Log geschrieben der den Anfang des aktuellen
        Log markiert.
        */
        pLogFile = fopen (cfile,"a");
        fprintf (pLogFile,"--- Neuer Log!!! ---\n\n");
    }

    void close_log(void)
    {
        /*
        Log-File wird geschlossen.
        Vorher wird noch eine Abschlußzeile in das Log geschrieben, die das Ende des
        aktuellen Log markiert, und abstandszeilen für den nächsten Log geschaffen.
        */
        fprintf (pLogFile,"\n--- Log Ende!!! ---\n\n\n");
        fclose (pLogFile);
    }

};

#ifdef __cplusplus
}
#endif



InDLL.h

Code:
// InDLL.h: interface for the CInDLL class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_INDLL_H__179A79AA_4C1A_11D2_B67C_006008AC62A9__INCLUDED_)
#define AFX_INDLL_H__179A79AA_4C1A_11D2_B67C_006008AC62A9__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#include "ClassInDLL.h"


#include <string.h>

class CLASSINDLL_CLASS_DECL log_creator
{
public:
    log_creator();
    virtual ~log_creator();

    void log(char* ctext);
    void log(string &ctext);

protected:

    void open_log(char* cfile="log.txt");
    void close_log(void);

};


#endif // !defined(AFX_INDLL_H__179A79AA_4C1A_11D2_B67C_006008AC62A9__INCLUDED_)



ClassInDLL.h

Code:

#ifndef ClassInDLL_H
#define ClassInDLL_H

#ifdef BUILD_DLL
    #define CLASSINDLL_CLASS_DECL __declspec(dllexport)
#else
    #define CLASSINDLL_CLASS_DECL       __declspec(dllimport)
#endif

#endif // ClassInDLL_H




Error:
InDLL.h line 16 syntax error befor "log_creator"

Genau so mehr oder weniger war es im Netz beschrieben. Hab es halt nur an meine klasse angepasst.

Ich benutze MinGW mit Code::Blocks.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.04.2008, 12:40 Uhr
RHBaum




Zitat:

Genau so mehr oder weniger war es im Netz beschrieben.




C++:
#ifdef __cplusplus    // If used by C++ code,
extern "C" {          // we need to export the C interface
#endif


Seit wann kann C was mit klassen anfangen ?

Dieses konstrukt oben macht man, um Funktionen an die C Standard Syntax anzugleichen ... genau so wie das stdcall die Standard ausrichtung der funktionsparameter zu erzwingen.
Das koennen/erwarten dann meist alle Tools, die auch mit Standard C dlls umgehen koennen. (Interpretersprachen, andere Programmiersprachen, C++ von unterschiedlichen compilern).

Willst du klassen exportieren, verlaesst du diese Schiene ....
das 'extern "C"' ist dann wirklich falsch !!!

Das namemergling von methoden ist eh ned standardisiert , also wird deine DLL nur kompatibel zu programmen werden, die mitm selben compiler uebersetzt wurden. selbst unterschiedliche compilerversionen machen dann teilweisse probleme .

ansonsten musst noch aufpassen, das deine "Klassensymbole" ordentlich exportiert werden ... weiss ned ob der gcc das mit dem __declspec allein kann ...

Und wichtig :
objecte duerfen ned ueber dll grenzen hinweg zerstoert werden. Sprich, new und das zugehoerige delete muessen im selben binary landen ... also ned in der exe new, und in der dll das delete ...


C++:
using namespace std;

im Header ? aua ...
lieber ganz weglassen (nich mal in ner cpp nutzen ... aber ist geschmackssache)

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.04.2008, 12:51 Uhr
Lev1332



Das extern c war auch eigentlich nur für die Testfunction gedacht.

Das problem wird schon viel früher ausgelöst.

Hier nochmal wo:


Code:
#define EXPORT __declspec(dllexport)

class EXPORT log_creator
{
public:
    log_creator();
    virtual ~log_creator();

    void log(char* ctext);
    void log(string &ctext);

protected:

    void open_log(char* cfile="log.txt");
    void close_log(void);

}



Der fehler wird bei der Klasse ausgelöst, und ich weis nicht warum!!!

Fehler: syntax error befor "log_creator"

Hab es diesmal etwas verkürzt.

Marco
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.04.2008, 15:37 Uhr
Kest
saint


Hi!

Liegt wohl daran, dass du 2 Defenitionen derselben Klasse hast: in >main.c< und >InDLL.h<.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.04.2008, 15:58 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


und vor allem kompiliert er meist bei .c automatisch als C-Code, was auch nochmals probleme machen dürfte wenn du da C++ verwendest. also als .cc oder .cpp abspeichern.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.04.2008, 13:00 Uhr
Lev1332



Unglaublich, aber war!!!!


es war die dateierweiterung von main.c die den fehler ausgelöst hatte.
habe einfach die datei umbenannt in main.cpp und schon ging es!

echt nervig, da ich den quelltext mit der vorlage erstellt hatt.

THX FloSoft und allen anderen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: