C++ Dll gebruiken in een programma

Status
Niet open voor verdere reacties.

sander the man

Gebruiker
Lid geworden
7 jun 2007
Berichten
94
Hoe gebruik je een dll in een C++ programma?

de dll returnt ALLEEN maar de volgende dingen: char*, double meer niet.

maar hoe gebruik ik zo een dll?
 
ik heb al gezocht op dit forum maar vond niks.... wat jij beschreef was de moeilijke manier van het gebruiken er is ook iets dat je de dll ook als een .lib kan compilen en dan als linker toevoegd en dan ook de .h files en dat je dan ook de functies kan gebruiken...

ik heb daarmee geexperimenteerd maar niet echt gelukt want het lukte me al niet om het naar een .lib te compilen..... ik gebruik codeblocks en het is nu een Dynamic-link library project en dat moet het ook zijn volgens mij maar ik kom er niet uit hoe je hem moet compilen zodat er ook een .lib komt ik heb gegoogled en vond iets over een .def maar verder niet echt heldere uitleg hoe je dat moet doen met code blocks..... als ik het compile komt er wel een .a bestand uit dat is ook een library maar niet de goede ofzo......

en verder die dll bestaat uit meerdere .h files moet ik die allemaal toevoegen?

ik heb het over deze dll: klikje!

edit: ook heb ik even verder gekeken naar de loadlibary, getprocadress functies maar kom er toch neit helemaal uit... zou iemand dat mischien kunnen uitleggen? ik denk dat het nu ongeveer zo werkt:

HINSTANCE hinstLib; //declare hinstlib
MYPROC ProcAdd; //declare ProcAdd

hinstLib = Loadlibrary("39DLL.dll"); //laad de 39dll
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts"); //1e argument de dll module (39dll) 2e argument is de functie naam zoals je hem in de dll hebt geschreven.
als dat allemaal lukt kan je gewoon de functie myPuts(argumenten); gebruiken?
 
Laatst bewerkt:
ik gebruik voor mijn gameengine een static library, in visual c++ 2008 EE kun je dit gewoon kiezen als configuratie type van het project.
iig je krijgt dan een .lib file die ik zo aan m'n game toe voeg

#pragma comment( lib, "../EchoEngine/Debug/EchoEngine.lib" )

en dan heb ik ook een headerfile gemaakt voor wat ik vrij wil geven uit de lib en die voeg ik zo toe

#include "../EchoEngine/EngineHeaders.h"

erg gemakkelijk allemaal dus in ms visual c++
 
het probleem is meer... dat ik die dll niet gemaakt hebt en ik nog niet zo goed ben ik in C++ en je ik weet het ik begin gelijk veel te moeilijk met dll`s maar anders krijg ik het probleem dat ik te weinig intresse heb.... want met deze dll wil ik een soort server programma maken voor een game.

en het probleem was: dat als ik het met visual C++ 2008 express edition open en dan zonder iets te wijzigen compile geeft hij al een hoop errors.... terwijl die maker express een .sln en .vsproj erbij heeft gestopt om het hiermee te openen maar het werkt niet.....


maar stel het lukt me om het te compilen naar een .lib hoe maak ik dan zo een .h file?

en het enigste wat ik dan hoef te doen is: mijn server programma project te linken aan die .lib en die .h file toevoegen en ik kan de functies gebruiken?

edit: ik heb ff een tut gezocht en heb nu een voorbeeldje van het maken van zo een .h file:
Code:
#ifndef _DLL_TUTORIAL_H_ //wat doet dit?
#define _DLL_TUTORIAL_H_ //wat doet dit?
#include <iostream>

#if defined DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif

extern "C"
{
   DECLDIR int Add( int a, int b ); //zeg dat functie add mag worden gebruikt
   DECLDIR void Function( void ); //zeg dat functie Function mag worden gebruik
   //dus stel ik heb nog een functie die getmessage heet (en char* returnt) voeg ik hem zo toe:
   DECLDIR char* Function(double ip);
}

#endif

klopt dit ongeveer?

double edit: HAHA: het is me gelukt om het naar een .lib te compilen! nu alleen nog de .h file en hopelijk kan ik dan echt gaan beginnen!
 
Laatst bewerkt:
^^ @code BULLLL

mijn EngineHeaders.h file:

Code:
//Engine facades
#include "Engine.h"
#include "EntityManagerFacade.h"
#include "SceneManagerFacade.h"

//Entity stuff
#include "Entity.h"
#include "DrawableEntity.h"
#include "UpdatableEntity.h"

mja kweet niet waarom sommige mensen zo moeilijk doen met die .h en ik kan me er ook niet toe zetten om het uit te zoeken want dit wat ik nu doe werkt gewoon voor mij

edit:
oh #ifndef _DLL_TUTORIAL_H_ is trouwens om multiple inclusion tegen te gaan, moet je inderdaad eigenlijk in iedere header doen mja booiah ik gebruik de header toch om andere headers waar de beveiliging wel in staat te includen:P
^^ dat is samen met #define _DLL_TUTORIAL_H_ //wat doet dit?
en #endif
 
Laatst bewerkt:
hm.... ik snap `m niet.... ik gebruik nu deze code:
Code:
#include <windows.h>
#include <iostream>
#include "C:\Users\Sander\Desktop\39dll\src\39dllheaders.h"
#pragma comment( lib, "C:\Users\Sander\Desktop\39dll\Debug\39dllVStudio.lib" )

