关于DLL中调用类的导出函数的问题

hjxm 2013-04-25 08:57:34
我在调用一个DLL中的类的函数时老出错,帮忙看下:
1)函数地址该如何获取?
如:CProcess:CTest函数:我用LoadLibrary+GetProcess()调用,老是获取不到函数地址(为0)。
2)类函数该如何调用:我用DLL首地址+偏移的形式获取到了该函数的真正地址,但在调用时老是出错,因为类函数要定义对象才能使用,请问下:DLL下类的对象该如何定义,谢谢!
...全文
158 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjxm 2013-04-26
  • 打赏
  • 举报
回复
我是想调用没有.h .lib文件,只有DLL,其中的导出类,不是如何写DLL的导出类
AndyStevens 2013-04-26
  • 打赏
  • 举报
回复
楼主看看COM原理吧, 他就解决了“C++如何健壮地导出对象” 这个问题,推荐几本书: 《com原理及应用》 《com技术内幕》 《COM本质论》
hjxm 2013-04-25
  • 打赏
  • 举报
回复
不是每个类都有这样的函数吧
AndyStevens 2013-04-25
  • 打赏
  • 举报
回复
引用 6 楼 hjxm 的回复:
能用代码举个例子说下不,不是很明白,谢谢
class __declspec(dllexport) CDll {
public:
	CDll(void){};
	virtual void fun(){
		cout<<"this is from dll\n"<<endl;
	};
};

extern "C" __declspec(dllexport) CDll* fnDll(void)
{
	return new CDll();
}
只要找到fnDll的地址,就可以获得类的对象指针
hjxm 2013-04-25
  • 打赏
  • 举报
回复
我把DLL反汇编了分析了下类函数的传参,主要是THIS指针的生成分析清楚了,然后用嵌汇编代码的方式解决了。 我觉得楼上说得很有道理(1.用extern C"" 包裹导出类的声明 2.类中所有需要导出的函数声明为virtual 3.实现一个接口,用于返回类的对象指针。 ),只是我现在还没想太明白,先凑合用着吧。
hjxm 2013-04-25
  • 打赏
  • 举报
回复
能用代码举个例子说下不,不是很明白,谢谢
AndyStevens 2013-04-25
  • 打赏
  • 举报
回复
C++会对函数名进行修饰,比如你GetProcess找不到函数的地址。 解决方案是: 1.用extern C"" 包裹导出类的声明 2.类中所有需要导出的函数声明为virtual 3.实现一个接口,用于返回类的对象指针。
hjxm 2013-04-25
  • 打赏
  • 举报
回复
如何对DLL中的类进行导出和实例化呢
hjxm 2013-04-25
  • 打赏
  • 举报
回复
我没有.h和.lib文件,只有DLL文件
Lonely_Snow 2013-04-25
  • 打赏
  • 举报
回复
下面是一个例子 //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;
}
taodm 2013-04-25
  • 打赏
  • 举报
回复
珍惜生命,远离扩展dll,只使用纯C接口的标准dll

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