我正在尝试显式链接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()
从谷歌搜索实现代码,我设法加载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;}
如何调用(例如) connect 成员函数,该函数具有在dll中声明的参数datatype?
修改
更多信息:
我的同事正在使用基于Java示例的Java实现接口,而我被要求使用C ++实现。 DLL来自第三方公司。
我会问他们关于编译器的问题。我应该从他们那里得到的任何其他信息?
我快速阅读了关于JNI的内容,但我不明白在这种情况下它是如何实现的。
更新
我有点困惑......(好吧,好吧......很困惑)
我试图使用我的第一篇文章中描述的连接功能。从Depends.exe DLL输出
与我的编译器(VS 2005)中的map和vector的成员函数不同......
有什么想法吗?或者我在这里得到了错误的图片......
答案 0 :(得分:3)
除非你使用反汇编程序并尝试从汇编代码中找出参数类型,否则你不能。这些类型的信息不存储在DLL中,而是存储在DLL附带的头文件中。如果您没有它,则DLL可能不适合您使用。
答案 1 :(得分:0)
如果我是你,我会非常小心:STL库不是设计用于那样的编译边界。
不是说它无法完成,而是你需要知道你要进入的目的。
这意味着只有在使用相同的编译器和版本以及与原始DLL相同的设置(尤其是DEBUG与RELEASE)编译EXE时,跨DLL边界使用STL类才能安全地工作。而且我的意思是“确切”匹配。
C ++标准STL库是行为规范,而不是实现。不同的编译器甚至同一编译器的不同版本可以并且将会在代码和数据实现上有所不同。当你的库返回std::map
时,它会返回与DLL版本的STL一起使用的位,而不一定是EXE中编译的STL代码。
(我甚至没有涉及名称修改也可能因编译器而异的事实)
如果没有关于你情况的更多细节,我无法确定;但这可能是一堆蠕虫。
答案 2 :(得分:0)
要与DLL链接,您需要:
从您的问题看起来您可以猜出签名(#2),但您确实需要LIB文件(#1)。
链接器可以帮助您使用中间DEF从DLL生成LIB。 有关详细信息,请参阅此问题:How to generate an import library from a DLL?
然后,您需要将.lib作为“附加库”传递给链接器。 DLL必须在PATH或目标文件夹中可用。