PDA

Visualizza la versione completa : [C++] Creazione DLL


pallocchio
02-08-2011, 19:42
Ciao Ragazzi,
So che questo argomento Ŕ stato trattato da LeleFT nel 2004.
ho letto tutto, ho provato a ripercorrere alcuni suoi passi, ma mi sono arenato.
Al dunque..
WInXP SP3
Visual C++ Express Edition
Voglio creare semplicissima DLL e richiamarla da un altrettanto banale programma
Win 32 console APP. Il tutto sempre i VC++Exp Ed

I miei passi sono stati i seguenti:
Creato progetto Console application ( no DLL perchŔ il flag mi appare in grigetto e non posso editarlo... Qualcuno sa dirmi perchŔ io non posso?)

Copiato da post precedente il seguente programma:

[Come si fa a creare le finestrelle dove mettere il codice?]


/* mydll.dll */

#include <windows.h>
#include <stdafx.h>

/* ENTRY-POINT */
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
return TRUE;
}

/* Funzione Somma */
extern "C" __declspec(dllexport) int Somma(int a, int b)
{
return a+b;
}


Eseguo il build impostando il configuration Type: Dynamic Library
Nessun errore

Copio anche il programma che utilizza la DLL



// UsoLibreria.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"


extern "C" __declspec(dllimport) int Somma(int a, int b);

int main()
{
printf("%d\n", Somma(10, 5) );
return 0;
}


Nel progetto imposto : ProprietÓ -> Linker->General-> Additionl Library-> ... Path della DLL creata precedentemente.

Eseguo Build che restituisce errore:
"error LNK2019: unresolved external symbol __imp__Somma referenced in function _main"

Cosa mi manca? Scusate se Ŕ una banalitÓ, ma non so cosa fare

shodan
02-08-2011, 19:52
Originariamente inviato da pallocchio
Creato progetto Console application ( no DLL perchŔ il flag mi appare in grigetto e non posso editarlo... Qualcuno sa dirmi perchŔ io non posso?)

Finito di impostare la directory e il progetto, fai click su next o finish?



[Come si fa a creare le finestrelle dove mettere il codice?]

http://forum.html.it/forum/showthread.php?threadid=973887
Punto 7.



Cosa mi manca? Scusate se Ŕ una banalitÓ, ma non so cosa fare

Insieme alla DLL ti viene creato anche un .lib. E' quello che devi linkare insieme al main.

pallocchio
03-08-2011, 10:05
Ciao,
Grazie della risposta.
Allora, quando creo il progetto clicco su Next e in questa pagina posso vedere che la possibilitÓ di creare una DLL mi viene negata perchŔ i flag Ŕ in grigetto.

Mi piacerebbe capire il perchŔ di questo , tuttavia ho trovato delle indicazioni dell'Help di Microsoft che dice per posso crearla ugualmente eseguendo il Build esplicitando che desidero un file .dll di uscita.

Per quanto riguarda il file .lib, si trova nella stessa directory del file .dll creato:
Nel progetto imposto : ProprietÓ -> Linker->General-> Additionl Library-> ... Path della DLL creata .
Questo link Ŕ sufficiente o devo i .lib vanno linkati con comandi o cose differenti dai .dll?

Ciao e grazie

shodan
03-08-2011, 13:37
Originariamente inviato da pallocchio
Mi piacerebbe capire il perchŔ di questo

Non so che dirti. Mai avuto un problema simile.


Questo link Ŕ sufficiente o devo i .lib vanno linkati con comandi o cose differenti dai .dll?

A parte che le DLL non si linkano, ma solo i .lib corrispondenti.
In quel modo indichi al compilatore una directory aggiuntiva dove il linker deve cercare delle librerie. Aggiungi:


#pragma comment(lib, "mydll.lib")

al main o in alternativa aggiungi ai source files mydll.lib.
La prima soluzione per˛ funziona solo con VC++

pallocchio
03-08-2011, 14:46
Ciao Shodan,
Grazie della pazienza.
La tua indicazione circa i .lib , mi ha portato ad aggiungere in "Additional Dependecies" il mio file .lib.
Non lo sapevo, ma ho visto il kernel32.lib e ho aggiunto il mio lib.

Quindi adesso ha funzionato bene.
Ti ringrazio tanto!

oregon
03-08-2011, 17:41
Originariamente inviato da pallocchio
Allora, quando creo il progetto clicco su Next e in questa pagina posso vedere che la possibilitÓ di creare una DLL mi viene negata perchŔ i flag Ŕ in grigetto.


Mi sa che Ŕ una limitazione dell'interfaccia della versione Express.

Loading