Explicit Loading of DLL

33,999

Unless you use a disassembler and try to figure out the paramater types from assemly code, you can't. These kind of information is not stored in the DLL but in a header file coming with the DLL. If you don't have it, the DLL is propably not meant to be used by you.

Share:
33,999
justin
Author by

justin

Updated on June 04, 2020

Comments

  • justin
    justin almost 4 years

    I'm trying to explicitly link with a DLL. No other resources is available except the DLL file itself and some documentation about the classes and its member functions.

    From the documentation, each class comes with its own

    1. member typedef
      example: typedef std::map<std::string,std::string> Server::KeyValueMap, typedef std::vector<std::string> Server::String Array
    2. member enumeration
      example: enum Server::Role {NONE,HIGH,LOW}
    3. member function
      example: void Server::connect(const StringArray,const KeyValueMap), void Server::disconnect()

    Implementing the codes from google search, i manage to load the dll can call the disconnect function..

    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";
    

    I got the function name above from depends.exe. Is this what is called decorated/mangled function names in 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;}
    

    How do i call (for example) the connect member function which has the parameter datatype declared in the dll itself?

    Edit

    more info:

    • The DLL comes with an example implementation using Java. The Java example contains a Java wrapper generated using SWIG and a source code.
    • The documentation lists all the class, their member functions and also their datatypes. According to the doc, the list was generated from the C++ source codes.(??)
    • No other info was given (no info on what compiler was used to generate the DLL)

    My colleague is implementing the interface using Java based on the Java example given, while I was asked to implement using C++. The DLL is from a third party company.

    I'll ask them about the compiler. Any other info that i should get from them?

    I had a quick read through about JNI but i dont understand how it's implemented in this case.

    Update

    i'm a little confused... (ok, ok... very confused)

    1. Do i call(GetProcAddress) each public member function separately only when i want to use them?
    2. Do i create a dummy class that imitates the class in the dll. Then inside the class definition, i call the equivalent function from the DLL? (Am i making sense here?) fnieto, is this what you're showing me at the end of your post?
    3. Is it possible to instantiate the whole class from the DLL?

    I was trying to use the connect function described in my first post. From the Depends.exe DLL output,

    • std::map // KeyValueMap has the following member functions: del, empty, get, has_1key,set
    • std::vector // StringArray has the following member functions: add, capacity, clear, get, isEMPTY, reserve, set, size

    which is different from the member functions of map and vector in my compiler (VS 2005)...

    Any idea? or am i getting the wrong picture here...