Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

Discussione: VB6 Call dll c++

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

    VB6 Call dll c++

    Ciao a tutti,
    Ho un vecchio programma scritto in vb6, dal quale dovrei importare una dll scritta in c++.
    Su internet ho letto le soluzioni più svariate e confusionarie, mi pare di capire che non sia cosa semplice.
    Per ora non sono ancora in possesso della dll, ma a breve probabilmente si.
    Volevo avere info circostanziali sul fatto che sia possibile o meno e quale strada poter intraprendere.

    Grazie a tutti per l'aiuto

    Ciao
    Paolo
    Che mestiere difficile.....essere da soli ancora di più

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Trattansodi di VB6, sposto nel forum "Visual Basic e .NET Framework".


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    Ops chiedo perdono.. nn me ne sono accorto
    Che mestiere difficile.....essere da soli ancora di più

  4. #4
    Un esempio:

    abbiamo una dll chiamata "Dll.dll" che esporta una funzione chiamata "Messaggio" nelle due versioni ANSI e UNICODE:

    Dll.h
    codice:
    #ifndef _MyDll_H
    #define _MyDll_H
    
    #ifdef DLL_EXPORTS
    #define DLL_API __declspec(dllexport)
    #else
    #define DLL_API __declspec(dllimport)
    #endif
    
    #ifdef __cplusplus
    extern "C" {           
    #endif
    
    extern DLL_API int nDll;
    
    DLL_API void WINAPI MessaggioW(LPCWSTR szMsg);
    DLL_API void WINAPI MessaggioA(LPCSTR szMsg);
    
    #ifdef UNICODE
    #define Messaggio MessaggioW
    #else
    #define Messaggio MessaggioA
    #endif
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif // _MyDll_H

    Dll.cpp
    codice:
    #include "stdafx.h"
    
    #define DLL_EXPORTS
    #include "Dll.h"
    
    #ifdef _MANAGED
    #pragma managed(push, off)
    #endif
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
    
    #ifdef _MANAGED
    #pragma managed(pop)
    #endif
    
    DLL_API void WINAPI MessaggioW(LPCWSTR szMsg)
    {
        WCHAR szTemp[1024];
        ++nDll;
    
        swprintf_s(szTemp, sizeof(szTemp), L"Chiamata UNICODE\n\nMessaggio n° %d:\n%s", nDll, szMsg);
    
        ::MessageBoxW(NULL, szTemp, L"Messaggio", MB_OK);
    }
    
    DLL_API void WINAPI MessaggioA(LPCSTR szMsg)
    {
        CHAR szTemp[1024];
        ++nDll;
    
        sprintf_s(szTemp, sizeof(szTemp), "Chiamata ANSI\n\nMessaggio n° %d:\n%s", nDll, szMsg);
    
        ::MessageBoxA(NULL, szTemp, "Messaggio", MB_OK);
    }


    Per chiamare la funzione da VB6 basta usare l'enunciato Declare:

    Form1.vb
    codice:
    Public Class Form1
    
        Private Declare Unicode Sub MessaggioW Lib "Dll.dll" (ByVal str As String)
        Private Declare Ansi Sub MessaggioA Lib "Dll.dll" (ByVal str As String)
        Private Declare Auto Sub Messaggio Lib "Dll.dll" (ByVal str As String)
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
            ' Chiama la funzione generica
            Messaggio("Ciao a tutti")
    
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    
            ' Chiama la funzione Ansi
            MessaggioA("Sabbenerica a tutti")
    
        End Sub
    
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    
            ' Chiama la funzione Unicode
            MessaggioW("Ciao")
    
        End Sub
    End Class

    La dll deve trovarsi nella cartella di sistema di Windows o nella stessa cartella dell'eseguibile.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    In realtà molto dipende dal tipo di DLL ... è meglio rimandare il discorso a quando avrai effettivamente il file e saprai esattamente di cosa si tratta.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Dimenticavo.

    Per compilare la dll dell'esempio devi usare il seguente file def:

    Dll.def
    codice:
    LIBRARY    "Dll" 
     
    EXPORTS 
        MessaggioW 
        MessaggioA 
        nDll DATA
    Devi specificarlo tra le opzioni del linker:

    Configurations Properties -> Linker -> Input -> Module Definition File = Dll.def

  7. #7
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    Ok dai suggerimenti di Vincenzo 1968 mi sembra molto banale.
    Presumo che devo importare oggetto come COM nel progetto.
    La vado a dichiarare con Declare e poi uso i metodi.

    "La dll deve trovarsi nella cartella di sistema di Windows o nella stessa cartella dell'eseguibile."
    Devo copiarla nella system32 e registrarla?

    Sono venuto in posesso di questa dll.
    Ha estensione .dll

    "Dimenticavo.

    Per compilare la dll dell'esempio devi usare il seguente file def:

    Dll.def
    codice:
    LIBRARY "Dll"

    EXPORTS
    MessaggioW
    MessaggioA
    nDll DATA
    Devi specificarlo tra le opzioni del linker:

    Configurations Properties -> Linker -> Input -> Module Definition File = Dll.def"
    Questo mi serve solo nel caso in cui la dll non è compilata giusto?

    In realtà molto dipende dal tipo di DLL ... è meglio rimandare il discorso a quando avrai effettivamente il file e saprai esattamente di cosa si tratta.
    Come posso capire che tipo di dll ho in mano?
    Non ho idea neanche come posso capire se è ANSI o UNICODE...
    Che mestiere difficile.....essere da soli ancora di più

  8. #8
    Posta l'output del seguente comando:

    codice:
    dumpbin /exports mialibreria.dll
    sostituisci "mialibreria.dll" col nome della tua dll.


    "Devo copiarla nella system32 e registrarla?"

    Dipende. Se è una normale dll(come nell'esempio che ho postato) non c'è bisogno di registrarla(e non lo puoi nemmeno fare). Se invece è una dll ActiveX(OLE), allora si, devi registrarla prima di poterla usare.

    "Questo mi serve solo nel caso in cui la dll non è compilata giusto?"

    Si, serve per compilare l'esempio di cui sopra.

  9. #9
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    Scusate se ci ho messo tanto nel rispondere ma sono stato fuori casa per lavoro e inoltre ho tentato di risolvere il problema senza riuscirci, vi spiego :

    se io da cmd provo ad eseguire dumpbin /exports eib7.dll,
    Mi da un errrore mspdb100.dll non presente.

    Ho provato anche ad accedere da Program Files x86\Microsoft Visual Studio 10.0\VC\bin\x86_amd64\ ed eseguire il comando
    dumpbin.exe /exports %percorsodll%/eib7.dll ma mi da sempre lo stesso errore.

    Da forum online ho provato ad eseguire questo bat

    "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"

    ma il problema è il medesimo.
    Che mestiere difficile.....essere da soli ancora di più

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Puoi far scaricare la dll in questione?
    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.