int main()
{
dllInit();
}

dllinit is een functie in de dll maar ik krijg een error dat de functie dllinit undeclared is oftewel ombekent......

in 39dllheaders.h zit dit:
Code:
#include "C:\Users\Sander\Desktop\39dll\src\buffer.h"
#include "C:\Users\Sander\Desktop\39dll\src\list.h"
#include "C:\Users\Sander\Desktop\39dll\src\socket.h"
#include "C:\Users\Sander\Desktop\39dll\src\tools.h"
 
je moet hem in een van die headers gedeclareerd hebben en dan ergens in je .lib de implementatie doen

en het is geen dll meer he nu het is een lib
 
je moet hem in een van die headers gedeclareerd hebben en dan ergens in je .lib de implementatie doen

en het is geen dll meer he nu het is een lib

je moet hem in een van die headers gedeclareerd hebben -- dit snap ik nog

en dan ergens in je .lib de implementatie doen -- dit niet meer... wat bedoel je hiermee?

ps: met de declareren moet je natuurlijk de functies maken en er is een file die alle functies zegmaar maakt maar dat is gewoon een .cpp file en geen .h deze namelijk:
Code:
#include "includes.h"
#include "tools.h"
#include "socket.h"
#include "buffer.h"
#include "list.h"

#define DLLEXPORT extern "C" __declspec(dllexport)

CList buffers;
CList sockets;
CList files;
int AddSocket(CSocket*);
int AddBuffer(CBuffer*);
int AddFile(HANDLE);
//Sockets
DLLEXPORT double tcpconnect(char*ip, double port, double mode)
{
	CSocket* sock = new CSocket();
	if(sock->tcpconnect(ip, (int)port, (int)mode))
		return AddSocket(sock);
	delete sock;
	return -1;
}

DLLEXPORT double tcplisten(double port, double max, double mode)
{
	CSocket* sock = new CSocket();
	if(sock->tcplisten((int)port, (int) max,(int)mode))
		return AddSocket(sock);
	delete sock;
	return -1;
}

DLLEXPORT double tcpaccept(double sockid, double mode)
{
	CSocket*sock = (CSocket*)sockets.item((int)sockid);
	if(sock == NULL)return -1;
	CSocket*sock2 = sock->tcpaccept((int)mode);
	if(sock2 != NULL)return AddSocket(sock2);
	return -1;
}

DLLEXPORT char* tcpip(double sockid)
{
	CSocket*sock = (CSocket*)sockets.item((int)sockid);
	if(sock == NULL)return NULL;
	return sock->tcpip();
}

DLLEXPORT double setnagle(double sockid, double value)
{
	CSocket*sock = (CSocket*)sockets.item((int)sockid);
	if(sock == NULL)return 0;
	if(value)
		sock->setnagle(true);
	else sock->setnagle(false);
	return 1;
}
DLLEXPORT double tcpconnected(double sockid)
{
	CSocket*sock = (CSocket*)sockets.item((int)sockid);
	if(sock == NULL)return 0;
	if(sock->tcpconnected())return 1;
	else return 0;
}
DLLEXPORT double udpconnect(double port, double mode)
{
	CSocket* sock = new CSocket();
	if(sock->udpconnect((int)port, (int)mode))
		return AddSocket(sock);
	delete sock;
	return -1;
}
DLLEXPORT double sendmessage(double sockid, char*ip, double port, double buffid)
{
	CSocket*sock = (CSocket*)sockets.item((int)sockid);
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(sock == NULL)return -1;
	if(buff == NULL)return -2;
	int size = sock->sendmessage(ip, (int)port, buff);
	if(size < 0)return -sock->lasterror();
	return size;
}

DLLEXPORT double receivemessage(double sockid, double len, double buffid)
{
	CSocket*sock = (CSocket*)sockets.item((int)sockid);
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(sock == NULL)return -1;
	if(buff == NULL)return -2;
	int size = sock->receivemessage((int)len, buff);
	if(size < 0)
	{
		int error = sock->lasterror();
		if(error == 10054)return 0;
		return -error;
	}
	return size;
}
DLLEXPORT double peekmessage(double sockid, double len, double buffid)
{
	CSocket*sock = (CSocket*)sockets.item((int)sockid);
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(sock == NULL)return -1;
	if(buff == NULL)return -2;
	int size = sock->peekmessage((int)len, buff);
	if(size < 0)
	{
		int error = sock->lasterror();
		if(error == 10054)return 0;
		return -error;
	}
	return size;
}

DLLEXPORT double setformat(double sockid, double mode, char*sep)
{
	CSocket*sock = (CSocket*)sockets.item((int)sockid);
	if(sock == NULL)return -1;
	return sock->SetFormat((int)mode, sep);
}

DLLEXPORT char* lastinIP()
{
	return CSocket::lastinIP();
}

DLLEXPORT double lastinPort()
{
	return CSocket::lastinPort();
}

DLLEXPORT double setsync(double sockid, double mode)
{
	CSocket*sock = (CSocket*)sockets.item((int)sockid);
	if(sock == NULL)return -1;
	sock->setsync((int)mode);
	return 1;
}
DLLEXPORT double closesock(double sockid)
{
	CSocket*sock = (CSocket*)sockets.item((int)sockid);
	if(sock == NULL)return -1;
	delete sock;
	sockets.set((int)sockid, NULL);
	return 1;
}

DLLEXPORT double socklasterror(double sockid)
{
	CSocket*sock = (CSocket*)sockets.item((int)sockid);
	if(sock == NULL)return -1;
	return -sock->lasterror();
}

DLLEXPORT char* myhost()
{
	return CSocket::myhost();
}

DLLEXPORT double compareip(char*ip, char*mask)
{
	return CTools::comparematch(ip, mask);
}

DLLEXPORT double sockexit()
{
	CSocket::SockExit();
	return 1;
}

DLLEXPORT double sockstart()
{
	CSocket::SockStart();
	return 1;
}

DLLEXPORT char* hostip(char*host)
{
	return CSocket::GetIp(host);
}


DLLEXPORT double getsocketid(double sockid)
{
	CSocket*sock = (CSocket*)sockets.item((int)sockid);
	if(sock == NULL)return -1;
	return sock->sockid;
}
//Buffers
DLLEXPORT double writebyte(double val, double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->writebyte((unsigned char)val);
}
DLLEXPORT double writeshort(double val, double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->writeshort((short)val);
}
DLLEXPORT double writeushort(double val, double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->writeushort((unsigned short)val);
}
DLLEXPORT double writeint(double val, double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->writeint((int)val);
}
DLLEXPORT double writeuint(double val, double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->writeuint((unsigned int)val);
}
DLLEXPORT double writefloat(double val, double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->writefloat((float)val);
}
DLLEXPORT double writedouble(double val, double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->writedouble(val);
}
DLLEXPORT double writechars(char*str, double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->writechars(str);
}
DLLEXPORT double writestring(char*str, double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->writestring(str);
}

DLLEXPORT double readbyte(double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->readbyte();
}

DLLEXPORT double readshort(double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->readshort();
}

DLLEXPORT double readushort(double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->readushort();
}

DLLEXPORT double readint(double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->readint();
}

DLLEXPORT double readuint(double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->readuint();
}
DLLEXPORT double readfloat(double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->readfloat();
}
DLLEXPORT double readdouble(double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->readdouble();
}
DLLEXPORT char* readchars(double len, double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return NULL;
	return buff->readchars((int)len);
}

DLLEXPORT char* readstring(double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return NULL;
	return buff->readstring();
}

DLLEXPORT char* readsep(char*sep, double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return NULL;
	return buff->readsep(sep);
}
DLLEXPORT double getpos(double pos, double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	if(pos == 0)return buff->writepos;
	else return buff->readpos;
}

DLLEXPORT double clearbuffer(double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	buff->clear();
	return 1;
}

DLLEXPORT double buffsize(double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->count;
}

DLLEXPORT double setpos(double pos, double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	buff->readpos = (int)pos;
	buff->writepos = (int)pos;
	return pos;
}

DLLEXPORT double bytesleft(double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return buff->bytesleft();
}

DLLEXPORT double createbuffer()
{
	CBuffer* buff = new CBuffer();
	return AddBuffer(buff);
}
DLLEXPORT double freebuffer(double buffid)
{
	if(buffid == 0)return 0; //no deleting default buffer
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	delete buff;
	buffers.set((int)buffid, NULL);
	return 1;
}
DLLEXPORT double copybuffer(double destinationid, double sourceid)
{
	CBuffer*destination = (CBuffer*)buffers.item((int)destinationid);
	if(destination == NULL)return 0;
	CBuffer*source = (CBuffer*)buffers.item((int)sourceid);
	if(source == NULL)return 0;
	destination->addBuffer(source);
	return 1;

}
DLLEXPORT double copybuffer2(double destinationid, double start, double len, double sourceid)
{
	CBuffer*destination = (CBuffer*)buffers.item((int)destinationid);
	if(destination == NULL)return 0;
	CBuffer*source = (CBuffer*)buffers.item((int)sourceid);
	if(source == NULL)return 0;
	destination->addBuffer(source->data+(int)start, (int)len);
	return 1;

}
//tools
DLLEXPORT char* getmacaddress()
{
	return CTools::getmacaddress();
}
DLLEXPORT char* md5string(char*str)
{
	return CTools::md5string(str);
}

DLLEXPORT char* md5buffer(double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return NULL;
	return CTools::md5buffer(buff);
}

DLLEXPORT double bufferencrypt(char*pass, double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	CTools::encryptedbuffer(buff, pass);
	return 1;
}

DLLEXPORT double adler32(double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return CTools::adler32(buff);
}

DLLEXPORT double bufferexists(double buffid)
{
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return 0;
	return 1;
}

DLLEXPORT double netconnected()
{
	return CTools::netconnected();
}

DLLEXPORT double fileopen(char*name, double mode)
{
	HANDLE file = CTools::BinOpen(name, (int)mode);
	if(file != NULL)
		return AddFile(file);
	return -1;
}

DLLEXPORT double fileclose(double fileid)
{
	HANDLE file = (HANDLE)files.item((int)fileid);
	if(file == NULL)return -1;
	files.set((int)fileid, NULL);
	return CTools::BinClose(file);
}

DLLEXPORT double filewrite(double fileid, double buffid)
{
	HANDLE file = (HANDLE)files.item((int)fileid);
	if(file == NULL)return -1;
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return -1;
	return CTools::BinWrite(file, buff);
}

