Newsgroup: it.comp.programmare.win32
Titolo: Recuperare procedure da una DLL

Salve a tutti.
Mi sto cimentando per la prima volta nell'utilizzo di una DLL assieme al
programma principale, forte delle info che sono riuscito a recuperare da
MSDN (uso Visual C++ 6.0).
Il mio problema e` che il mio programma non riesce a recuperare le
funzioni contenute nella DLL... mi sapete dire dove sbaglio?
Ho strutturato il tutto come due progetti (Win32 Application e Win32
DLL) in uno stesso 'workspace'. Nell'header principale della seconda e`
dichiarata:
#define ACTUALDLL_API __declspec(dllexport)
extern ACTUALDLL_API int nActualDLL;
(ho modificato la libreria di esempio del Wizard)
Nel file sorgente della libreria:
ACTUALDLL_API int fnActualDLL(HWND hWnd) {
  return MessageBox(hWnd, "Libreria e funzione caricate con successo.",\
    "", MB_OK);
} // fnActualDLL()
Compilato, crea una simpatica DLL (che riesce ad occupare 200K).
Il programma chiamante esegue queste linee:
typedef int (*IMPORTEDPROC) (HWND);
/* ... */
  hModule = LoadLibrary("ActualDLL.DLL");
  if (hModule == NULL) { /* ... */ }
  else {
    IMPORTEDPROC DLLProc = (IMPORTEDPROC) GetProcAddress(hModule,\
      "fnActualDLL");
    if (DLLProc) DLLProc(hDlh);
    else MessageBox (hDlh, "Impossibile trovare la funzione "\
      "fnActualDLL().", "Errore", MB_OK | MB_ICONERROR);
    FreeLibrary(hModule);
  }
(hDlh e` l'handler alla finestra)
Il file di libreria viene caricato, hModule e` un puntatore valido
(10000000H), e... il corice di errore restituito e` 127
(ERROR_PROC_NOT_FOUND, ma guarda).
Per il resto, le due componenti non si conoscono, non condividono
header, risorse e neppure il ReadMe, la libreria non sa nulla del
programma e il programma della libreria sa solo il nome della funzione.
C'e` qualche enorme errore... ma quale?
Grazie per l'aiuto.
-- 
Hamlet
Per rispondere, togli le.dita.dal.naso.

 della funzione.
E perche` devi complicarti la vita?
--
Regards, Lorenzo

 in fatto di dimensione degli eseguibili.
A parte quando fai un programma con un main e dentro un return e
niente di piů.
E' incredibile come un programma del genere possa arrivare a 24kb!
Il problema dipende dalle funzioni linkate staticamente, ma con il
massimo dell'impegno credo di non essere arrivato sotto i 16kb.

massimo dell'impegno credo di non essere arrivato sotto i 16kb.
int main(){return 0;}
passa da 25 k circa alla metà se usi la dll MSVCRT.
Poi puoi ancora usare upx che li dimezza.
-- 
                    Marco Barisione (ICQ 84277092)
Se sei interessato alla creazione di it.comp.lang (per i linguaggi di
programmazione senza un gruppo apposito e per i confronti fra i
linguaggi) partecipa alla discussione sul manifesto su it.news.gruppi.

 a 24kb!
Beh, se consideri che persino i compilatori DOS (che dovevano aggiungere
degli stub un pochino meno complessi di quello per Windows) producevano
eseguibili da almeno qualche kB... in ogni caso, a parte gli accorgimenti
che ti ha gia` illustrato Marco, ci sono un sacco di altre cose piu`
"sottili" che si possono fare se hai bisogno di risparmiare spazio al
massimo (e vuoi continuare a usare un compilatore C). Ad esempio scavalcare
l'entry point "vero" del programma (main() e` chiamato dallo stub) e altri
ancora. Qualche tempo fa su microsoft.public.win32.programmer.kernel
facevano a gara a chi riusciva a produrre l'EXE piu` piccolo col VC++, mi
sembra che fossero arrivati a 3-4 kB.
--
Lorenzo

massimo (e vuoi continuare a usare un compilatore C). [...]
Hai dei link?


 Hai dei link?
Ad esempio in questo modo passi (anche se con diverse limitazioni) a 3 kB di
dimensione minima:
http://msdn.microsoft.com/msdnmag/issues/01/01/hood/hood0101.asp
--
Lorenzo