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

  1. membre typedef

    exemple: typedef std::map<std::string,std::string> Server::KeyValueMap, typedef std::vector<std::string> Server::String Array
  2. membre de l'énumération

    exemple: enum Server::Role {NONE,HIGH,LOW}
  3. 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)

  1. Dois-je appeler(GetProcAddress) chaque membre du public de la fonction séparément seulement quand je veux les utiliser?
  2. 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?
  3. 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