2008-09-02 8 views
2

J'ai une DLL Windows que j'ai écrite, écrite en C/C++ (toutes les fonctions exportées sont 'C'). La DLL fonctionne bien pour moi dans VC++. J'ai donné la DLL à une autre société qui fait tout leur développement en VB. Ils semblent avoir un problème de liaison avec les 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?Appel des fonctions DLL à partir de VB6

J'ai déclaré mes fonctions publiques comme suit:

#define MYDCC_API __declspec(dllexport) 


MYDCCL_API unsigned long MYDCC_GetVer(void); 
. 
. 
. 

Toutes les idées?


Finalement, je suis revenu à ça aujourd'hui et je l'ai fait fonctionner. Les réponses me mettre sur la bonne voie, mais je trouve cela plus utile:

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

Aussi, j'ai eu quelques problèmes chaînes vers les fonctions DLL, je trouve cela utile:

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


Répondre

4

en utilisant __declspec pour l'exportation, le nom de la fonction sera exportée se mutilée, par exemple contiennent des informations de type pour aider le C++ compiler r résoudre les surcharges.

VB6 ne peut pas gérer les noms tronqués. Pour contourner le problème, vous devez supprimer les noms. La solution la plus simple consiste à lier le fichier DLL à l'aide d'un fichier export definition dans VC++. Le fichier de définition d'exportation est très simple et ne contient que le nom de la DLL et une liste des fonctions exportées:

LIBRARY mylibname 
EXPORTS 
    myfirstfunction 
    secondfunction 

De plus, vous devez spécifier la stdcall convention d'appel parce que c'est la seule convention d'appel VB6 peut gérer. Il y a un projet utilisant l'injection d'assemblage pour gérer les appels C mais je suppose que vous ne voulez pas utiliser cette méthode difficile et sujette aux erreurs.

3

Essayez d'ajouter __stdcall à la fin

#define MYDCC_API __declspec(dllexport) __stdcall 

Nous avons quelques C++ dll qui interagissent avec nos anciennes applications VB6 et ils ont tous à la fin.

0

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 un As String, ByVal b As String) As String vbConcat = a & b End Function

et que vous avez défini le nom du projet comme VBTestLib dans les propriétés du projet VB6 et vous avez compilé le projet F: \ proj \ VB6 \ ActiveXDLL \ VBTestDLL.dll

vous devez enregistrer le dll en utilisant Windows commande regsvr32 F: \ proj \ VB6 \ ActiveXDLL \ VBTestDLL.dll

maintenant votre code C++:

#import "F: \ proj \ VB6 \ ActiveXDLL \ VBTestDLL.dll" using namespace VBTestLib;

vide 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); 
    } 

}

Voilà tout ce qui est à elle, pour commencer au large.

+1

Vous avez ceci en arrière. La question était pour l'exportation de C++ et l'importation à VB6. –

Questions connexes