Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » einzelne Funktionen von zlib.dll importieren

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
24.02.2006, 22:12 Uhr
~Ron
Gast


Grundsätzlich kann ich z.B. die Funktion gzopen importieren. Jedoch gibt die Funktion einen Wert zurück der dem Typ gzFile entspricht. Dieser Typ ist bei mir jedoch undefiniert. Wie kann ich diesen Typ zusätzlich aus der dll importieren. Hier mein Code, der nicht funzt, wegen gzFile



typedef gzFile (*DLLFUNC)(const char *path, const char *mode);
DLLFUNC gzopen;


HINSTANCE handle = LoadLibrary("zlib.dll");

if (handle != NULL)
{

//typedef gzFile (*DLLFUNC)(const char *path, const char *mode);
DLLFUNC gzopen = (DLLFUNC)GetProcAddress(handle, "gzopen");

if (gzopen1)
{
gzFile gp;
gp = gzopen("zlib.gz", "rb");
if(!gp) return false;
}
}
FreeLibrary(handle);

Hier die Fkt in der zlib.h

typedef voidp gzFile;

ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.02.2006, 22:23 Uhr
xXx
Devil


Benutz mal codetags...

C++:
typedef gzFile (__stdcall*)(const char*, const char*);
typedef DWORD (__stdcall*gzopen)(const char*, const char*);
gzFile MygzFile = NULL;
gzopen MyGzOpen = NULL;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE prevInstance, char* cmd, int show)
{
    ::HINSTANCE__* dll = ::LoadLibrary ("zlib.dll");

    if (dll == NULL)
        return -1;

    MygzFile = reinterpret_cast<gzFile>(::GetProcAddress (dll, "gzFile"));
    MyGzOpen = reinterpret_cast<gzopen>(::GetProcAddress (dll, "gzFile"));

    if (MygzFile == NULL | MyGzOpen == NULL)
    {
        ::FreeLibrary(dll);
        return -1;
    }

    // Hier wären die dann geladen... wenn das funzen würde -.-
    ::MyGzOpen(...);

    ::FreeLibrary (dll);

    return 0;
}


Ich bezweifel das das geht
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.02.2006, 22:46 Uhr
~Ron
Gast


danke aber ich komm dennoch nicht weiter

fängt mit der Fehlermeldung an:

dpsnes\src\win\main.cpp(15) : error C2059: syntax error : '__stdcall'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.02.2006, 22:58 Uhr
xXx
Devil


arg.. sag doch das du ne Konsolen anwedung schreibst dann musst de natürlich das ändern... ich hab auch gesagt das das net funzt also :

C++:
typedef gzFile (__stdcall*)(const char*, const char*);
typedef DWORD (__stdcall*gzopen)(const char*, const char*);
gzFile MygzFile = NULL;
gzopen MyGzOpen = NULL;

int main(void)
{
    ::HINSTANCE__* dll = ::LoadLibrary ("zlib.dll");

    if (dll == NULL)
        return -1;

    MygzFile = reinterpret_cast<gzFile>(::GetProcAddress (dll, "gzFile"));
    MyGzOpen = reinterpret_cast<gzopen>(::GetProcAddress (dll, "gzFile"));

    if (MygzFile == NULL | MyGzOpen == NULL)
    {
        ::FreeLibrary(dll);
        return -1;
    }

    // Hier wären die dann geladen... wenn das funzen würde -.-
    ::MyGzOpen(...);

    ::FreeLibrary (dll);

    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.02.2006, 23:27 Uhr
~Ron
Gast


ich schreibe keine Konsolenanwendung

int __stdcall WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.02.2006, 23:38 Uhr
xXx
Devil


ja... was ist dein Problem? Wenn du ne MFC Function hast, dann musst de den teil jinter int main(void) halt in deine OnInitDialog(oder OnCreate) packen...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.02.2006, 15:11 Uhr
~Ron
Gast


danke bin nen Schritt weiter, bleiben 2 Probleme

1. gzdirect wird nicht aus der dll geladen obwohl laut zlib.h Datei vorhanden
ZEXTERN int ZEXPORT gzdirect OF((gzFile file));

2. gzread müsste die entpackte Datei in den buffer schreiben, bei mir durch Zeiger data gekennzeichnet. In data steht aber der Dateiname der zuentpackenden Datei "test.txt" und nicht deren Inhalt: test.gz entpackt zu test.txt.


typedef void *gzFile;
typedef void *voidp;

typedef gzFile (__stdcall *gzopen)(const char*, const char*);
typedef int (__stdcall *gzread)(gzFile, voidp, unsigned);
typedef int (__stdcall *gzdirect)(gzFile);

gzopen MyGzOpen = NULL;
gzread MyGzRead = NULL;
gzdirect MyGzDirect = NULL;


int __stdcall WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
{

::HINSTANCE__* dll = ::LoadLibrary ("zlib.dll");

if (dll == NULL) return -1;


MyGzOpen = reinterpret_cast<gzopen>(::GetProcAddress (dll, "gzopen"));
MyGzRead = reinterpret_cast<gzread>(::GetProcAddress (dll, "gzread"));
MyGzDirect = reinterpret_cast<gzdirect>(::GetProcAddress (dll, "gzdirect"));


/* if (MyGzOpen == NULL | MyGzRead==NULL | MyGzDirect ==NULL)
{
::FreeLibrary(dll);
return -1;
}*/ // gzdirect wird nicht geladen aus der dll


gzFile gp;
gp = MyGzOpen("test.gz", "rb");
if(!gp) return false;

uint8 *data;
data = (uint8*)malloc(50); // 50 ist nur zum Testen
memset(data, 0, 50);
if(gp)MyGzRead(gp, data, 50);

::FreeLibrary (dll);
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.02.2006, 15:19 Uhr
~Ron
Gast


Nachtrag:

die Fuktion gzread arbeitet, wenn kein gültiges gz -archiv vorliegt wie das übliche fread.

Das funzt auch. Öffne ich mit gzopen test.txt erhalte ich nach gzread den Inhalt der Datei test.txt.

Öffne ich hingegen test.gz, erhalte ich nach gzread den Namen der zu entpackenden Datei test.txt, nicht jedoch deren Inhalt. Kapier ich nicht
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
25.02.2006, 17:15 Uhr
xXx
Devil


hmm ich kenn die lib nicht.. guck dir doch einfach mit dependency walker(oder so ähnlich heißt der) die Funktionen an, die in der Dll sind...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
25.02.2006, 20:36 Uhr
~Ron
Gast


also die gzdirect Fkt. ist wirklich kein Bestandteil der zlib.dll. (mein Fehler) Diese Fkt ist nicht in der lib zur dll als Prototyp enthalten. Im Quellcode der zlib library ist sie jedoch definiert. Das heisst wenn ich die zlib als Quellcode in mein Projekt einbinde, kann ich sie nutzen. Genau so werde ich es machen.

Ne andere Möglichkeit hab ich schon versucht, nämlich die dll per lib un h Datei ins Projekt aufzunehmen. So hab ich direkt alle Fkts der zlib.dll zur Verfügung ohne aufwendige Initialisierung. Leider ist das Projekt, wenn die dll nicht vorhanden ist, nicht fuktionsfähig und das wäre Unsinn. Bei der Methode mit loadlibrary von oben, ist das Projekt wenigstens lauffähig, halt ohhe zlib support. Gut wenn ich eine Option finden würde die, lib u. dll statisch einzulinken, dann wäre die Abhängigkeit von der dll aufgehoben. Jedoch würde ich den Sinn einer dll zweckentfremden. Also verwende ich wohl am Besten die Verwendung des reinen Quellcodes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


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: