关于DLL中调用类的导出函数的问题
我在调用一个DLL中的类的函数时老出错,帮忙看下:
1)函数地址该如何获取?
如:CProcess:CTest函数:我用LoadLibrary+GetProcess()调用,老是获取不到函数地址(为0)。
2)类函数该如何调用:我用DLL首地址+偏移的形式获取到了该函数的真正地址,但在调用时老是出错,因为类函数要定义对象才能使用,请问下:DLL下类的对象该如何定义,谢谢!
[解决办法]
下面是一个例子
//test_dll.h
#ifndef TEST_DLL_H
#define TEST_DLL_H
#ifdef TEST_API
#else
#define TEST_API __declspec(dllimport)
#endif
class TEST_API Delegate
{
public:
virtual void Print()const = 0;
virtual ~Delegate()
{}
};
class TEST_API PrintAdd : public Delegate
{
public:
PrintAdd() : result(0)
{
}
virtual void Print()const;
void Add(int x, int y);
private:
int result;
};
#endif
//test_dll.cpp
#include <iostream>
#define TEST_API __declspec(dllexport)
#include "test_dll.h"
using namespace std;
PrintAdd* PrintAdd::CreateObj()
{
return new PrintAdd;
}
void PrintAdd::Print() const
{
cout<<result<<endl;
}
void PrintAdd::Add( int x, int y )
{
result = x + y;
}
调用方
#include "test_dll.h"
#pragma comment(lib, "test_dll.lib")
int _tmain(int argc, _TCHAR* argv[])
{
PrintAdd p;
p.Add(3, 5);
p.Print();
system("pause");
return 0;
}
[解决办法]
C++会对函数名进行修饰,比如你GetProcess找不到函数的地址。
解决方案是:
1.用extern C"" 包裹导出类的声明
2.类中所有需要导出的函数声明为virtual
3.实现一个接口,用于返回类的对象指针。