Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    247

    [DELPHI/C++] Creare una DLL in Visual C++ e utilizzarla in Delphi

    Salve a tutti,

    ho una piccola libreria che ho realizzato in C++ tanto tempo fa. Vorrei compilarla come DLL in Visual Studio e quindi utilizzarla in Delphi.
    Come al solito sono una testa dura e non ci riesco!

    Vi faccio un esempio: vi prego di dirmi se il mio procedimento è giusto.

    La libreria C++ è costituita da due file, MyLib.h e MyLib.cpp


    codice:
    ////////////// Interfaccia MyLib.h //////////////
    
    #define ExportToDLL __declspec(dllexport)
    
    class ExportToDLL CMyLib
    {
    private:
    	int MyVar1;
            int MyVar2;
            // ecc........
    
    public:
            CMyLib(); // COSTRUTTORE
    	int MyFunction();
            // ecc........
    };

    codice:
    ////////////// Classe MyLib.cpp //////////////
    
    #include "MyLib.h"
    
    CMyLib::CMyLib() // COSTRUTTORE
    { }
    
    int CMyLib::MyFunction() {
             return 5;
    }
    codice:
    ////////////// Wrapper MyLib.pas //////////////
    unit MyLib;
    uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, StrUtils;
    
    
    interface
    
    function MyFunction(): Integer; stdcall;
    
    
    implementation
    
    function MyFunction; external 'MyLib.dll' name 'MyFunction';
    
    
    initialization
    
    ShowMessage(IntToStr(MyFunction()));
    
    
    end.

    Tutto viene creato correttamente, la DLL viene compilata senza problemi (Tdump.exe, analizzandola, lista la classe esportata). In teoria dovrebbe funzionare, ma perché non va???
    Quando lo eseguo "impossibile trovare il punto d'ingresso della procedura MyFunction".

  2. #2

    Creare una DLL in Visual C++ e utilizzarla in Delphi

    Ciao,

    allora la risposta è semplice. La funzione non viene trovata perchè in realtà il nome esportato nella DLL non è MyFunction, ma es. nMyFunction@@YAHXZ, cioè viene aggiunta la function decoration per il mangling dei nomi, in quanto c'è differenza fra C e C++ nell'esportazione dei nomi di funzione, etc, cmq...

    per farla breve prova a cambiare il codice nel file MyLib.cpp

    int CMyLib::MyFunction()
    con

    extern "C" ExportToDLL int MyFunction(void)
    così dovrebbe andare...

    bye
    alex

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    247

    Re: Creare una DLL in Visual C++ e utilizzarla in Delphi

    Se cambio
    codice:
    int CMyLib::MyFunction()
    con
    codice:
    extern "C" ExportToDLL int MyFunction(void)
    Delphi riesce ad accedere alla funzione correttamente. Ti ringrazio!


    Mi sorge un dubbio, però... Togliendo il prefisso "CMyLib::", come fa il compiler a sapere che la funzione MyFunction appartiene alla classe CMyLib? Lo apprende dall'header?

    Grazie ancora!

  4. #4

    Creare una DLL in Visual C++ e utilizzarla in Delphi

    Ciao,

    si firefox88 è esatto, infatti questo è dovuto alla prototipizzazione obbligatoria del C++! E poi, cmq, puoi anche scrivere:

    extern "C" ExportToDLL int CMyLib::MyFunction(void)
    e il risultato non cambia, in quanto il namespace è come se fosse, in un certo senso, "sottinteso" VVoVe: (definizione orrenda cmq rende l'idea!)


    bye
    alex

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2005
    Messaggi
    247

    Re: Creare una DLL in Visual C++ e utilizzarla in Delphi

    Originariamente inviato da alexsigest
    prototipizzazione obbligatoria del C++!
    Prototipizzazione obbligatoria? Intendi: "non si possono creare due metodi con lo stesso nome appartenenti a due classi diverse"?


    E poi, cmq, puoi anche scrivere [...]
    Sembra di no... se scrivo extern "C" ExportToDLL int CMyLib::MyFunction()" nel file .cpp e compilo la DLL, lì per lì nessun problema, poi Delphi non riesce ad accedervi. :master:

  6. #6

    Creare una DLL in Visual C++ e utilizzarla in Delphi

    No, per prototipizzazione intendo che è OBBLIGATORIO definire nel file .hpp i prototipi di tutte le funzioni presenti nel .cpp! Certo puoi utilizzare due metodi con lo stesso nome in due classi diverse ma devi poi specificare a quale classe appartengono es. CMyLib::MyFunction, CMyLib2::MyFunction.

    Cmq per il problema del linking c'è sempre il solito intoppo del mangling dei nomi. Prova ad utilizzare qualsiasi tool (io uso PE Explorer) per visualizzare le funzioni esportate dalla Dll e utilizzando gli stessi nomi in Delphi prova a chiamare le funzioni!

    bye
    alex

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 © 2024 vBulletin Solutions, Inc. All rights reserved.