怎样从DLL中使用def文件导出一个类?

zeloas 2008-09-24 01:22:13
RT
另外如果是类成员函数一个一个的导出也可以。
希望能够给出范例

谢谢

...全文
401 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaoleishipin 2008-09-28
  • 打赏
  • 举报
回复
学习中。。。。。。。
mycool2001 2008-09-25
  • 打赏
  • 举报
回复
LZ不要在错误的方法上再下功夫了。
导出的类的DLL需要静态连接并且宿主需要包含头文件。
zeloas 2008-09-25
  • 打赏
  • 举报
回复
如果我想导出的是构造函数呢?使用def文件能够做到吗?

谢谢
saiyaman5 2008-09-25
  • 打赏
  • 举报
回复
ls都是牛人,见识了
jameshooo 2008-09-25
  • 打赏
  • 举报
回复
楼主累不累啊,这是何苦呢,有这个精力干脆导出函数得了,还导出类干什么,学学操作系统的操作句柄的导出函数吧,以下是一个示例:

extern "C" HANDLE CreateHandle()
{
return new CHandle;
}

extern "C" int Add(HANDLE h, int i)
{
CHandle* p = (CHandle*)h;
return p->Add(i);
}

extern "C" int Minus(HANDLE h, int i)
{
CHandle* p = (CHandle*)h;
return p->Minus(i);
}

def文件就是这样:
EXPORTS
CreateHandle
Add
Minus

句柄在DLL内部是一种封装类的实例指针,但是它不需要把这个类公开,所以改成公开句柄,然后导出各种API来操作句柄。这种方式比你的导出类方式通用多了,能被任何语言使用。
操作系统是怎么使用窗口的?HWND!句柄。然后提供一大堆API来操作HWND。
cnzdgs 2008-09-25
  • 打赏
  • 举报
回复
导出构造和析构函数比较麻烦,你可以先导出类,然后用工具查出函数名称,再写到def里面。例如class xxx的无参数构造函数,其名称为??0xxx@@QAE@XZ,无参数析构函数的名称是??1xxx@@QAE@XZ,将导出名称设置为xxx0和xxx1,def中可以这样写:
EXPORTS
xxx0=??0xxx@@QAE@XZ
xxx1=??1xxx@@QAE@XZ
yayafu 2008-09-24
  • 打赏
  • 举报
回复
有道理
cnzdgs 2008-09-24
  • 打赏
  • 举报
回复
类通常是用__declspec(dllexport)来导出,不清楚你的目的是什么。如果要用def来导出类的成员函数,可以这样做,例如:
// DLL中类定义
class c
{
public:
int m;
int Get();
void Set(int n);
};

int c::Get()
{
return m;
}

void c::Set(int n)
{
m = n;
}


// DEF文件
LIBRARY "Test"
EXPORTS
Get
Set


// EXE的调用代码
class c
{
public:
int m;
};

typedef int (__thiscall* FUNCTION_C_GET)(c* Object);
typedef void (__thiscall* FUNCTION_C_SET)(c* Object, int n);

void Test()
{
HMODULE h = LoadLibrary(_T("Test.dll"));
FUNCTION_C_GET c_Get = (FUNCTION_C_GET)GetProcAddress(h, "Get");
FUNCTION_C_SET c_Set = (FUNCTION_C_SET)GetProcAddress(h, "Set");
c x;
c_Set(&x, 1);
int i = c_Get(&x);
}
thankall 2008-09-24
  • 打赏
  • 举报
回复
关注。
jameshooo 2008-09-24
  • 打赏
  • 举报
回复
普通DLL也能导出类,但是不能用def文件来表示,只能使用__declspec(dllexport)修饰符。

只有C类型的函数才能使用def文件。
wltg2001 2008-09-24
  • 打赏
  • 举报
回复
只有MFC扩展DLL才能导出类,而MFC扩展DLL一般不用DEF文件,只要在类定义时写成这样就行了:
class AFX_EXT_CLASS CMyClass
{
。。。。
}

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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