Question
J'ai une DLL Windows que j'ai écrite, écrite en C/C++ (toutes les fonctions exportées sont en « C »).La DLL fonctionne bien pour moi dans VC++.J'ai donné la DLL à une autre société qui réalise tout son développement en VB.Ils semblent avoir un problème de connexion aux fonctions.Je n'ai pas utilisé VB depuis dix ans et je ne l'ai même pas installé.Quel pourrait être le problème?
J'ai déclaré toutes mes fonctions publiques comme suit :
#define MYDCC_API __declspec(dllexport)
MYDCCL_API unsigned long MYDCC_GetVer( void);
.
.
.
Des idées?
J'y suis finalement revenu aujourd'hui et je l'ai fait fonctionner.Les réponses m'ont mis sur la bonne voie mais j'ai trouvé ceci très utile :
http://www.codeproject.com/KB/DLL/XDllPt2.aspx
De plus, j'ai eu quelques problèmes pour transmettre des chaînes aux fonctions DLL, j'ai trouvé cela utile :
http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml
La solution
En utilisant __declspec
pour l'exportation, le nom de la fonction sera exporté mutilé, c'est à dire.contiennent des informations de type pour aider le compilateur C++ à résoudre les surcharges.
VB6 ne peut pas gérer les noms mutilés.Pour contourner ce problème, vous devez démêler les noms.La solution la plus simple consiste à lier le fichier DLL à l'aide d'un définition de l'exportation fichier en VC++.Le fichier de définition d'export est très simple et contient juste le nom de la DLL et une liste des fonctions exportées :
LIBRARY mylibname
EXPORTS
myfirstfunction
secondfunction
De plus, vous devez préciser le stdcall
convention d'appel car c'est la seule convention d'appel que VB6 peut gérer.Il existe un projet utilisant l'injection d'assembly pour gérer les appels C, mais je suppose que vous ne voulez pas utiliser cette méthode difficile et sujette aux erreurs.
Autres conseils
Essayez d'ajouter __stdcall à la fin
#define MYDCC_API __declspec(dllexport) __stdcall
Nous avons des DLL C++ qui interagissent avec nos anciennes applications VB6 et elles l'ont toutes à la fin.
Une DLL VB6 est toujours une DLL COM.Je vais décrire un exemple en aussi peu de mots que possible.Supposons que vous ayez un projet DLL ActiveX dans VB6 avec une classe appelée CTest qui contient une méthode comme indiqué ci-dessous
Fonction publique vbConcat (byVal a as String, byVal b as String) as String vbConcat = a & b end function
et vous avez défini le nom du projet en tant que VBtestlib dans les propriétés du projet VB6 et vous avez compilé le projet en tant que f: proj vb6 activexdll vBtestdll.dll
Vous devez enregistrer la DLL à l'aide de la commande Windows Regsvr32 F: Proj VB6 ActiveXdll VBTestdll.dll
maintenant votre code C++ :
#import "f: proj vb6 activexdll vBtestdll.dll" Utilisation de l'espace de noms 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);
}
}
C'est tout ce qu'il y a à faire, pour commencer.