Newsgroup: it.comp.lang.visual-basic
Titolo: [OT] Creazione DLL in Visual C

Abbiate pieta' per l'ot.
A parziale discolpa diro' che la dll che sto cercando di creare in Visual C
mi serve per un programma in Vb6.
Vabbeh come scusa non e' granche', ma sono alla frutta e sul ng specifico di
vc sembra che non ci sia nessuno. :-)
Io ho fatto questo programma in visual c e devo usarlo con un programma in
VB.
All'inizio mi ero rassegnato ad usare un shellexecute per chiamare l'exe del
programma c, ma e' troppo inefficiente.
Quando viene chiamato in loop centinaia di volte mi arriva il messaggio
d'errore "risorse di sistema insufficienti per avviare un altro processo" (o
roba simile)
Ho controllato il sorgente e tutta la memoria allocata viene
rilasciata,credo che sia la solita inefficienza nel ripulire i dati per un
nuovo processo che alla lunga porta all'esaurimento delle risorse.
Comunque ho pensato di risolvere creando una .dll al posto di un.exe
E' la prima volta che faccio una dll e come previsto non e' cosi' semplice
come sembrava.
Ho preso il sorgente c++ (Visual C++ di visual studio6) che corrispondeva
all'exe, e l'ho inserito in un nuovo progetto creato come win32 dll
dinamica.
L'exe funzionava, con la lib invece ottengo dal linker usa serie di errori
come questi:
conv1.obj : error LNK2001: unresolved external symbol _acmStreamConvert@12
conv1.obj : error LNK2001: unresolved external symbol
_acmStreamPrepareHeader@12
conv1.obj : error LNK2001: unresolved external symbol _acmStreamOpen@32
Debug/lib_wave.dll : fatal error LNK1120: 10 unresolved externals
Le varie acm.. che non trova fanno parte della dll msacm32.dll che e'
regolarmente presente in c:\windows\system, non a caso l'exe che la usava
funziona perfettamente.
Ho cercato di risolvere il problema andando in project->setting->link e
inserendo anche il nome di questa libreria tra le altre, ossia "msacm32.dll"
A questo punto il linker mi dice che non puo' aprire l'oggetto "msacm32.dll"
E perche' non lo puo' aprire? :-/
Ho provato anche a definire le funzioni acm che uso come "extern" (non lo
capiva da solo?) ma ottengo solo un errore per ridefinzione di funzione.
E grazie, erano gia' definite nei moduli .h.
Non capisco proprio qual'e' il problema.  :-(
C'e' qualcuno che puo' darmi qualche indizio?
ciao
Paolo B.

[Paolo B.]
[SNIP]
Ecco alcune norme perche' una DLL scritta in VC++ sia utilizzabile da VB6.
Definita la macro
<codice>
#ifdef PROJECTNAME_EXPORTS
#define PROJECTNAME_API __declspec(dllexport)
#else
#define PROJECTNAME_API __declspec(dllimport)
#endif
</codice>
dove PROJECTNAME e' il nome del progetto, le funzioni da esportare vanno
dichiarate/definite come segue:
<pseudocodice>
PROJECTNAME_API *tipo* __stdcall NomeFunzione();
</pseudocodice>
Esempio:
<codice>
PROJECTNAME_API long __stdcall SumLong(long v1, long v2)
{return v1 + v2;}
</codice>
In un file di testo che ha lo stesso nome del file di progetto ma estensione
.def (file di definizioni) inserisci la parola EXPORTS in prima riga, e a
seguire solo i *nomi* delle funzioni. Questo permette di importare le
funzioni in vb con il nome che scrivi e non con il nome "decorato" (e' un
termine tecnico anche se non sembra ;) ) ovvero pieno di chioccioline
underscore numeri e lettere, cosa che fa in automatico VC++.
Esempio:
<file name=projectname.def>
EXPORTS
   SumLong
   NomeFunzione
   EccetraEccetra
</file>
hth,
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt
UGIdotNET - 
http://www.ugidotnet.org

Debug/lib_wave.dll : fatal error LNK1120: 10 unresolved externals
Bisognerebbe conoscere tutti i parametri che l'ide passa a
cl.exe sulla riga di comando.
Il mio sospetto e' che ti manchi la .lib della libreria
che richiami, comunque per un elenco delle possibili cause
prova un po' qua:
Linker Tools Error LNK2001
http://msdn.microsoft.com/library/en-us/vccore98/HTML/lnk2001.asp
-- 
hth, hal


Grazie per le info, mi sono salvato tutto. :-)
Temo pero' che il mio problema attuale non venga risolto dal tipo di
definizioni.
Comunque la macro mi sara' utile se riusciro' a risolverlo. :-)
ciao
Paolo B.

 che richiami,
Puo' darsi che non sia presente nelle molte opzioni al linker, ora provo a
controllare.
Fortunatamente la msacm32.lib esiste nella cartella "lib" di visual studio.
Ora provo ad agganciarla in qualche modo. :-)
grazie
Paolo B.


Allora... l'indizio di hal era giusto (grazie :-) e ora che ho inserito
"msacm32.lib" nei file del linker la libreria viene creata senza problemi.
Ho anche creato il file .def come ha consigliato lokar e ora visual basic
riesce a vedere sia la .dll che la funzione d'entrata.
Sarei molto contento se non che non appena effettuo la chiamata si ha un
errore dell'oleaut32 :-/
Il sorgente della libreria lo ho gia' testato e non credo sia quello il
problema.
Penso invece che il problema sia il passaggio dei parametri dal basic alla
funzione.
Se foste cosi' gentili da dare un'occhiata anche a questi ultimi dati
perche' io non capisco proprio cosa possa essere.
##### Prototipo (dichiarazione) modulo c++ della libreria ##########
__declspec(dllexport) bool __stdcall WavConverter( char *SourceWav, char
*TargetWav, int ConvertKind, char *ErrorLog)
##### Dichiaraazione in modulo.bas #########
Public Declare Function WavConverter Lib "lib_wave.dll" ( _
    ByRef FileSorgente As String, _
    ByRef FileDestinazione As String, _
    ByVal TipoConv As Long, _
    ByRef MexErrore As String) As Boolean
#####  Codice basic di chiamata  ######
Dim MexErrore As String 'per ospitare l'eventuale messaggio d'errore
'solo per debug
MexErrore = String(256, " ")
' ho prova con e senza il chr(0) finale.
If (WavConverter("c:\bazooka.wav" & Chr(0), "c:\new_boz.wav" & Chr(0), 1,
MexErrore) = False) Then
    MexErrore = Trim(MexErrore)
    Call MsgBox("Errore: " & MexErrore)
Else
    Call MsgBox("Ok")
End If
##### Fine codice ######
A me sembra tutto giusto, e allora perche' va in crash? :-(

 A me sembra tutto giusto, e allora perche' va in crash? :-(
Vedi sopra, correggi la Declare e vedrai che tutto funzionerą.
Ciao.
--
BSD is for UNIX lovers - linux is for Windows haters


E' vero, con il byval funziona. :-)
Non che me ne lamenti ma mi piacerebbe capire meglio questa cosa...
Insomma ho sempre pensato che quando si usa il byref viene passato
l'indirizzo della variabile invece che il suo contenuto mentre usando il
byval con le stringhe passa comunque il loro indirizzo?
Vabbeh l'importante e' che ora funzia. :-)
Grazie a tutti
Paolo B.

 comunque il loro indirizzo?
Solo quando passi una stringa VB ad una dll non ActiveX. In tutti gli altri
casi vengono passate per valore se passate ByVal, come ci si aspetta.
