Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

$splash$

Treue Seele

  • »$splash$« ist der Autor dieses Themas

Beiträge: 172

Wohnort: BW

Beruf: Schüler

  • Private Nachricht senden

1

11.09.2005, 11:30

DLL Problem

C-/C++-Quelltext

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
30
31
32
33
#include <iostream>
#include <windows.h>

using namespace std;


int main ()
{
    // DLL Laden 

    HMODULE hDLL = LoadLibrary("test.dll");
    if(!hDLL)
    {
        // Fehler 

        MessageBox(NULL, "DLL nicht gefunden!!!", "Fehler", MB_OK | MB_ICONHAND);
        return 1;
    }
    
    // Die Funktion rufen 

    BOOL(__stdcall* pFunc)(LPCSTR, UINT);
    pFunc = (BOOL (__stdcall*)(LPCSTR, UINT))(GetProcAddress(hDLL, "TestFunc"));
    if(!pFunc)
    {
        MessageBox(NULL, "Funktion nicht vorhanden", "Fehler" , MB_OK | MB_ICONHAND);
    }

    // Die Funktion ausführen 

    pFunc("Hallo Welt");
    
    // DLL Freigeben 

    FreeLibrary(hDLL);

    return 0;
}


Wenn ich das durch den compieler jag grig ich folgenden fehler:

Quellcode

1
2
3
4
5
6
7
8
Temporäre Dateien und Ausgabedateien für "DLL_Test - Win32 Debug" werden gelöscht.
--------------------Konfiguration: DLL_Test - Win32 Debug--------------------
Kompilierung läuft...
DLL_Test.cpp
c:\programme\microsoft visual studio\myprojects\dll_test\dll_test.cpp(27) : error C2198: 'int (__stdcall *)(const char *,unsigned int)' : too few actual parameters
Fehler beim Ausführen von cl.exe.

DLL_Test.exe - 1 Fehler, 0 Warnung(en)


kann mir jemand sagen was ich falsch mache ???
???

Hier noch der code von der DLL:

C-/C++-Quelltext

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
30
31
32
33
#include <iostream>
#include <windows.h>

using namespace std;


// Hauptfunktion der DLL

BOOL APIENTRY DLLMain(HMODULE hModule,
                      DWORD   dwReasonForCall,
                      LPVOID  pvReserved)
{
    switch(dwReasonForCall)
    {
    case DLL_PROCESS_ATTACH:
        // Hier z.B.: LogBuch eintrag

        break;

    case DLL_PROCESS_DETACH:
        // Hier z.B.: LogBuch eintrag

        break;
    }

    return TRUE;

}

extern "C" 
{
    __declspec(dllexport) void TestFunc (char Text)
    {
        cout << Text << endl;
    }
}

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

2

11.09.2005, 11:42

Ich versteh nicht warum bei dir pFunc den Typ

C-/C++-Quelltext

1
BOOL (__stdcall* pFunc)(LPCSTR, UINT)

bekommt, wenn die Funktion in der Dll so aussieht

C-/C++-Quelltext

1
void TestFunc(char Text)


Der Funktionszeiger-Typ passt nicht ganz zur Signatur von TestFunc :) würde ich jetzt auf die Schnelle mal sagen.

mfg Philipp

$splash$

Treue Seele

  • »$splash$« ist der Autor dieses Themas

Beiträge: 172

Wohnort: BW

Beruf: Schüler

  • Private Nachricht senden

3

11.09.2005, 11:46

ne das müsste passen weil ich ja über GetProcAddress
pFunc deklariere, oder ???

C-/C++-Quelltext

1
2
BOOL(__stdcall* pFunc)(LPCSTR, UINT);
    pFunc = (BOOL (__stdcall*)(LPCSTR, UINT))(GetProcAddress(hDLL, "TestFunc")); 

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

11.09.2005, 11:49

der Funktionszeiger muss mit dem Prototypen übereinstimmen...
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

11.09.2005, 11:50

Du deklarierst die Funktion so, dass sie zwei Parameter erwartet.
Beim Aufruf übergibst Du aber nur einen.

$splash$

Treue Seele

  • »$splash$« ist der Autor dieses Themas

Beiträge: 172

Wohnort: BW

Beruf: Schüler

  • Private Nachricht senden

6

11.09.2005, 11:52

ok ich probiers mal

thx

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

11.09.2005, 11:53

ich denke der parameter Text sollte vom typ char* sein.

versuchs mal so in der art:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//dll


void __stdcall TestFunc(char* Text)
{
    MessageBox( 0, Text, "TestFunc", MB_OK );
}

//anwendung


typedef void (__stdcall *PFUNC) (char*);
.
.
.
PFUNC pFunc = (PFUNC) GetProcAddress(hDLL, "TestFunc");
.
.
.

$splash$

Treue Seele

  • »$splash$« ist der Autor dieses Themas

Beiträge: 172

Wohnort: BW

Beruf: Schüler

  • Private Nachricht senden

8

11.09.2005, 12:19

ok es funct jetzt aber nur in release modus
im debug bekomm ich den fehler:

(Link)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

11.09.2005, 12:53

Zitat von »"MSVC++"«

...This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.


no comment

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

11.09.2005, 12:56

sowohl die funktion in der dll als auch der funktionszeiger müssen die selbe aufrufkonvention verwenden. also z.b. beide __stdcall.
MSVC++ verwendet, falls nicht anders angegeben, per default aber __cdecl.
vermutlich gibts da einen konflikt in deinem code, wie die fehlermeldung ja schon sagt.

Werbeanzeige