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


Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top