dll einbinden/lib not found

Übersicht BlitzBasic BlitzPlus

Neue Antwort erstellen

tix

Betreff: dll einbinden/lib not found

BeitragFr, Apr 11, 2008 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hab versucht eine dll einzubinden
ich habe sie in die userlibs kopiert und eine decls datei geschrieben
beide sind definitiv richtig

das kuriose sie hat schon mal funktioniert
und zwar auf arbeit
doch bei mir zuhause geht sie auf einmal nicht mehr

kennt jemand evtl das problem und hat ne erklärung dafür
  • Zuletzt bearbeitet von tix am Fr, Apr 11, 2008 18:32, insgesamt einmal bearbeitet
 

ChristianK

BeitragFr, Apr 11, 2008 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch wenn du dir sicher bist, dass DLL + Decls stimmen, wäre es gut, wenn du sie hier posten würdest, damit man weiss, worum es überhaupt geht. "Userlib not found" kann nämlich die verschiedensten Ursachen haben.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

tix

BeitragFr, Apr 11, 2008 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
die dll ist aber noch nicht fertig
es sollen noch mehr funktionen rein

Code: [AUSKLAPPEN]

.lib "system.dll"

setsyswin(x,y,d)
getsyswinx()
getsyswiny()
getsyswind()
setprohigh()
setpronormal()
getpro()
leftklick()
rightklick()
leftklickxy(x,y)
rightklickxy(x,y)


Code: [AUSKLAPPEN]

//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>

#pragma hdrstop
//---------------------------------------------------------------------------
//   Wichtiger Hinweis zur DLL-Speicherverwaltung, falls die DLL die statische
//   Version der Laufzeitbibliothek (RTL) verwendet:
//
//   Wenn die DLL Funktionen exportiert, die String-Objekte (oder Strukturen/
//   Klassen, die verschachtelte Strings enthalten) als Parameter oder Funktionsergebnisse übergibt,
//   muss die Bibliothek MEMMGR.LIB im DLL-Projekt und anderen Projekten,
//   die die DLL verwenden, vorhanden sein. Sie benötigen MEMMGR.LIB auch dann,
//   wenn andere Projekte, die die DLL verwenden, new- oder delete-Operationen
//   auf Klassen anwenden, die nicht von TObject abgeleitet sind und die aus der DLL exportiert
//   werden. Durch das Hinzufügen von MEMMGR.LIB wird die DLL und deren aufrufende EXEs
//   angewiesen, BORLNDMM.DLL als Speicherverwaltung zu benutzen. In diesem Fall
//   sollte die Datei BORLNDMM.DLL zusammen mit der DLL weitergegeben werden.
//
//   Um die Verwendung von BORLNDMM.DLL, zu vermeiden, sollten String-Informationen als "char *" oder
//   ShortString-Parameter weitergegeben werden.
//
//   Falls die DLL die dynamische Version der RTL verwendet, müssen Sie
//   MEMMGR.LIB nicht explizit angeben.
//---------------------------------------------------------------------------

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
   return 1;
}
//---------------------------------------------------------------------------


// Grafik anweisungen

extern "C" __declspec(dllexport) bool _stdcall setsyswin(int x,int y,int d)
{
DEVMODE sDevMode;
ZeroMemory(&sDevMode, sizeof(DEVMODE));
sDevMode.dmSize = sizeof(DEVMODE);
sDevMode.dmPelsWidth = x;
sDevMode.dmFields |= DM_PELSWIDTH;
sDevMode.dmPelsHeight = y;
sDevMode.dmFields |= DM_PELSHEIGHT;
sDevMode.dmBitsPerPel = d;
sDevMode.dmFields |= DM_BITSPERPEL;
LONG rVal = ChangeDisplaySettings(&sDevMode, CDS_UPDATEREGISTRY);
switch (rVal)
{
case DISP_CHANGE_SUCCESSFUL: return true; //The settings change was successful.
default:
return false;
}
}

extern "C" __declspec(dllexport) int _stdcall getsyswinx()
  {
  return GetSystemMetrics(SM_CXSCREEN);
  }

 extern "C" __declspec(dllexport) int _stdcall getsyswiny()
  {
  return GetSystemMetrics(SM_CYSCREEN);
  }

 extern "C" __declspec(dllexport) int _stdcall getsyswind()
  {
 return GetDeviceCaps(GetDC(GetDesktopWindow()),BITSPIXEL);
  }

//Process funktionen

extern "C" __declspec(dllexport) void setprohigh()
  {
  SetPriorityClass(GetCurrentProcess(), 128);
  }

extern "C" __declspec(dllexport) void _stdcall setpronormal()
  {
  SetPriorityClass(GetCurrentProcess(), 32);
  }

extern "C" __declspec(dllexport) int _stdcall getpro()
  {
  return GetPriorityClass(GetCurrentProcess());
  }


// maus steuerung

extern "C" __declspec(dllexport) void _stdcall leftklick()
  {
  mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
  mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
  }

extern "C" __declspec(dllexport) void _stdcall rightklick()
  {
  mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
  mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
  }

extern "C" __declspec(dllexport) void _stdcall leftklickxy(int x,int y)
  {
  mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE,x,y,0,0);
  mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
  mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
  }

extern "C" __declspec(dllexport) void _stdcall rightklickxy(int x,int y)
  {
  mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE,x,y,0,0);
  mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
  mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
  }

// ende

 

ChristianK

BeitragFr, Apr 11, 2008 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Funktionsnamen in der Decls-Datei stimmen nicht.
Bei der Methode, die du verwendet hast ( __declspec( dllexport ) + __stdcall ), werden die Funktionen nicht mit dem originalen Namen exportiert, sondern bekommen vorher einen Unterstrich und dahinter ein @, dem die Anzahl der als Argumente übergebenen Bytes folgt.

Aus "setsyswin" wird also "_setsyswin@12".
Damit du die Funktionen mit ihren richtigen Namen verwenden kannst, schreibst du einfach folgendes:

Code: [AUSKLAPPEN]
setsyswin%( x%, y%, d% ) : "_setsyswin@12"

Und noch zwei Sachen, die mir aufgefallen sind: es ist besser, wenn alle Funktionen den Rückgabetyp int ( oder ggf. float ), weil Blitz3D nur mit diesen umgehen kann. Bool hat bei VC zwar auch 4 Byte, bei manchen Compilern aber nur 1 Byte.

Und zweitens können alle Funktionen, die du verwendet hast, auch direkt in Blitz verwendet werden ( z.B. GetSystemMetrics ). Dafür braucht es keine eigene DLL.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group