显式加载 DLL

jus*_*tin 5 c++ dll explicit class

我正在尝试显式链接 DLL。除了 DLL 文件本身以及有关类及其成员函数的一些文档之外,没有其他资源可用。

从文档来看,每个类都有自己的

  1. 成员 typedef
    示例:typedef std::map<std::string,std::string> Server::KeyValueMap, typedef std::vector<std::string> Server::String Array
  2. 成员枚举
    示例:enum Server::Role {NONE,HIGH,LOW}
  3. 成员函数
    示例:void Server::connect(const StringArray,const KeyValueMap), void Server::disconnect()

实现来自谷歌搜索的代码,我设法加载可以调用断开连接函数的dll。

目录.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";
Run Code Online (Sandbox Code Playgroud)

我从depends.exe 中获取了上面的函数名称。这就是 C++ 中所谓的修饰/修饰函数名称吗?

主程序

#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;}
Run Code Online (Sandbox Code Playgroud)

我如何调用(例如)具有在 dll 本身中声明的参数数据类型的 connect成员函数?

编辑

更多信息:

  • 该 DLL 附带了一个使用 Java 实现的示例。Java 示例包含使用 SWIG 生成的 Java 包装器和源代码。
  • 该文档列出了所有类、它们的成员函数以及它们的数据类型。根据文档,该列表是从 C++ 源代码生成的。(??)
  • 没有给出其他信息(没有关于使用什么编译器生成 DLL 的信息)

我的同事正在根据给出的Java示例使用Java实现接口,而我被要求使用C++实现。该DLL来自第三方公司。

我会向他们询问编译器的情况。我应该从他们那里得到任何其他信息吗?

我快速阅读了有关 JNI 的内容,但我不明白它在这种情况下是如何实现的。

更新

我有点困惑...(好吧,好吧...非常困惑)

  1. 仅当我想使用它们时,我才单独调用(GetProcAddress)每个公共成员函数吗?
  2. 我是否创建一个模拟 dll 中的类的虚拟类?然后在类定义中,我从 DLL 中调用等效函数?(我在这里说得通吗?)fnieto,这就是你在帖子末尾向我展示的内容吗?
  3. 是否可以从 DLL 实例化整个类?

我试图使用第一篇文章中描述的连接功能。从 Depends.exe DLL 输出中,

  • std::map // KeyValueMap有以下成员函数:del、empty、get、has_1key、set
  • std::vector // StringArray 有以下成员函数:add、capacity、clear、get、isEMPTY、reserve、set、size

这与我的编译器(VS 2005)中的map和vector的成员函数不同...

任何想法?或者我在这里得到了错误的图片......

Fra*_*ack 3

除非您使用反汇编程序并尝试从汇编代码中找出参数类型,否则您不能。这些信息并不存储在 DLL 中,而是存储在 DLL 附带的头文件中。如果您没有它,则该 DLL 可能不适合您使用。