Discussione:
dll in vb.net da richiamare in delphi
(troppo vecchio per rispondere)
ciccio
2005-01-21 10:16:15 UTC
Permalink
Ciao a tutti.
Ho provato a creare una semplicissima dll in dotNet e a richiamarla in un
altro progetto dotNet: fino a qua nessun problema.
I problemi iniziano a venir fuori quando cerco di richiamare la funzione
contenuta in questa dll da un'applicazione delphi: il programma non fa
neanche in tempo a partire che mi solleva l'eccezione "Applicazione non
correttamente inizializzata (0xc000007b)".

Ecco il codice della dll:

Public Class Class1

Public Shared Function Quadrato (ByVal numero As Integer) As Integer
Return numero * numero
End Function

End Class

Credo si debba inserire qualche direttiva ma non riesco a capire come.

Ciao e grazie.
Corrado Cavalli [MVP]
2005-01-21 20:28:37 UTC
Permalink
Non conosco Delphi e tantomeno so, quale versione dello stesso stai
utilizzando, potrebbe essere che DelpHi voglia Dll COM quindi devi fare in
modo che la Dll .NET sia visibile anche dal mondo COM
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconexposingnetframeworkcomponentstocom.asp

HTH
--
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - http://www.ugidotnet.org
Weblog: http://blogs.ugidotnet.org/corrado
ciccio
2005-01-24 11:32:40 UTC
Permalink
Post by Corrado Cavalli [MVP]
utilizzando, potrebbe essere che DelpHi voglia Dll COM
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconexposingnetframeworkcomponentstocom.asp
Post by Corrado Cavalli [MVP]
HTH
ti ringrazio per la risposta. appena posso provo e poi faccio sapere.
Ciao e ancora grazie
ciccio
2005-01-24 11:41:07 UTC
Permalink
Scusate se posto un altro messaggio ma mi è venuta in mente un'altra cosa:
come faccio a inserire la direttiva stdcall.

Nella dll in delphi faccio una cosa del genere:

procedure FaiQualcosa (parametri); stdcall;


In dotNet come posso procedere? Grazie.
Corrado Cavalli [MVP]
2005-01-24 12:55:01 UTC
Permalink
DllImport("mydll.dll", CallingConvention=CallingConvention.StdCall)]

HTH
--
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - http://www.ugidotnet.org
Weblog: http://blogs.ugidotnet.org/corrado
ciccio
2005-01-25 10:12:07 UTC
Permalink
Post by Corrado Cavalli [MVP]
DllImport("mydll.dll", CallingConvention=CallingConvention.StdCall)]
Prima di tutto grazie per la risposta. Questo va bene per richiamarla con la
direttiva stdcall, ma io vorrei poterla dichiarare nella mia Libreria di
Classi (da cui creo la dll) con la suddetta direttiva. E' possibile?
Corrado Cavalli [MVP]
2005-01-25 19:22:50 UTC
Permalink
Se la tua library e' un assembly .NET non e' possibile, stdcall vale solo
per le library "old style"

HTH
--
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - http://www.ugidotnet.org
Weblog: http://blogs.ugidotnet.org/corrado/
ciccio
2005-01-26 08:15:24 UTC
Permalink
Post by Corrado Cavalli [MVP]
Se la tua library e' un assembly .NET non e' possibile, stdcall vale solo
per le library "old style"
Anche le altre direttive sono "old style"?
Grazie.
Corrado Cavalli [MVP]
2005-01-26 08:52:51 UTC
Permalink
Quali altre direttive?, la differenza e' tra una dll 'classica' ovvero vista
come un insieme di funzioni (es Win32) e le dll viste come un insieme di
classi (.NET/COM)
--
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - http://www.ugidotnet.org
Weblog: http://blogs.ugidotnet.org/corrado/
ciccio
2005-01-26 13:08:05 UTC
Permalink
Post by Corrado Cavalli [MVP]
Quali altre direttive?, la differenza e' tra una dll 'classica' ovvero vista
come un insieme di funzioni (es Win32) e le dll viste come un insieme di
classi (.NET/COM)
ok, ma io posso in .NET creare una dll classica in modo da poterla usare in
un'altra applicazione creata con un linguaggio diverso? Da quanto ho potuto
evincere dalle tue risposte credo di no.
Grazie lo stesso.
Ciao
tomb
2005-01-26 13:22:28 UTC
Permalink
Post by ciccio
ok, ma io posso in .NET creare una dll classica in modo da poterla usare in
un'altra applicazione creata con un linguaggio diverso? Da quanto ho potuto
evincere dalle tue risposte credo di no.
certo, puoi creare una dll COM.

bai
t
Corrado Cavalli [MVP]
2005-01-26 13:45:53 UTC
Permalink
Post by ciccio
Post by Corrado Cavalli [MVP]
Quali altre direttive?, la differenza e' tra una dll 'classica'
ovvero vista come un insieme di funzioni (es Win32) e le dll viste
come un insieme di classi (.NET/COM)
ok, ma io posso in .NET creare una dll classica in modo da poterla
usare in un'altra applicazione creata con un linguaggio diverso? Da
quanto ho potuto evincere dalle tue risposte credo di no.
Grazie lo stesso.
Ciao
Se vuoi creare una dll classica devi usare Visual C++, altrimenti puoi
creare una dll library e renderla visibile al mondo COM (ad esempio usabile
da VB6)