DLLEXPORT double fileread(double fileid, double bytes, double buffid)
{
	HANDLE file = (HANDLE)files.item((int)fileid);
	if(file == NULL)return -1;
	CBuffer*buff = (CBuffer*)buffers.item((int)buffid);
	if(buff == NULL)return -1;
	return CTools::BinRead(file, (int)bytes, buff);
}
DLLEXPORT double filepos(double fileid)
{
	HANDLE file = (HANDLE)files.item((int)fileid);
	if(file == NULL)return -1;
	return CTools::BinGetPos(file);
}
DLLEXPORT double filesetpos(double fileid, double pos)
{
	HANDLE file = (HANDLE)files.item((int)fileid);
	if(file == NULL)return -1;
	return CTools::BinSetPos(file, (int)pos);
}
DLLEXPORT double filesize(double fileid)
{
	HANDLE file = (HANDLE)files.item((int)fileid);
	if(file == NULL)return -1;
	return CTools::BinFileSize(file);
}

DLLEXPORT double iptouint(char*ip)
{
	return CTools::ip2uint(ip);
}
DLLEXPORT char* uinttoip(double ip)
{
	return CTools::uint2ip((unsigned int)ip);
}
int AddBuffer(CBuffer*b)
{
	for(int i = 0; i < buffers.count; i ++)
	{
		if(buffers[i] == NULL)
		{
			buffers.set(i, b);
			return i;
		}
	}
	buffers.Add(b);
	return buffers.count-1;
}

int AddSocket(CSocket*b)
{
	for(int i = 0; i < sockets.count; i ++)
	{
		if(sockets[i] == NULL)
		{
			sockets.set(i, b);
			return i;
		}
	}
	sockets.Add(b);
	return sockets.count-1;
}

int AddFile(HANDLE b)
{
	for(int i = 0; i < files.count; i ++)
	{
		if(files[i] == NULL)
		{
			files.set(i, b);
			return i;
		}
	}
	files.Add(b);
	return files.count-1;
}

DLLEXPORT double dllInit()
{
    CSocket::SockStart();
    buffers.Add(new CBuffer());
    sockets.Add(new CSocket()); //dummy socket
    return 1;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
    {
        case DLL_PROCESS_DETACH:
			CSocket::SockExit();
			for(int i = 0; i < buffers.count; i++)
				if(buffers[i] != NULL)
					delete (CBuffer*)buffers.item(i);
			for(int i = 0; i < sockets.count; i++)
				if(sockets[i] != NULL)
					delete (CSocket*)sockets.item(i);
			for(int i = 0; i < files.count; i ++)
				if(files[i] != NULL)
					CTools::BinClose((HANDLE)files.item(i));
            break;
    }
    return TRUE;
}

daar zit dan gelijk alles geincluded enz. en natuurlijk moet ik die dll export dingen er dan uithalen toch? dus DLLEXPORT voor elke functies weghalen en
#define DLLEXPORT extern "C" __declspec(dllexport) maar als ik dat heb weggehaald en ik sla `m op dan is dit hoe die .h file er uit moet zien?
 
main:
Code:
#include "file.h"
int main()
{
foo();
return 0;
}

file.h:
Code:
bool foo();//declaratie

file.cpp:
Code:
bool foo()
{//implementatie
return true;
}

file.h en file.cpp mag je een lib van maken als je die ook aan je main toevoegt
 
ik denk dat ik er steeds dichterbij kom want nu herkent hij de functie maar....

