【发布时间】:2009-08-12 04:29:05
【问题描述】:
我的任务是使用 C++ 与第三方公司的 dll 进行交互。
dll包自带:
- dll 本身
- 一个示例 Java 实现 - 由使用 SWIG 工具和 Java 源文件生成的 Java 包装器(库)组成
- 说明所有公共数据类型、枚举和成员函数的文档。
我的另一位同事正在使用 Java(基于包中的示例)与 dll 交互,而我被要求使用 C++。 Java 示例看起来很简单......只需导入包装器并实例化文档中描述的任何类......
有关 dll 的更多信息:
- 从文档中,它说 dll 是使用 C++ 编程的
- 从 hexdump 中可以看出,它是使用 VC90(VS C++ 2008 对吗?)和来自 Dinkumware 的东西编译的。
- 从depends.exe 输出中,函数似乎被包装在JNI 下。例如:
_Java_mas_com_oa_rollings_as_apiJNI_Server_1disconnect@20
我的困境:
- dll 公司没有更改 dll 中的任何内容,也没有提供任何其他信息。
- 如何从 dll 中使用类中的成员函数?
- 我做了一些简单的 LoadLibrary() 和 GetProcAddress 并设法获取公共成员函数的地址。
- 但我不知道如何使用具有在 dll 中定义的数据类型参数的函数。例如:
从文档中,成员函数定义为:
void Server::connect(const StringArray, const KeyValueMap) throw(std::invalid_argument,std::out_of_range)
typedef std::map Server::KeyValueMap
typedef std::vector 服务器::StringArray
如何在 C++ 中调用该函数。我的编译器(VS 2005)中的 std::map 和 std::vector 具有不同的函数,列出了 dll 中的函数。例如,从depends.exe 输出:
- std::map // KeyValueMap - del, empty, get, has_1key,set
- std::vector // StringArray - 添加、容量、清除、获取、isEMPTY、保留、设置、大小
关于我应该如何解决这个问题的任何建议/策略?是否可以像 Java 示例那样简单地实例化该类?
【问题讨论】:
-
这个东西是专有的吗,或者你能提供DLL给我们看吗?
标签: c++ class dll java-native-interface