【发布时间】:2009-08-10 08:44:57
【问题描述】:
我正在尝试显式链接 DLL。除了 DLL 文件本身和一些关于类及其成员函数的文档之外,没有其他可用资源。
从文档来看,每个类都有自己的
- 成员类型定义
例如:typedef std::map<std::string,std::string> Server::KeyValueMap, typedef std::vector<std::string> Server::String Array - 成员枚举
例如:enum Server::Role {NONE,HIGH,LOW} - 成员函数
例如:void Server::connect(const StringArray,const KeyValueMap), void Server::disconnect()
实现google搜索的代码,我设法加载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++ 中所谓的修饰/损坏函数名称吗?
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 本身中声明的参数数据类型的 connect 成员函数?
编辑
更多信息:
- DLL 附带一个使用 Java 的示例实现。 Java 示例包含使用 SWIG 生成的 Java 包装器和源代码。
- 文档列出了所有类、它们的成员函数以及它们的数据类型。根据文档,该列表是从 C++ 源代码生成的。(??)
- 没有提供其他信息(没有关于使用什么编译器生成 DLL 的信息)
我的同事正在根据给出的 Java 示例使用 Java 实现接口,而我被要求使用 C++ 实现。 DLL 来自第三方公司。
我会问他们关于编译器的问题。我应该从他们那里得到任何其他信息吗?
我快速阅读了有关 JNI 的内容,但我不明白在这种情况下它是如何实现的。
更新
我有点困惑……(好吧,好吧……很困惑)
- 是否只有在我想使用每个公共成员函数时才单独调用(GetProcAddress)?
- 我是否创建了一个模拟 dll 中的类的虚拟类。然后在类定义中,我从 DLL 调用等效函数? (我在这里有意义吗?) fnieto,这是您在帖子末尾向我展示的内容吗?
- 是否可以从 DLL 实例化整个类?
我试图使用我第一篇文章中描述的连接功能。从 Depends.exe DLL 输出中,
- std::map // KeyValueMap 有以下成员函数:del、empty、get、has_1key、set
- std::vector // StringArray 有以下成员函数:add、capability、clear、get、isEMPTY、reserve、set、size
这与我的编译器(VS 2005)中map和vector的成员函数不同...
有什么想法吗?还是我在这里得到错误的图片...
【问题讨论】: