Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Dichiarazioni dal C al VB

Chiedo scusa se la domanda č banale, ma (mea culpa) non conosco il C e,
purtroppo, mi tocca tradurre alcune dichiarazioni dal C al VB.
Mi interesserebbe avere delle corrispondenze VB-C e C-VB, ad esempio:
Long, Integer, String come si chiamano in C?
Le strutture Type in C come sono?
Grazie mille!
--
Umberto Meroni
[
http://www.ubi1k.com
] [
http://www.ubi1k-vb.net
]
[Come contattarmi: 
http://www.ubi1k.com/meroni
]
---
Tre cose solamente m'čnno in grado,
le quali non posso ben fornire,
cioč la donna, la taverna e 'l dado...
---

 Le strutture Type in C come sono?
si chiamano struct...
Se devi tradurre solo delle intestazioni ti conviene procurarti un libro o
un help in linea e arranginarti un po' con quelli (cmq mi pare di aver
sentito dire di convertitori automatici...)
Non sono espertissimo di C ma, se vuoi una mano scrivi pure in mailbox...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply


Non e' cosi' immediato, comunque proviamo; mi riferico a un C a 32 bit.
int   =  long
unsigned int   =   long  (non esiste la corrispondenza vera, in VB i long
sono solo con segno)
long = long
unsigned long = long (come per unsigned int)
short = integer
unsigned short = integer (non esiste la corrispondenza vera, in VB i interi
sono solo con segno)
char = Byte  (il tipo Byte del basic e' "unsigned" (senza segno) mentre in C
e' con segno)
unsigned char = Byte  (questo corrispone correttamente)
BOOL = Long  (incredibile ma vero)
char * = String
Questa e' una corrispondenza delicata, e puo' essere usata SOLO nelle
dichiarazioni dele API. Piu' esattamente un parametro di una API con "char
*xyz" si traduce con un "BYVAL xyz String".
TUTTI si Handle sono Long
Tutti i puntatori sono Long, esempio  "int *pippo" oppure "short *pippo"
oppure "char *pippo" anche se nel paramentri delle API vanno trattati come
variabili passate per riferimento (byref) mentre "char *pippo" e'
un'eccezione inquanto il "char *" in C sarebbero le strinche, quindi nelle
API si traduce in un passaggio di stringa per valore "byval" a non per
riferimento.
Nelle API.
Nelle api i parametri di tipo puntatore ("int *pippo" oppure "short *pippo"
oppure "struct DefFile *file") devono essere passate per riferimanto (BYREF)
mentre i parametri di tipo normale (int, long, short, struct DefFile file)
vanno passati per VALORE. Come gia' detto, "char *" fa eccezzione, inquanto
e' una stringa passata per valore (BYVAL).
Esempi:
BOOL IsChild(  HWND hWndParent, HWND hWnd  );
Public Declare Function IsChild Lib "user32" Alias "IsChild" (ByVal
hWndParent As Long, ByVal hwnd As Long) As Long
int lstrcmp( LPCTSTR lpString1, LPCTSTR lpString2 );
Public Declare Function lstrcmp Lib "kernel32" Alias "lstrcmpA" (ByVal
lpString1 As String, ByVal lpString2 As String) As Long
int MulDiv(   int nNumber, int nNumerator, int nDenominator );
Public Declare Function MulDiv Lib "kernel32" Alias "MulDiv" (ByVal nNumber
As Long, ByVal nNumerator As Long, ByVal nDenominator As Long) As Long
Esempio in C:
struct MioTipo =
{
   int campo1;
   short campo2;
   unsigned char vettore[6];  ' nel C per fare un vettore di 6 elementi (da
0 a 5) va indicato 6
};
short EsempioInesistente( int *qta, long valore, char *Titolo, struct
MioTipo *tipo )
equivalente in VB:
Type MioTipo
    campo1 as long
    campo2 as integer
    vettore(5) as Byte  ' in VB per fare un vettore di 6 elementi (da 0 a 5)
va indicato 5
End Type
Public Declare Function EsempioInesistente Lib "booo.dll" (ByRef qta As
Long, ByVal valore As Long, ByVal Titolo As String, Byref tipo as MioTipo)
As integer
Lo so, come spiegazione e' stata incasinata, e lacunosa, ma in effetti, per
saper fare corrette conversioni, occorre conoscere il C.
Ciao
By -MES-   Maronese Ettore
http://www.maronese.com/mes
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://www.murialdo.it/it_lang_vb

 Non e' cosi' immediato, comunque proviamo; mi riferico a un C a 32 bit.
[...]

...

Ho notato una cosa: nelle dichiarazioni API non viene specificato in quale
DLL sono collocate!
E io come faccio a capirlo? Tiro a indovinare?
--
Umberto Meroni
[
http://www.ubi1k.com
] [
http://www.ubi1k-vb.net
]
[Come contattarmi: 
http://www.ubi1k.com/meroni
]


 E io come faccio a capirlo? Tiro a indovinare?
direi di no. piuttosto, rileggendo la dich. api:
Declare Function ShellExecute Lib "shell32" _
Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, _
ByVal lpDirectory As String, ByVal nShowCmd As Long) _
As Long
direi che stia nella [dyn. link] lib[rary] shell32[.dll] della prima riga:
C:\windows\system\SHELL32.DLL
C:\windows\system\SHELL.DLL
suppongo che la seconda sia quella dell'api 16 di win3x.
ciao, a.

 wrote in message 8967ad$a8p$1...@nslave1.tin.it...


> Mi riferivo alle chiamate API del C!
1) Se hai l'help dell'SDK, premi il pulsante [Quick Info]
dove è riportato il nome della libreria.
Se trovi, ad esempio, kernel32.lib basta specificare
"kernel32" nella dichiarazione VB.
2) Copi il nome della funzione, apri l'Api test viewer
incolli e trovi la sintassi VB.

 incolli e trovi la sintassi VB.
Sto convertendo le API di Windows 2000, non le trovo da nessuna parte
nell'API viewer, č proprio questo il problema.
Tirerň a indovinare...

anche agli altri.
Esistono standard di fatto.
Sotto Windows 32 lo standard č int 32, long 32, short 16, char 8.
Per ragioni di mercato, nessun produttore di compilatori si azzarderebbe mai
a fare un C/C++ sotto win32 che esca da questi schemi, che quindi risultano
validissimi per gli scopi di Umberto.
Le differenze non sono nemmeno in funzione dei microprocessori, come sarebbe
+ ovvio, ma in genere le si hanno solamente tra sistemi operativi
differenti, ma non all'interno degli stessi.
Per quanto riguarda Umberto, quasi quasi, mi sentirei di consigliargli di
studiare ed imarare il C/C++, anche solo per conoscenza, inquanto quel
linguaggio allarga i confini dei programmatori.
Ettore Maronese
http://www.maronese.com/mes

 Tirerò a indovinare...
La MSDN non ti aiuta ? Prova da queste parti:
http://support.microsoft.com/servicedesks/msdn/search/default.htm
http://search.microsoft.com/us/dev/
http://msdn.microsoft.com/resources/libraries.asp?MSCOMTB=ICP_LIBRARIES
Bye, G.
--
---------------------------------------------
    Le risposte alle tue domande le trovi
    sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
       ... e nell'help in linea !
---------------------------------------------
Real E-address: 
gaet...@hotmail.com

 > Tirerň a indovinare...


 nell'API viewer, č proprio questo il problema.
Ma che versione di VB hai ?
Comunque, posta il nome delle funzioni in questione
cosě ci si fa un idea. Se hai le dichiarazioni in C, sicuramente
ho il .h in cui č definita.

 ho il .h in cui č definita.
Quella in questione č praticamente la nuova GetVersionEx, quindi presumo sia
nella stessa DLL di GetVersionEx.
La mia era una domanda piů che altro teorica, ovvero: se mi trovo davanti
una dichiarazione di una chiamata e non viene specificata la DLL, come
faccio a capirlo? (potrebbe servirmi andando avanti a tradurre 'ste
chiamate...)
Grazie,
Ubi

 Ma i file .h dove sono reperibili?
In Visual Studio, per esempio, o nell'SDK
SP_COPY_DELETESOURCE  =  &H0000001   ' delete source file on successful copy
SP_COPY_REPLACEONLY &H0000002  ' copy only if target file already present
SP_COPY_NEWER  =  &H0000004   ' copy only if source newer than or same as target
SP_COPY_NEWER_OR_SAME  =  SP_COPY_NEWER
SP_COPY_NOOVERWRITE  =  &H0000008   ' copy only if target doesn't exist
SP_COPY_NODECOMP  =  &H0000010   ' don't decompress source file while copying
SP_COPY_LANGUAGEAWARE  =  &H0000020   ' don't overwrite file of different language
SP_COPY_SOURCE_ABSOLUTE  =  &H0000040   ' SourceFile is a full source path
SP_COPY_SOURCEPATH_ABSOLUTE  =  &H0000080   ' SourcePathRoot is the full path
SP_COPY_IN_USE_NEEDS_REBOOT  =  &H0000100   ' System needs reboot if file in use
SP_COPY_FORCE_IN_USE  =  &H0000200   ' Force target-in-use behavior
SP_COPY_NOSKIP  =  &H0000400   ' Skip is disallowed for this file or section
SP_FLAG_CABINETCONTINUATION  =  &H0000800   ' Used with need media notification
SP_COPY_FORCE_NOOVERWRITE  =  &H0001000   ' like NOOVERWRITE but no callback nofitication
SP_COPY_FORCE_NEWER  =  &H0002000  ' like NEWER but no callback nofitication
SP_COPY_WARNIFSKIP  =  &H0004000  ' system critical file: warn if user tries to skip
SP_COPY_NOBROWSE  =  &H0008000  ' Browsing is disallowed for this file or section
SP_COPY_NEWER_ONLY  =  &H0010000  ' copy only if source file newer than target

 In Visual Studio, per esempio, o nell'SDK
Sono reperibili online? Per esempio, su MSDN?
Mi basta un si o un no (se lo sai), poi me li cerco da me.
Grazie ancora!
--
Umberto Meroni
[
http://www.ubi1k.com
] [
http://www.ubi1k-vb.net
]
[Come contattarmi: 
http://www.ubi1k.com/meroni
]
---
Tre cose solamente m'ènno in grado,
le quali non posso ben fornire,
cioè la donna, la taverna e 'l dado...
---

 linguaggio allarga i confini dei programmatori.
Ci avevo già pensato, ma... io ho praticamente sempre programmato in BASIC e
Visual Basic, conosco le basi del PERL (quanto mi basta per realizzare CGI)
ma... Passare dal VB al C/C++ sarebbe molto brusco! Il problema è che temo
di non avere neanche il tempo materiale per impararlo, purtroppo.
Mi ha sempre affascinato, anche perchè credo che ogni programmatore lo
dovrebbe conoscere, solo che... mah, magari riesco a impararlo questa
estate.
Finito di scrivere questo messaggio procederò all'installazione di Windows
2000: se non mi vedete nei prossimi giorni è perchè mi si è fuso il PC! ;O)
Ciao e grazie di tutto,
Ubi

 2000: se non mi vedete nei prossimi giorni è perchè mi si è fuso il PC!
;O)
Non ci credo: l'installazione di Windows 2000 è andata a buon fine subito!
Wow, dev'essere il mio giorno fortunato!
Scusate l'OT ;o)

SP_COPY_REPLACEONLY &H0000002  ' copy only if target file already present
[CLIP]
Visto umberto :-)
Le anime pie in questo NG non amncano :-))
Grande Jimi ^_^


 Le anime pie in questo NG non amncano :-))
Non ne ho mai dubitato! ;o)

 linguaggio allarga i confini dei programmatori.
Sarebbe come consigliare a qualcuno di imparare il tedesco per riuscire a
dir cose sensate... quello che conta č l'analisi dell'universo dei problemi;
il linguaggio conta meno di quanto appare a prima vista.
Che poi con il C/C++ (o, ancora meglio, il Pascal) si riesca piů facilmente
a capire come va gestita la memoria, non si discute; ma il termine
"programmare" č alquanto piů vasto.
Just my two cents.

 Just my two cents.
'twas just my ol' nickel
see you, pal