Domanda

Ho una DLL di Windows che ho scritto, scritta in C/C++ (tutte le funzioni esportate sono "C").La DLL funziona bene per me in VC++.Ho dato la DLL a un'altra società che sviluppa tutto in VB.Sembra che abbiano problemi con il collegamento alle funzioni.Non uso VB da dieci anni e non l'ho nemmeno installato.Quale potrebbe essere il problema?

Ho dichiarato tutte le mie funzioni pubbliche come segue:

#define MYDCC_API __declspec(dllexport)


MYDCCL_API unsigned long MYDCC_GetVer( void);
.
.
.

Qualche idea?


Finalmente sono tornato a questo oggi e l'ho fatto funzionare.Le risposte mi hanno messo sulla strada giusta, ma ho trovato questa molto utile:

http://www.codeproject.com/KB/DLL/XDllPt2.aspx

Inoltre, ho avuto alcuni problemi nel passaggio delle stringhe alle funzioni DLL, ho trovato utile questo:

http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml


È stato utile?

Soluzione

Usando __declspec per l'esportazione, il nome della funzione verrà esportato mutilato, cioè.contenere informazioni sul tipo per aiutare il compilatore C++ a risolvere gli sovraccarichi.

VB6 non può gestire nomi alterati.Per ovviare al problema, devi scomporre i nomi.La soluzione più semplice è collegare il file DLL utilizzando un file definizione di esportazione file in VC++.Il file di definizione dell'esportazione è molto semplice e contiene solo il nome della DLL e un elenco di funzioni esportate:

LIBRARY mylibname
EXPORTS
    myfirstfunction
    secondfunction

Inoltre è necessario specificare il stdcall convenzione di chiamata perché è l'unica convenzione di chiamata che VB6 può gestire.Esiste un progetto che utilizza l'iniezione di assembly per gestire le chiamate C, ma immagino che tu non voglia utilizzare questo metodo difficile e soggetto a errori.

Altri suggerimenti

Prova ad aggiungere __stdcall alla fine

#define MYDCC_API __declspec(dllexport) __stdcall

Abbiamo alcune DLL C++ che interagiscono con le nostre vecchie app VB6 e alla fine ce l'hanno tutte.

Una DLL VB6 è sempre una DLL COM.Descriverò un esempio nel minor numero di parole possibile.Supponiamo di avere un progetto DLL ActiveX in VB6 con una classe chiamata CTest che contiene un metodo come mostrato di seguito

Funzione pubblica vbConcat(ByVal a come stringa, ByVal b come stringa) come stringa vbConcat = a & b Funzione finale

e il nome del progetto è stato impostato come VBTestLib nelle proprietà del progetto VB6 e il progetto è stato compilato come F:\proj\VB6\ActiveXDLL\VBTestDLL.dll

È necessario registrare la dll utilizzando il comando di Windows regsvr32 F:\proj\VB6\ActiveXDLL\VBTestDLL.dll

ora il tuo codice C++:

#import "F:\proj\VB6\ActiveXDLL\VBTestDLL.dll" utilizzando lo spazio dei nomi VBTestLib;

void CDialogTestDlg::OnButton1() {

 HRESULT hresult;
 CLSID clsid;
 _CTest *t; // a pointer to the CTest object
 _bstr_t bstrA = L"hello";
 _bstr_t bstrB = L" world"; 
 _bstr_t bstrR;
 ::CoInitialize(NULL);
  hresult=CLSIDFromProgID(OLESTR("VBTestLib.CTest"), &clsid);
  hresult= CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                               __uuidof(_CTest),(LPVOID*) &t);
  if(hresult == S_OK)
  {
     bstrR  = t->vbConcat(bstrA , bstrB);
     AfxMessageBox((char*)bstrR);
   }

}

Questo è tutto, per iniziare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top