DLL的显式加载(Explicit Loading of DLL)

2019-09-22 18:33发布

我想明确地与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可以调用断开功能..

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

从我得到的Depends.exe上面的函数名。 这是所谓的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;}

我如何调用(例如),其中有在DLL本身声明的参数的数据类型的连接成员函数?

编辑

更多信息:

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

我的同事是基于给定的Java实现例如使用Java接口,而有人问我用C ++实现的。 该DLL是从第三方公司。

我会问他们的编译器。 任何其他信息,我应该从他们身上得到什么?

我有一个快速通读有关JNI,但我不知道它是如何在这种情况下实现的。

更新

我有点糊涂了......(好吧,好吧......很困惑)

  1. 我分别致电(GetProcAddress的)每个公共成员函数,只有当我要使用它们?
  2. 我创建模仿DLL中类的伪类。 然后在类定义内,我打电话从DLL同等功能? (我是决策意识吗?)fnieto,这是你展示我在你的岗位的到底是什么?
  3. 是否有可能从DLL实例全班?

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

  • 的std ::地图// KeyValueMap具有以下成员函数: 德尔,空,获取,has_1key,设置
  • 的std ::向量//字符串数组有以下成员函数: 添加,能力,清晰,获取,为IsEmpty,储备,设置,大小

这是在我的编译器从图和载体的成员函数不同(2005 VS)...

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

Answer 1:

除非你使用反汇编和揣摩从assemly代码paramater类型,你不能。 这些种类的信息不被存储在DLL但与DLL来一个头文件。 如果没有它,该DLL propably并不意味着被你使用。



Answer 2:

我会非常小心,如果我是你:STL库没有被设计编制跨边界像使用。

这并不是说不能做,但你需要知道你做了什么。

这意味着使用跨DLL边界STL类,如果你为原来的DLL完全相同的编译器和版本,并使用相同的设置(特别是DEBUG与RELEASE)编译EXE可以安全地才有效。 而且我的意思是“精确”匹配。

C ++标准STL库是行为的规范,而不是实现。 不同的编译器和相同的编译器的甚至不同版本可以,和将,不同上的代码和数据的实施方式。 当您的图书馆将返回一个std::map ,它给你回,与DLL版的STL的,不一定是你的EXE编译STL代码的工作位。

(我甚至不接触的事实,名字改编也可以从不同的编译器编译器来)

如果没有你的情况更多的细节,我不能肯定; 但是这可能是忌讳的。



Answer 3:

为了有一个DLL链接,您需要:

  1. 导入库(.LIB文件),这说明C / C ++的名字和DLL出口之间的关系。
  2. 的C / C ++导出的项(通常功能),描述调用约定,参数和返回值的签名。 这通常是在一个头文件(.H)。

从你的问题看起来你可以猜测签名(#2),但是你真正需要的LIB文件(#1)。

该连接器可以帮助您生成使用中间DEF从DLL中的LIB。 请参阅此问题的详细信息: 如何从一个DLL导入库?

然后,你需要传递的.lib为“附加库”的链接。 该DLL必须是可用的路径或目标文件夹。



文章来源: Explicit Loading of DLL