HTH
--
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - http://www.ugidotnet.org
Weblog: http://blogs.ugidotnet.org/corrado
ciccio
2005-01-26 15:26:09 UTC
Permalink
Grazie ad entrambi per la risposta.

Come da esempio .NET ,e se non ho male interpretato i vostri consigli, ho
fatto:


<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
Public Class ComClass1
#Region "COM GUIDs"
Public Const ClassId As String = "7666AC25-855F-4534-BC55-27BF09D49D46"
Public Const InterfaceId As String =
"54388137-8A76-491e-AA3A-853E23AC1217"
Public Const EventsId As String = "EA329A13-16A0-478d-B41F-47583A761FF2"
#End Region

Public Sub New()
MyBase.New()
End Sub

Function AddNumbers(ByVal X As Integer, ByVal Y As Integer)
AddNumbers = X + Y
End Function
End Class


Tutto questo perchè, sempre come da help .NET, è il modo più veloce per
creare oggetti COM (in questo caso oggetto=DLL ?).
Il risultato però non cambia.

Ciao e grazie.
Corrado Cavalli [MVP]
2005-01-26 16:21:44 UTC
Permalink
Post by ciccio
Il risultato però non cambia.
Cosa non funziona?, hai registrato la dll oppure, se sei sulla stessa
macchina, selezionato Register for COM interop?
--
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - http://www.ugidotnet.org
Weblog: http://blogs.ugidotnet.org/corrado
tomb
2005-01-26 16:35:14 UTC
Permalink
Post by ciccio
Grazie ad entrambi per la risposta.
Come da esempio .NET ,e se non ho male interpretato i vostri consigli, ho
[cut]

Hai messo tra le Configuration Properties delprogetto
la propietà Register for COM Interop a True?

bai
t
ciccio
2005-01-26 16:43:42 UTC
Permalink
L'errore è quello riportato nel mio primo messaggio ("Applicazione non
correttamente inizializzata (0xc000007b)") , mentre per quanto riguarda il
"Registra per interoperabilità COM" è a true. La dll non l'ho registrata
visto che risiede sulla stessa macchina.
tomb
2005-01-26 17:15:52 UTC
Permalink
Post by ciccio
L'errore è quello riportato nel mio primo messaggio ("Applicazione non
correttamente inizializzata (0xc000007b)") , mentre per quanto riguarda il
"Registra per interoperabilità COM" è a true. La dll non l'ho registrata
visto che risiede sulla stessa macchina.
giusto per prova, esegui un regsvr32 su un altro pc,
va a buon fine la registrazione?

bai
t
ciccio
2005-01-27 09:26:14 UTC
Permalink
Post by tomb
giusto per prova, esegui un regsvr32 su un altro pc,
va a buon fine la registrazione?
Mi da il seguente errore:

"ClassLibrary1.dll è stato caricato, ma il punto d'ingresso
DllRegisterServer non è stato trovato. Questo file non può essere
registrato."

ciao
Corrado Cavalli [MVP]
2005-01-27 09:34:00 UTC
Permalink
Non ci siamo,
In .NET non puoi creare dll di quel tipo (se le vuoi creare devi farle in
VC++), ma solo dll che contengono "classi".
Per utilizzarle devi impostare un riferimento alla dll, creare istanze delle
classi e usarne i metodi, come si faccia tutto questo in Delphi non ne ho
idea ma sono sicuro che si può fare.
--
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - http://www.ugidotnet.org
Weblog: http://blogs.ugidotnet.org/corrado
ciccio
2005-01-27 11:01:20 UTC
Permalink
Post by Corrado Cavalli [MVP]
Per utilizzarle devi impostare un riferimento alla dll, creare istanze delle
classi e usarne i metodi, come si faccia tutto questo in Delphi non ne ho
idea ma sono sicuro che si può fare.
In delphi per usare classi e metodi esterni si usano i Packages, ma credo
che si possa fare anche con le DLL (anche se non è consigliato).
Per adesso ti ringrazio (ringrazio anche tomb per l'interessamento) e appena
ho risolto (lavoro permettendo, visto queste sono solo mie prove) vi faccio
sapere.
Ciao e ancora grazie.

Corrado Cavalli [MVP]
2005-01-26 17:14:16 UTC
Permalink
Post by ciccio
L'errore è quello riportato nel mio primo messaggio ("Applicazione non
correttamente inizializzata (0xc000007b)") , mentre per quanto
riguarda il "Registra per interoperabilità COM" è a true. La dll non
l'ho registrata visto che risiede sulla stessa macchina.
Cosa usi per testare la dll e come la invochi?
--
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - http://www.ugidotnet.org
Weblog: http://blogs.ugidotnet.org/corrado
ciccio
2005-01-27 09:24:37 UTC
Permalink
Post by Corrado Cavalli [MVP]
Cosa usi per testare la dll e come la invochi?
per testarla ho creato una semplice applicazione in .NET (e non ci sono
stati problemi) e in seguito una semplice applicazione Delphi;
per invocarla in Delphi (dove mi da problemi):

la "dichiaro" così:

function Quadrato (numero: integer) : integer; external 'ClassLibrary1.dll';


e la uso in questo modo:

TextBox1.Text:= integer (Quadrato (10))
Loading...