Explicite de Chargement de la DLL
Je suis en train de lien explicite avec une DLL. Pas d'autres ressources sont disponibles à l'exception de la DLL fichier lui-même et de la documentation sur les classes et de ses fonctions de membre.
De la documentation, chaque classe est livré avec son propre
- membre typedef
exemple:typedef std::map<std::string,std::string> Server::KeyValueMap, typedef std::vector<std::string> Server::String Array
- membre de l'énumération
exemple:enum Server::Role {NONE,HIGH,LOW}
- fonction membre
exemple:void Server::connect(const StringArray,const KeyValueMap), void Server::disconnect()
Mettre en œuvre les codes de recherche google, j'ai réussi à charger la dll peut appeler la fonction sectionneur..
dir.h
LPCSTR disconnect = "_Java_mas_com_oa_rollings_as_apiJNI_Server_1disconnect@20";
LPCSTR connect =
"_Java_mas_com_oa_rollings_as_apiJNI_Server_1connect@20";
J'ai obtenu le nom de la fonction ci-dessus à partir de depends.exe. Est-ce ce qu'on appelle décoré/déformation des noms de fonction en C++?
main.cpp
#include <iostream>
#include <windows.h>
#include <tchar.h>
#include "dir.h"
typedef void (*pdisconnect)();
int main()
{
HMODULE DLL = LoadLibrary(_T("server.dll"));
pdisconnect _pdisconnect;`
if(DLL)
{
std::cout<< "DLL loaded!" << std::endl;
_disconnect = (pdisconnect)GetProcAddress(DLL,disconnect);
if(_disconnect)
{
std::cout << "Successful link to function in DLL!" << std::endl;
}
else
{
std::cout<< "Unable to link to function in DLL!" << std::endl;
}
}
else
{
std::cout<< "DLL failed to load!" << std::endl;
}
FreeLibrary (DLL);
return 0;}
Comment dois-je appeler (par exemple) le connecter fonction membre qui a le paramètre type de données déclaré dans la dll elle-même?
Modifier
plus d'infos:
- La DLL est livré avec un exemple de mise en œuvre à l'aide de Java. L'exemple Java contient un wrapper Java générées à l'aide de SWIG et d'un code source.
- La documentation des listes de l'ensemble de la classe, de leurs fonctions de membre et aussi de leurs types de données. D'après la doc, la liste a été générée à partir de la source C++ codes.(??)
- Pas d'autre info a été donné (pas d'info sur ce compilateur a été utilisé pour générer la DLL)
Mon collègue est la mise en œuvre de l'interface à l'aide de Java basé sur le Java exemple donné, alors que j'étais invité à mettre en œuvre à l'aide de C++. La DLL est d'un tiers de la société.
Je vais leur poser des questions sur le compilateur. Toute autre info que je devrais recevoir d'eux?
J'ai eu une lecture rapide par le biais de JNI, mais je ne comprends pas comment il est mis en œuvre dans ce cas.
Mise à jour
je suis un peu confus... (ok, ok... très confus)
- Dois-je appeler(GetProcAddress) chaque membre du public de la fonction séparément seulement quand je veux les utiliser?
- Puis-je créer une classe factice qui imite la classe dans la dll. Puis à l'intérieur de la définition de la classe, j'appelle l'équivalent de la fonction de la DLL? (Suis-je donner un sens ici?) fnieto, est-ce que vous êtes en me montrant à la fin de votre post?
- Est-il possible d'instancier la classe entière à partir de la DLL?
J'ai essayé d'utiliser la fonction de connexion décrite dans mon premier post. À partir de la Depends.exe DLL sortie,
- std::map //KeyValueMap a les fonctions de membre suivantes: del, vide, obtenir, has_1key,ensemble
- std::vector //StringArray a les fonctions de membre suivantes: ajouter, de capacité, de claire, obtenir, isEMPTY, de réserve, de définir la taille
qui est différente de celle des fonctions de membre de la map et de vecteur dans mon compilateur (VS 2005)...
Une idée? ou suis-je la mauvaise image ici...
OriginalL'auteur justin | 2009-08-10
Vous devez vous connecter pour publier un commentaire.
À moins d'utiliser un désassembleur et essayer de comprendre le paramater types de assemly code, vous ne pouvez pas. Ce genre d'information n'est pas stockée dans la DLL, mais dans un fichier d'en-tête à venir avec la DLL. Si vous ne l'avez pas, la DLL est probablement pas destiné à être utilisé par vous.
OriginalL'auteur Frank Bollack
Je serais très prudent, si j'étais vous: la bibliothèque STL n'a pas été conçu pour être utilisé dans la compilation des limites du genre.
Pas qu'il ne peut pas être fait, mais vous devez savoir ce que vous vous embarquez.
Cela signifie que l'utilisation de la STL classes à travers les limites de la DLL peuvent travailler en toute sécurité que si vous compilez votre EXE avec le même compilateur et de la version, et les mêmes paramètres (en particulier de DÉBOGAGE vs) la DLL originale. Et je ne signifie pas "exacte" match.
La norme C++ bibliothèque STL est une spécification de comportement, pas de mise en œuvre. Différents compilateurs et même les différentes révisions de la même compilateur peut, et va, se distinguent sur le code et les données mises en œuvre. Lorsque votre bibliothèque vous renvoie un
std::map
, c'est que les bits qui fonctionnent avec la DLL de la version de la STL, pas nécessairement la STL code compilé dans votre EXE.(et je ne suis même pas toucher sur le fait que le nom de déformation peut également différer de compilateur de compilateur)
Sans plus de précisions sur votre situation, je ne peux pas être sûr; mais ce peut être une boîte de pandore.
Bien-essentiellement de l' -- la DLL viennent. Je serais très intéressé si vous avez dit que c'était un DLL qui vous a été donné et que vous ne savez pas d'où il vient, ou de ce compilateur a été utilisé. Je serais beaucoup moins concernée si elle avait été développée par quelqu'un d'autre dans votre organisation et vous saviez exactement ce compilateur ils ont été à l'aide et vous pourriez coordonnées de votre compilateur mises à jour avec l'autre personne. Tout comme @fnieto, je n'avais pas remarqué la Java Native Interface de connexion; je n'ai aucune expérience avec JNI.
OriginalL'auteur Euro Micelli
Afin de créer un lien avec une DLL, vous devez:
De votre question, il semble que vous pouvez le deviner, les signatures (#2), mais vous avez vraiment besoin le fichier LIB (#1).
L'éditeur de liens peut vous aider à générer une LIB à partir d'une DLL à l'aide d'un intermédiaire DEF.
Reportez-vous à cette question pour plus de détails: Comment générer une bibliothèque d'importation à partir d'une DLL?
Alors vous avez besoin pour passer le .lib comme une "bibliothèque supplémentaire" à l'éditeur de liens. La DLL doit être disponible sur le CHEMIN ou dans le dossier cible.
OriginalL'auteur rustyx