DLL laden

FBIagent

Erfahrenes Mitglied
Moin,

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

gotoxy.dll ensteht durch folgendes:
Code:
#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
Code:
#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
 
Zuletzt bearbeitet:
Evt. passt die Deklaration nicht. Probiere mal:
Code:
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.
 
Zuletzt bearbeitet:
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.
 
Mit
Code:
extren "C"
klappt es danke.

Ich habe mir gerade mal die .def Datei angeschaut mal sehen werde das nochmal ohne
Code:
extern "C"
probieren und den export namen der in dieser steht verwenden.

EDIT: Na dann hab ich es jetzt doch auch ohne das
Code:
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
Code:
extern "C"
benutzen wenn ich eine Klasse in der DLL implementiere?
 
Zuletzt bearbeitet:
Zurück