gpt4 book ai didi

c++ - 显式加载 DLL

转载 作者:太空狗 更新时间:2023-10-29 21:31:02 25 4
gpt4 key购买 nike

我正在尝试与 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";

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

主要.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;}

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

编辑

更多信息:

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

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

我会向他们询问有关编译器的问题。我应该从他们那里获得任何其他信息吗?

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

更新

我有点困惑...(好吧好吧...很困惑)

  1. 是否仅在我想使用它们时才单独调用(GetProcAddress)每个公共(public)成员函数?
  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 的成员函数不同......

有什么想法吗?或者我在这里得到了错误的图片...

最佳答案

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

关于c++ - 显式加载 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1253769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com