[Linker error] undefined reference to `dllInit()'

bij deze code:
Code:
#include "C:\Users\Sander\Desktop\39dll\header.h"
#pragma comment( lib, "C:\Users\Sander\Desktop\39dll\Debug\39dllVStudio.lib" )

int main()
{
dllInit();
}

en dit staat er in header.h:
Code:
double tcpconnect(char*ip, double port, double mode);
double tcplisten(double port, double max, double mode);
double dllInit();
 
Aangezien ik zelf niet veel gebruik maak van Visual C++ gebruik ik 'pragma comment' niet vaak.

Maar ik heb je even een voorbeeld gemaakt 'op de moeilijke manier':

dll.h
Code:
#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport) 
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport) 
#endif /* Not BUILDING_DLL */

#include <string>
#include <windows.h>

class DLLIMPORT DllClass
{
  public:
    DllClass();
    virtual ~DllClass(void);

  private:

};

extern "C"
{
    DLLIMPORT __stdcall void show_message(const std::string m);
    DLLIMPORT __stdcall int  length_of_string(const std::string s);
}

#endif /* _DLL_H_ */

dllmain.cpp:
Code:
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>

DllClass::DllClass()
{

}

DllClass::~DllClass ()
{

}

BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}

DLLIMPORT __stdcall void show_message(const std::string m)
{
    MessageBox(NULL, m.c_str(), "example::show_message", MB_OK);
}

DLLIMPORT __stdcall int length_of_string(const std::string s)
{
    return s.length();
}

main.cpp
Code:
#include <cstdlib>
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

typedef void (*FP1)(const std::string);
typedef int  (*FP2)(const std::string);

int main(int argc, char *argv[])
{
    HINSTANCE hi;
    FP1 fp1;
    FP2 fp2;
    
    hi = LoadLibrary("exampleDLL.dll");
    
    if( hi != NULL )
    {
        fp1 = (FP1) GetProcAddress(hi, "show_message");
        fp2 = (FP2) GetProcAddress(hi, "length_of_string");
        
        std::string s = "test::test::test";
        
        if(fp1 != NULL)
           (fp1)(s);
        
        if(fp2 != NULL)
           std::cout << "Length of \"" << s << "\" == " << (fp2)(s) << '\n';
        
        FreeLibrary(hi);
    }
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Het gehele project is hier te downloaden:
http://rapidshare.com/files/139224158/exampleDLL.rar.html

(stom voorbeeld, maar het gaat om het idee)
 
hier staat trouwens eea beschreven, kan handig zijn:

http://msdn.microsoft.com/en-us/library/ms235627(VS.80).aspx

edit:
en uiteraard gebruiken ze een verkeerd voorbeeld, mocht je twee apparte solutions willen dan moet je in de solution waar je de lib wilt gebruiken rechts klikken op het project dan naar config props, dan open je linker, dan ga je naar input.
hier moet "additional dependencies" daar moet je de lib invullen, in mijn geval "$(ProjectDir)/lib/EchoEngine.lib"
en ignore all default libs moet op "No" staan.
de overige velden zijn leeg bij mij, ik krijg dan wel een warning steeds maar het werkt toch
 
Laatst bewerkt:
maar er is dus niet echt een manier om een dll te gebruiken zonder de dll zelf te wijzigen? want ik denk dat ook om helemaal die ingewikkelde dll te wijzigen veel te moeilijk is voor mij en dat ik beter eerst met wat anders kan beginnen/oefenen......

ideeën om te oefenen? ik kan de basis van programmeren (while, if, for etc.) ik heb al een paar eigen dll`s gemaakt die files copieeren, een bepaalde window vergroot - verkleind of hersteld, een "beep" geluid maken.

maar dat zijn allemaal standaard dingen ik zou wel willen beginnen met specaile (gratis) library`s (in de toekomst wil ik graag opengl of directx doen maar is voor nu veel te moeilijk denk ik.....) of nog beter: wie weet een goede tutorial voor win32 applicaties? gewoon het window inrichten enz. want ik werk nu alleen nog in een console maar ik wil natuurlijk wel dat het later in een window komt ipv console. (api functies heette dat geloof ik)
 
Laatst bewerkt:
mhhh je bedoelt dat je helemaal niet zelf een dll wilde maken maar die van iemand anders gebruiken? mja dan weet ik het niet
 
maar er is dus niet echt een manier om een dll te gebruiken zonder de dll zelf te wijzigen? want ik denk dat ook om helemaal die ingewikkelde dll te wijzigen veel te moeilijk is voor mij en dat ik beter eerst met wat anders kan beginnen/oefenen......

Je wijzigt de DLL niet. Je zorgt er alleen voor dat je een bepaalde functies kunt gebruiken die in de DLL zitten.

Als het om een library gaat die je gebruikt dan kun je inderdaad met headers werken. (en over het linken/compilen is meestal genoeg informatie te vinden)

ideeën om te oefenen? ik kan de basis van programmeren (while, if, for etc.) ik heb al een paar eigen dll`s gemaakt die files copieeren, een bepaalde window vergroot - verkleind of hersteld, een "beep" geluid maken.

