Newsgroup: it.comp.programmare.win32
Titolo: AlphaBlend e GetProcAddress

devo usare la funzione AlphaBlend() in un mio progetto.
allora, io ho fatto tutto alla perfezione (spero! :-) ):
definito WINVER a 0x0500
incluso <windows.h> (che include wingdi.h, dove è dichiarata AlphaBlend)
ho usato AlphaBlend al posto di BitBlt, ma il compilatore (VC++6 con
Platform SDK di ottobre 2000) si arrabbia probabilmente perchè non è
definito nel relativo file .lib
ho controllato dalle opzioni che andasse a pescare i files lib più nuovi, e
infatti la dir di VC++ 'lib' l'ho tolta, in modo che andava a prendere solo
i LIB del platform SDK
ma non funziona lo stesso
a questo punto avrei pensato di usare la seconda soluzione, ovvero di
caricare la funzione da Msing32.dll, come dice l'help, ma non saprei come...
so che devo dichiarare un HMODULE e assegnargli il ret. val di
LoadLibrary("Msimg32.dll")
ma poi come faccio a creare la funzione con GetProcAddress()
non voglio sapere la sintassi di quasta api, che l'ho capito, ma vorrei
sapere che ci faccio con il LONG FAR che mi restituisce, e come faccio a
creare il prototipo della funzione. (o non si può?)
magari un piccolo esempiuccio, tanto sono poche righe...  :) tnx
ciao
xaero

 magari un piccolo esempiuccio, tanto sono poche righe...  :) tnx
Il LONG FAR non è altro che un puntatore a void che, nel caso di
GetProcAddress è un puntatore a funzione. Il mio consiglio è di fare un
typedef e poi eseguire un cast statico del valore ritornato da
GetProcAddress per utilizzare la funzione senza problemi.
Es.
Devi ottenere l'indirizzo di int MyFunc(int, char*)
Fai
typedef int (*LPMYFUNC)(int, char*);
LPMYFUNC lpMyFunc;
lpMyFunc = (LPMYFUNC)GetProcAddress(hModule, "MyFunc");
if(!lpMyFunc)
  exit(-1);
(*lpMyFunc)(10, "Ciao!");
....
--
ByEZ,
MindFlavor ( 
mindflav...@hotmail.com
 )
URL: 
http://web.tiscalinet.it/mindflavor

 (*lpMyFunc)(10, "Ciao!");
e per chiamarla devo scrivere ogni volta cosě?
non c'č un modo di poter dichiarare il prototipo? sai, in VC++ sarebbe molto
comodo :)
ciao
xaero

ciao
nel frattempo ho provato come mi hai suggerito.
riporto il codice fondamentale:
// PROTOTIPO:
// BOOL AlphaBlend(HDC, int, int, int, int, HDC, int, int, int, int,
BLENDFUNCTION);
typedef BOOL
(*LPALPHABLEND)(HDC,int,int,int,int,HDC,int,int,int,int,BLENDFUNCTION);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
 BLENDFUNCTION bf;
 static HINSTANCE hInst;
 static LPALPHABLEND lpAlphaBlend;
 HMODULE hDLL;
 switch(message)
 {
 case WM_CREATE:
  hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
  hDLL = LoadLibrary("Msimg32.dll");
  lpAlphaBlend = (LPALPHABLEND)GetProcAddress(hDLL, "AlphaBlend");
  FreeLibrary(hDLL);
  return 0;
 case WM_PAINT:
  // OMISSIS - creo un DC hDCmem e ci metto una BMP
  bf.BlendOp = AC_SRC_OVER;
  bf.BlendFlags = 0;
  bf.SourceConstantAlpha = 127;
  bf.AlphaFormat = AC_SRC_ALPHA;
  // -> AlphaBlend(hDC, 0, 0, 100, 100, hDCmem, 0, 0, 100, 100, bf);
  (*lpAlphaBlend)(hDC,0,0,100,100,hDCmem,0,0,100,100,bf);
  // OMISSIS - cancello oggetti, bitmap e quant'altro
  return 0;
 }
 return DefWindowProc(hWnd, message, wParam, lParam);
}
ma mi dà un bell'errore proprio quando chiamo la funzione
(*lpAlphaBlend)
(L'istruzione a "0x6b1a1128" ha fatto riferimento alla memoria a
"0x6b1a1128". La memoria non poteva essere "read".)
perchè?
P.S. ho riportato i codici hex esatti dei due indirizzi di memoria perchè
sono UGUALI. non conosco linguaggi di programmazione di basso livello tipo
ASM nè tantomeno conosco come funziona un processore intel, però che
significherebbe che l'istruzione a 6b... va a leggere la memoria a 6b...
cioè proprio nel punto dove c'è l'istruzione?
dov'è l'inghippo?
andando più nei dettagli: eseguo il debug:
"unhandled exception in AlphaBlendTest.exe: 0xC0000005: Access Violation."
nel Disassembler mi posiziona il cursore su 6B1A1128, ma mette i punti
interrogativi.
:-?
ciao
xaero

 perchè?
Ehm, non vorrei dire fesserie, ma se tu chiudi la Dll con FreeLibrary, come
fai ad eseguire la funzione?
Non farti trarre in inganno dal fatto che Msecc. sia gia' caricata di suo :D
Bow-wow
Killer

 Non farti trarre in inganno dal fatto che Msecc. sia gia' caricata di suo :D
avevi ragione! :)
avevo pensato a quell'assegnamento come una copia della memoria nella variabile, ma essendo un puntatore il riferimento è proprio
nell'area di memoria dove è mappata la Dll....
cmq ho dichiarato HMODULE hDLL come static e messo FreeLibrary() in WM_DESTROY.
AlphaBlend funziona (nel senso che disegna qualcosa nella client area), ma questa volta appena ha fatto il disegno:
L'istruzione a "0x0000000f" ha fatto riferimento alla memoria a "0x0000000f". La memoria non poteva essere "read"
perchè? oltretutto dopo che il disegno l'ha ormai fatto!!!
ho controllato, ed è proprio quella chiamata a (*lpAlphaBlend) che genera questo nuovo errore!
perchè????
plz help me!
xaero

 La memoria non poteva essere "read"
Ad occhio e croce, l'errore non e' nella chiamata, ma in qualcosa che fa la
funzione, quindi non saprei che dirti.
Prova a fare un debug + approfondito, chesso' controllando che il valore del
puntatore lpAlphaBlend non cambi o non diventi mai quello che da' errore,
a volte succedono delle cose strane...
P.S.: Sempre chiari gli errori di Windows :D
Bow-wow
Killer