Newsgroup: it.comp.lang.c++
Titolo: Usare DLL in VC++

 compilatore non è MS.
L'import library dovrebbe essere possibile generarlo con il comando LIB.exe
<nome dll> presente in VC++ nella cartella BIN, ma ho provato e mi da errore
cioè non riesce a generare l'import library. Come si fa?
Comunque da quel che mi risulta per usare le funzioni di una DLL si può
anche usare la funzione LoadLibrary, anche se è meno efficiente.
provando con la LoadLibrary ed opportuni cast ho scritto il seguente codice:
HMODULE hMod;
 int (*fork)(void); // puntatore a funzione che restituisce un intero e come
parametro void
 int pid;
 if ((hMod=LoadLibrary("cygwin1.dll"))==NULL){
  printf("errore apertura DLL");
  exit(1); // errore apertura DLL
 }
 if((fork=(int (*)(void))GetProcAddress(hMod,"fork"))==NULL){
  printf("errore esportazione funzione della DLL");
  exit(1);
 }
 pid=fork();
 (...)
l'ho fatto eseguire e putroppo da un errore di protezione; però
visualizzando con il task manager di WinXP la lista dei processi, si vede
che quando viene chiamata la fork viene anche richiamato il comando
VCSPAWN.exe che effettivamente dovrebbe implementare la fork, però
evidentemente non ha successo.
Ho anche provato un'altra soluzione utilizzando il reinterpret-cast cioè:
typedef int (_stdcall *pMyFuncType)(void);
 hMod=LoadLibrary(...);
 if (hMod){
  pMyFuncType fork;
  fork=reinterpret_cast<pMyFuncType>(GetProcAddress(hMod,"fork"));
  int pid;
  pid=fork();
ma è equivalente alla soluzione precedente ovvero da errore di protezione,
dopo che viene invocato il comando VCSPAWN.exe
Evidentemente i cast fatti non vanno bene, oppure mi viene il dubbio che
prima di richiamare la fork() della libreria cygwin occorre richiamare una
funzione di inizializzazione o altro? Insomma qualcuno può postarmi il
codice per riuscire ad aprire/usare correttamente la libreria cygwin con
VC++, possibile che nessuno l'abbia mai usata fin'ora? GRAZIE.

 }
Credevo che fork() non fosse implementata nelle librerie cygnus: man 3
fork non esiste. Non e` che essa sia effettivamente esportata dalla DLL,
ma destinata solo a un uso interno?
--
Lorenzo

 ma destinata solo a un uso interno?
quando richiamo GetProcAdress(hMod,"fork"), il puntatore restituito è
NON-nullo, quindi la fork dovrebbe esistere, come del resto è elencata
nell'help on-line 
www.cygwin.com
Nel caso non fosse esportabile, allora come diavolo si fa a creare un nuovo
processo figlio da un processo padre? La cygwin1.dll serve proprio per poter
usare le system-call di UNIX.

 processo figlio da un processo padre?
In effetti credevo che ci fosse questa limitazione; dopotutto puoi
portare un sacco di applicazioni anche senza che la fork() sia
implementata.
Se davvero le librerie cygnus implementano la fork() sarei curioso di
sapere come questo sia messo in pratica tecnicamente, viste le
differenze piuttosto rilevanti fra POSIX e Win32 sotto questo punto di
vista. In Win32 puoi soltanto avviare un processo o un thread, ma
l'esecuzione inizia sempre all'entry point specificato. Al massimo puoi
ereditare gli handles aperti dal padre e qualche altra cosa (permessi di
accesso, variabili di environment, ...), non erediti mai l'intero
contesto (incluso lo stack e i valori dei registri) come succede con
fork()...
--
Lorenzo