Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202

    VB6 gestire return unsigned long from DLL C

    Ciao a tutti,

    Ho una DLL scritta in C.
    La documentazione mi fornisce queste info :
    codice:
    Function
    ND2_ERR ND2GetHostIP ( const char* hostname,
    unsigned long* ip
    )
    Parameters
    hostname Pointer to a C-string containing the IP address or the host name of the ND 287
    ip [return value] Pointer to a variable to which the IP address of the ND 287 is saved

    Il mio programma in VB6 è in questo modo :

    Private Declare Function ND2GetHostIP Lib "ND2_DLL.dll" (ByVal hostname As String, ByRef ip As Byte) As ND2_ERR

    Private Sub bttRead_Click()
    Dim res As ND2_ERR
    Dim ip As Byte
    Dim host As String

    host = "192.168.000.002"
    res = ND2GetHostIP(host, ip)
    txtRiga.Text = ip
    End Sub

    hostname non è un problema perchè è string, ND2_ERR neanche perchè è un typedef convertito in enum.
    Lo stronzo è ip, il quale vuole un unsigned long e non so come crearlo in vb6 dato che il tipo di dato non esiste.
    Se io lo creo come long mi da come errore di Convenzione, se provo a non dichiarare il tipo di dati mi solleva eccezzione.

    Non so che tipo di dati usare.
    Che mestiere difficile.....essere da soli ancora di più

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Intanto non c'è bisogno di usare parolacce...

    Per quel dato ci vuole un puntatore all'unsigned long quindi ti basta passare un long byref
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Aggiungo che mi sa che il problema sta da un'altra parte. Dato che viene evidenziato un problema di "convenzione di chiamata", se le funzioni sono scritte con la convenzione cdecl allora NON potrai utilizzarla direttamente da VB6 perché il VB6 usa la convenzione stdcall.

    Dovrai scrivere tu una tua DLL che funzioni da wrapper offrendo le stesse funzioni con la convenzione stdcall verso il VB6 e che chiamano la DLL originale.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    Ciao oregon,

    Grazie per il tuo contributo.
    Mi scuso per la parolaccia usata, ma tengo precisare (anche se inutile) era sarcastica senza l'intenzione di offendere nessuno.
    Anche prima ho provato ad utilizzare il long byref e il risultato è sempre l'errore di convenzione.
    Con la seconda risposta penso che ci hai azzeccato in pieno.
    Infatti io da .net per utilizzare la DLL devo dichiarare i metodi in questo modo :
    <DllImport("ND2_DLL.DLL", CharSet:=CharSet.Ansi, CallingConvention:=CallingConvention.Cdecl)>

    Per creare la DLL wrapper posso utilizzare C?

    Ciao e grazie mille per il tuo aiuto.
    PAolo
    Che mestiere difficile.....essere da soli ancora di più

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quote Originariamente inviata da Fractals87 Visualizza il messaggio
    Mi scuso per la parolaccia usata, ma tengo precisare (anche se inutile) era sarcastica senza l'intenzione di offendere nessuno.
    Sicuramente, non è un gran probema ...

    Per creare la DLL wrapper posso utilizzare C?
    Sì, utilizzi il C.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.