Uhm... hoe roep jij de functies van die DLL dan aan ? :o

maar dat zijn allemaal standaard dingen ik zou wel willen beginnen met specaile (gratis) library`s (in de toekomst wil ik graag opengl of directx doen maar is voor nu veel te moeilijk denk ik.....) of nog beter: wie weet een goede tutorial voor win32 applicaties? gewoon het window inrichten enz. want ik werk nu alleen nog in een console maar ik wil natuurlijk wel dat het later in een window komt ipv console. (api functies heette dat geloof ik)

Ik gebruik zelf vaker SmartWin voor win32 programma's. En als ik snel iets met een GUI in elkaar wil zetten dan gebruik ik vaker Codegear/Borland C++ builder.

Een console programma is vaak trouwens wel makkelijker om dingen te leren. :)
 
Uhm... hoe roep jij de functies van die DLL dan aan ? :o

ik heb die dll`s gemaakt voor een programma die ik wel goed kan en bij dat programma hoef je alleen de dll te maken met functies er in en alle functies declareren maar dat doe je in het programma zelf en veel simpeller maar je hoeft niks te weizigen in de dll (de dll die ik wil gebruiken in C++ is ook voor dit programma maar omdat dit programma best langzaam is en je minstens een 8mb of meer videokaart nodig hebt werkt hij niet op de meeste servers daarom wil ik `m in C++ maken)
 
ik heb die dll`s gemaakt voor een programma die ik wel goed kan en bij dat programma hoef je alleen de dll te maken met functies er in en alle functies declareren maar dat doe je in het programma zelf en veel simpeller maar je hoeft niks te weizigen in de dll (de dll die ik wil gebruiken in C++ is ook voor dit programma maar omdat dit programma best langzaam is en je minstens een 8mb of meer videokaart nodig hebt werkt hij niet op de meeste servers daarom wil ik `m in C++ maken)

Het hangt een beetje van de functies af die in de DLL staan(het aantal parameters eigenlijk), maar anders is het vrij eenvoudig om een wrapper te schrijven die het werken met DLL's wat makkelijker maakt. Dan zou je dus ook weer relatief makkelijk met DLL's kunnen werken.

ideeën om te oefenen? ik kan de basis van programmeren (while, if, for etc.) ik heb al een paar eigen dll`s gemaakt die files copieeren, een bepaalde window vergroot - verkleind of hersteld, een "beep" geluid maken.

maar dat zijn allemaal standaard dingen ik zou wel willen beginnen met specaile (gratis) library`s (in de toekomst wil ik graag opengl of directx doen maar is voor nu veel te moeilijk denk ik.....) of nog beter: wie weet een goede tutorial voor win32 applicaties? gewoon het window inrichten enz. want ik werk nu alleen nog in een console maar ik wil natuurlijk wel dat het later in een window komt ipv console. (api functies heette dat geloof ik)

Ik heb al een keer op dit stukje tekst gereageerd, maar ik wil er toch nog iets over kwijt:

Ik begrijp best waarom je met 'speciale' dingen wilt beginnen. Ik bedoel, enkel een console venster is niet echt spannend te noemen. Maar waarom niet eerst (veel) meer over de taal C++ zelf leren ? Ik denk dat je er nog van versteld zult staan hoeveel je daar alleen nog over zou kunnen leren.

Verder denk ik persoonlijk dat tutorials van internet niet dé manier zijn om C++ goed te leren. Er zijn zeker wel goede tutorials te vinden op het internet, maar de kwaliteit verschilt dus wel per tutorial. En als beginner heb je daar doorgaans weinig kijk op. (of er moeten echt veel spelfouten etc in zitten, dat zegt meestal wel iets over de kwaliteit.)

Ik kan je in elk geval aanraden om eerst het bovenstaande te doen. Het geeft je veel meer inzicht en maakt het leven een stuk makkelijker. Ik heb het al vaker gezegd, maar persoonlijk vind ik het boek 'the programming language C++'/ 'de programmeertaal C++' van Bjarne Stroustrup echt een aanrader. ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan