2008-09-02 9 views
2

J'essaie d'appeler la DLL C d'un fournisseur tiers à partir de vb.net 2005 et j'obtiens des erreurs P/Invoke. J'appelle avec succès d'autres méthodes mais j'ai frappé un goulot d'étranglement sur l'un des plus complexes. Les structures impliquées sont horribles et dans le but de simplifier le dépannage, je voudrais créer une DLL C++ pour répliquer le problème.DLL C++ très simple qui peut être appelée à partir de .net

Quelqu'un peut-il fournir le plus petit extrait de code pour une DLL C++ pouvant être appelée à partir de .Net? Je reçois une erreur "Impossible de trouver le point d'entrée nommé XXX dans la DLL" dans ma DLL C++. Cela devrait être simple à résoudre mais je ne suis pas un programmeur C++.

Je voudrais utiliser une déclaration de .net pour la DLL de

Declare Function Multiply Lib "C:\MyDll\Debug\MyDLL.DLL" Alias "Multiply" (ByVal ParOne As Integer, ByVal byvalParTwo As Integer) As Integer 

Répondre

2

Essayez d'utiliser la magie __decspec(dllexport) pixie dust dans votre C++ déclaration de fonction. Cette déclaration définit plusieurs éléments nécessaires à l'exportation réussie d'une fonction à partir d'une DLL. Vous devrez peut-être utiliser WINAPI ou quelque chose de similaire:

__declspec(dllexport) WINAPI int Multiply(int p1, int p2) 
{ 
    return p1 * p2; 
} 

Le WINAPI met en place la fonction convention d'appel tel qu'il est approprié d'appeler d'une langue telle que VB.NET.

0

Vous pouvez essayer d'examiner les fonctions exportées (via DumpBin ou Dependency Walker) et voir si les noms sont mutilés.

0

En utilisant la suggestion de Greg j'ai trouvé les travaux suivants. Comme mentionné, je ne suis pas un programmeur C++ mais j'avais juste besoin de quelque chose de pratique.

MyClass.cpp #include "stdafx.h"

BOOL APIENTRY DllMain(HANDLE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
       ) 
{ 
    return TRUE; 
} 

int _stdcall multiply(int x , int y) 
{ 
    return x*y; 
} 

myclass.def BIBLIOTHÈQUE maclasse

EXPORTS 

multiply @1 

stdafx.cpp #include « stdafx. h "

stdafx.h

// stdafx.h : include file for standard system include files, 
// or project specific include files that are used frequently, but 
//  are changed infrequently 
// 

#if !defined(AFX_STDAFX_H__5DB9057C_BAE6_48D8_8E38_464F6CB80026__INCLUDED_) 
#define AFX_STDAFX_H__5DB9057C_BAE6_48D8_8E38_464F6CB80026__INCLUDED_ 

#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 


// Insert your headers here 
#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers 

#include <windows.h> 


//{{AFX_INSERT_LOCATION}} 
// Microsoft Visual C++ will insert additional declarations immediately before the previous line. 

#endif // !defined(AFX_STDAFX_H__5DB9057C_BAE6_48D8_8E38_464F6CB80026__INCLUDED_) 
Questions connexes