Comment appeler une dll C++ fichier à partir de Visual Basic 2010
Je suis l'aide de Microsoft Visual Studio 2010 Express: le C++ et VB versions.
- Il y a quelques code VB qui forme le corps d'un programme, et tous les GUI.
- Il existe également un code C++ qui fait un peu de traitement rapide (beaucoup de boucles).
Je suis en train d'appeler le code C++ est compilé comme une dll à l'aide de:
Private Declare Sub CalcGraph Lib "Model.dll" ()
Et au moment reçois l'erreur:
Exception non gérée s'est produite dans votre application.
Impossible de trouver un point d'entrée nommée "CalcGraph' DLL 'Model.dll'
Quelqu'un pourrait-il expliquer comment bien appeler la DLL, s'il vous plaît?
Avez-vous besoin d'autres informations pour mieux comprendre le problème?
Je suis assez nouveau dans la programmation, donc s'il vous plaît être patient avec moi!
Cela dit, je suis prêt à faire le sale travail, et ont déjà passé un bon moment de lecture autour de sur ce et d'autres sites. Rien ne semble correspondre assez bien assez pour m'aider à comprendre ce qui ne va pas.
- Utilisation Dumpbin.exe /exportations sur la DLL pour voir ce que le nom exporté ressemble. Si ce n'est probablement pas "CalcGraph". Ou n'est pas exporté.
- Malheureusement dumpbin.exe ne semble pas venir avec Visual Studio Express. Je ne pense pas qu'il y a un autre outil qui permettrait de faire le travail?
- Vous essayez de planter un clou avec un tournevis. Obtenir la version complète.
Vous devez vous connecter pour publier un commentaire.
D'accord, avec votre aide et un peu juste de Google, cela fonctionne enfin!
Voici une course vers le bas, dans le cas où il peut aider n'importe qui d'autre dans l'avenir:
BUILDING_DLL
pavillon, mais Visual Studio vous oblige à créer une définition dans votre main.c fichier.__stdcall
fait quelque chose appelé "nom de la décoration" qui est différent du nom d'amputation, mais toujours changer votre nom de fonction. Grâce à @slugonamission pour me donner un pointeur sur ce sujet. Il a finalement cliqué lors de l'utilisation de dumpbin.exe comme suggéré par @HansPassant.__cdecl
parvient à éviter la décoration de nom, et de compiler en C (ou en utilisantextern
et de compiler en C++) évite name mangling.L'Implicite /Explicite de liaison des dll est une distinction très importante. Liaison implicite nécessite une .fichier lib, l' .dll, et peut-être aussi un .h fichier. La liaison explicite est ce que je recherchais - vous pouvez vous en sortir avec le .dll en soi. Grâce à @squelos pour le lien expliquant cela.
Et le dernier mais non le moindre:
Dans la dll:
Et dans le code VB:
Et il a finalement travaillé!
Je vais supposer ici que le C++ DLL est écrite en C++ pur (pas de C++/CLI ou quelque chose comme ça). Il semble que le VB
Lib
mot-clé ne seront importation d'un .NET procédure, plutôt que d'un natif de la procédure. Au lieu de cela, vous devez utiliser P/Invoke.Quelque chose comme cela peut fonctionner
Mais bien sûr, remplissez vos paramètres et types de retour trop.
DLLIMPORT void __stdcall CalcGraph(Parameters *params, Calculations *calcs)
. Un coup d'oeil sur le web suggère également que quelque chose qui s'est passé pour P/Invoke entre VS2008 et VS2010 ce qui pourrait également être à l'origine des problèmes. S'il vous plaît laissez-moi savoir si vous avez d'autres suggestions. Je vais continuer à bricoler dans le même temps...__stdcall
(comme il mangles noms différemment). Puisque c'est C++, vous pouvez aussi avoir besoinextern "C"
trop.Dans certains cas, en fonction de la DLL a été généré (ordinale ou par nom), vous pouvez utiliser la DLL avec GetProcAddress
Cette documentation peut vous donner un aperçu rapide de la façon d'utiliser DLL de la oldschool façon MSDN Reliant aperçu
Et enfin, DumpBin pouvez-vous vous aider à beaucoup de choses, en vous permettant d'inspecter une DLL (très utile si vous n'avez pas les sources ou de la documentation )