# DLL laden



## FBIagent (6. März 2006)

Moin,

so ich bin es mal wieder mit einem kleinen Problem.
Erstmal der Code:

gotoxy.dll ensteht durch folgendes:

```
#include <windows.h>

bool APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
  return true;
}

__declspec(dllexport) void gotoxy(short x, short y)
{
	HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X=x-1;
	pos.Y=y-1;
	SetConsoleCursorPosition(hCon,pos);
}
```

main.cpp

```
#include <iostream>
#include <windows.h>

typedef void(_stdcall *consolePointerGotoXY)(short x,short y);
//HINSTANCE hDLL;
HMODULE hDLL;
consolePointerGotoXY gotoxy;


int main()
{
  hDLL = LoadLibrary("gotoxy.dll");

  if(hDLL!=NULL)
  {
    gotoxy = (consolePointerGotoXY)GetProcAddress(hDLL,"gotoxy");

    if(!gotoxy)
    {
      std::cout << "Error: function!";
      FreeLibrary(hDLL);
      std::cin.get();
      return 1;
    }
    else
    {
      gotoxy(10,10);
    }
  }
  else
  {
    std::cout << "Error: dll!";
    std::cin.get();
    return 1;
  }

  system("Pause");
  return 0;
}
```

Jetzt bekomme ich immer meine kleine Meldung "Error: function!".
libgotoxy.a ist auch gelinkt.

Keine Ahnung warum. Vieleicht könnt ihr mir weiter helfen.

THX im Vorraus
MFG FBIagent


----------



## MCoder (7. März 2006)

Evt. passt die Deklaration nicht. Probiere mal:

```
typedef void (WINAPI *consolePointerGotoXY) (short, short);
```

Gruß
MCoder

/edit
Passen die DLL und die EXE auch zusammen? Die Debug-Version der EXE kann z.B. keine Release-Version der DLL verwenden und umgekehrt.


----------



## Endurion (7. März 2006)

Mach da mal ein extern "C" vor der Deklaration in der DLL hin:

extern "C" __declspec(dllexport) void gotoxy(short x, short y);

Danach die Funktion:

__declspec(dllexport) void gotoxy(short x, short y)
{
  ..
}


Bei C++ wird bei diversen Compilern der Exportname der Funktion verunstaltet und GetProcAddress findet die Funktion nicht. Das extern "C" verhindert das.


----------



## FBIagent (7. März 2006)

Mit

```
extren "C"
```
klappt es danke.

Ich habe mir gerade mal die .def Datei angeschaut mal sehen werde das nochmal ohne

```
extern "C"
```
probieren und den export namen der in dieser steht verwenden.

EDIT: Na dann hab ich es jetzt doch auch ohne das

```
extern "C"
```
hinbekommen. Nur das ich dann nicht gotoxy angeben muss sondern _Z6gotoxyss. Sieht etwas komisch aus
wenn ihr mich fragt. Kann ich denn auch

```
extern "C"
```
benutzen wenn ich eine Klasse in der DLL implementiere?


----------

