Newsgroup: it.comp.lang.visual-basic
Titolo: (ennesimo) Vb e assembly

Ciao a tutti.
Spero di non essere OT per le domande che faccio.
Premetto che non sono un esperto programmatore. Ultimamente sto
cercando di costruire delle librerie DLL contenenti funzioni dedicate.
Ho scaricato dalla rete parecchi tutorial, esempi ecc. (oltre
ovviamente al MASM). Ho capito, in linea generale come avviene il
passaggio dei parametri tra il VB e la funzione contenuta nella Dll.
Tuttavia, i problemi sorgono quando utilizzo i numeri reali a singola
precisione (single per Vb e real4 per MASM).
Quando dichiaro la funzione in Vb con la dichiarazione:
Private Declare Function nome_funz Lib "nomelib.dll" (ByVal par1 As
Single, ByVal par2 As Single... ) As Single
Visual Basic mi genera l'errore "espressione troppo complessa".
Sostituendo il tipo di ritorno della funzione da "single" a "Long",
non ottengo più l'errore, ma il risultato dell'operazione contenuta
nella funzione è completamente errato!!
Qualcuno di voi è in grado di capire che cosa sta succedendo?
Grazie.
P.S. Scusate se non ho seguito un post "conforme", ma questo è il mio
primo post in assoluto. Ogni critica o suggerimento di come si posta
sono del tutto ben accetti!!

 Visual Basic mi genera l'errore "espressione troppo complessa".
Ma l'errore l'ottieni quando nell'editor passi dalla riga di dichiarazione
ad un'altra riga?
Se sě, ti spiace postare la declare che usi, visto che quella che tu hai
indicato č assolutamente lecita.
Ciao

 Ciao
Hai ragione, sono stato un po' impreciso.... dunque:
1) ho creato la dll di nome "libreria.dll" al cui interno ho inserito
la seguente funzione:
Prova proc   vax: DWORD
	mov	eax,vax		; vax -> eax
	ret
Prova Endp
che, come puoi vedere, non fa altro che ritornare nell'accumulatore
(32 bit come il dato) il valore del parametro che gli passo quando la
chiamo.
2) in vb il codice, realizzato in un'unico form, e' il seguente:
Option Explicit
Private Declare Function Prova Lib "Libreria.dll" (ByVal vax As
Single) As Long
------------------
Private Sub Command1_Click()
   varx = Text1.Text
   ax = Prova(varx)
   Text2.Text = ax
End Sub
------------------------
Come vedi il form contiene solo 2 textbox ed 1 solo commandbutton...
Questa versione funziona, ed il risultato, ovviamente, č un intero,
anche se in Text1 dovessi inserire per esempio 5,3.
3) Se alle prime 2 righe del codice Vb sostituisco:
Option Explicit
Private Declare Function Prova Lib "Libreria.dll" (ByVal vax As
Single) As Single
.
.
mi genera l'errore in fase di esecuzione all'interno del visual basic.
Ora io non conosco benissimo come ti ho gia' accennato visual basic
(diciamo che sono grosso modo alle prime esperienze) pero' l'errore
generato avviene senza che la funzione venga eseguita: ovvero, se
metto un brak-point prima della chiamata alla funzione "prova(varx)",
questo viene completamente ignorato e il messaggio d'errore viene
generato comunque.
Boh. dov'č che sbagio?
grazie e ciao.

 generato comunque.
C'è qualcosa che non stai dicendo...
per prima cosa prova a eseguire il programma con CTRL+F5 che ti fa una
compilazione completa.
Questo, stando a quello che hai detto, dovrebbe darti l'errore senza
avviarti il programma.
Se è così c'è qualcosa di sbagliato nel tuo codice, ma dovresti postarlo
interamente, con dichiarazioni e tutto il resto, in modo da poter verificare
la cosa con un copia-incolla.
La guida dice questo relativamente all'errore che stai ottenendo:
---
Il numero di sottoespressioni ammesse in un'espressione a virgola mobile
varia a seconda delle piattaforme. In sistemi operativi Microsoft Windows a
32 bit, ad esempio, il limite è di otto livelli di espressioni in virgola
mobile nidificate. Causa e soluzione dell'errore:
Un'espressione a virgola mobile contiene troppe sottoespressioni nidificate.
Suddividere l'espressione in più espressioni separate fino ad evitare
l'errore.
---
Sinceramente è la prima volta che vedo questo errore e quindi ho difficoltà
nel capire cosa intenda per "espressione".
Per questo mi servirebbe un codice che riproduca l'errore.
Ciao

 primo post in assoluto.
Paura eh?! ;-)
ciao
Paolo B.

Single) As Long
Premesso che non ho mai scritto una dll in assembly, mi lascia
perplesso l'argomento DWORD nella dll e la dichiarazione As Single 
in vb.
Non vorrei, cioe', che vb facesse delle conversioni da Single
a Long che non sono intese dalla dll (dopotutto un valore
DWORD e' intero e non e' a virgola mobile come il Single).
Se dichiari As Long sia il parametro che il ritorno della funzione,
che succede?
-- 
ciao, hal

 Prova Endp
  mmm mi sembra poco come sorgente assembly per una dll
 
 Puoi postare l'intero source?
Ciao
--------------------------------
Inviato via 
http://usenet.libero.it

 mi genera l'errore in fase di esecuzione all'interno del visual basic.
Come hai definito varx? O non l'hai definito? :-/
Senti prova a fare cosi':
Private Sub Command1_Click()
    dim VarX as Single
    VarX = CSng(Text1.Text)
    ax = Prova(VarX)
    Text2.Text = ax
End Sub
E assicurati che text1.text ci sia dei caratteri numerici.
ciao
Paolo

 Ciao
Rispondo ai post di rinopape, hal1961 e soprattutto a Zanna, nonostante che il
mio username sia cambiato....
Forse, la cosa migliore è riportare tutti i sorgenti, visto che sono di poche
righe ognuno.
Questa è la parte in assembly...
.486       ; compilato per 386 o superiori (32 bit)
.model flat, stdcall ; 32 bit memory model con convezione chiamate stdcall
   ; le uniche che piacciono a VisualBasic
 option casemap :none ; case sensitive
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\Fpu.inc
includelib \masm32\lib\kernel32.lib
;====== MACRO ============
    return MACRO arg
      mov eax, arg
      ret
    ENDM
.CODE
DllMain proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD
 .if reason == DLL_PROCESS_ATTACH
     return TRUE
.elseif reason == DLL_PROCESS_DETACH
     ;
 .elseif reason == DLL_THREAD_ATTACH
     ;
 .elseif reason == DLL_THREAD_DETACH
     ;
 .endif
 ret
DllMain Endp
Prova proc   vax: DWORD
 mov eax,vax  ; vax -> eax
; return vax
 ret
Prova Endp
End DllMain
e questa è la parte di Vb:
Private Declare Function Prova Lib "libreria.dll" (ByVal vax As Long) As Long
'ok, ma valori interi (arrotondati)
'Private Declare Function Prova Lib "libreria.dll" (ByVal vax As Single) As Long
'ok, ma valori errati di brutto
'Private Declare Function Prova Lib "libreria.dll" (ByVal vax As Single) As
Single 'NO! genera errore!!
Dim varx As Single
Dim ax As Single
Private Sub Command1_Click()
   varx = Text1.Text
   ax = Prova(varx)
   Text2.Text = ax
End Sub
Private Sub Command2_Click()
  Unload Me
End Sub
Come potete vedere ci sono 3 casi di funzionamento (o malfunzionamento) nelle
dichiarazioni della funzione in Vb:
1) parametro e funzione as Long:  ok, ma valori interi (arrotondati)
2) parametro as Single e funzione as Long:  ok, ma valori errati di brutto
3) parametro e funzione as Single:  NO! genera errore!!
Non è che il mio Pc si è beccato la SARS?
Ho provato come hai detto tu Zanna, ma il programma si avvia normalmente. E'
quando schiaccio il tasto Command1 che mi esce l'errore...
Ho provato anche a definire diversamente le variabili varx e ax ed a convertire
i valori da interi a reali, ma il comportamento rimane lo stesso. L'errore ed il
NON funzionamento si ha solo in caso di funzione e parametro Single...
Grazie a tutti voi