一个类的功能怎么在DLL中表现出来让别人用啊?

xrdsheng 2005-01-11 03:33:44
一个类的功能怎么在DLL中表现出来让别人用啊?是不是非要把类的所有public的成员函数都用全局函数包装一下,如下例,但这样不是麻烦得要命,还有没好的解决方法???
DLL文件1:
extern "C" __declspec(dllexport) char* __stdcall PrintString(char *str);
extern "C" __declspec(dllexport) CTest* __stdcall NewCTestInstance();
extern "C" __declspec(dllexport) void __stdcall DeleteCTestInstance(CTest* p);
extern "C" __declspec(dllexport) void __stdcall PrintMsg(CTest* p);

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------

char* __stdcall PrintString(char *str)
{
MessageBox(NULL,str,"信息",MB_ICONINFORMATION);
return str;
}

CTest* _stdcall NewCTestInstance()
{
CTest *p;
p = new CTest;
return p;
}

void __stdcall DeleteCTestInstance(CTest* p)
{
memset(p->m_Msg,0,20);
delete p;
}

void __stdcall PrintMsg(CTest* p)
{
p->PrintMessage(NULL);
}

DLL文件2:
class CTest
{
public:
char m_Msg[20];
public:
void PrintMessage();
void PrintMessage(char *msg);
CTest(){};
CTest(char *msg){
strcpy(m_Msg,msg);
}
~CTest(){};
};
void CTest::PrintMessage()
{
MessageBox(NULL,"CTest::PrintMessage()","信息",MB_ICONINFORMATION);
}

void CTest::PrintMessage(char *msg)
{
if(msg!=NULL)
strcpy(m_Msg,msg);
MessageBox(NULL,m_Msg,"信息",MB_ICONINFORMATION);
}

文件3:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

extern "C" __declspec(dllimport) char* __stdcall PrintString(char *str);
extern "C" __declspec(dllimport) CTest* __stdcall NewCTestInstance();
extern "C" __declspec(dllimport) void __stdcall DeleteCTestInstance(CTest* p);
extern "C" __declspec(dllimport) void __stdcall PrintMsg(CTest* p);

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
CTest *p;
p = NewCTestInstance(); //new 一个对象
strcpy(p->m_Msg,"PrintMsg");
PrintMsg(p);
//p->PrintMessage(); //这个编译时不认,为什么???
DeleteCTestInstance(p); //释放一个对象
PrintMsg(p); //这句也有点奇怪,无效指针既然可被访问不出异常,虽然数据已不是"PrintMsg",而是乱七八糟的东西
}
//---------------------------------------------------------------------------
...全文
160 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xrdsheng 2005-01-12
  • 打赏
  • 举报
回复
再问一下,设计包括类的DLL一般常用采用包装函数方式还是导出类方式啊??大家给点意见后结贴
xrdsheng 2005-01-12
  • 打赏
  • 举报
回复
已搞定,谢谢tompkins2000(空中猎手) 和3996906(以后再说) !
再问一下,设计包括类的DLL一般常用采用包装函数方式还是导出类方式啊??
空中猎手 2005-01-12
  • 打赏
  • 举报
回复
啥意思??是问怎么使么??

和普通的一样使啊,把这个__declspec(dllexport)改成__declspec(dllimport),然后包含头文件(只要类定义部分,实现部分不要)。添加lib文件,然后就和普通类一样用。


头文件如下:
class __declspec(dllimport) CTest
{
public:
char m_Msg[20];
public:
void PrintMessage();
void PrintMessage(char *msg);
CTest(){};
CTest(char *msg){
strcpy(m_Msg,msg);
}
~CTest(){};
};
xrdsheng 2005-01-12
  • 打赏
  • 举报
回复
定义了导出类,怎么在DLL外引出导出类啊???再麻烦大家指点指点
空中猎手 2005-01-12
  • 打赏
  • 举报
回复
一般是导出函数,导出类不是DLL的常规使用方法,兼容性差。

不添加lib文件无法使用导出类
xrdsheng 2005-01-12
  • 打赏
  • 举报
回复
对于导出类,不添加lib文件的话怎么用LoadLibrary()和GetProcAddress()函数处理导出类,
这样
CTest* (*FuncNewCTestInstance)();
HINSTANCE hInst = LoadLibrary("projectdll.dll");
//这FuncNewCTestInstance可以用
(FARPROC &)FuncNewCTestInstance = GetProcAddress(hInst,"NewCTestInstance");

但下面的怎么办???
CTest *p;
p = new CTest;
p->PrintMessage() ;//不添加lib文件不行
delete p;
xrdsheng 2005-01-11
  • 打赏
  • 举报
回复
那怎么在DLL外引出导出类啊,再麻烦大家指点指点。
还有,我上面的代码是在DLL里生成一个对象,取得对象指针,然后用一个个全局函数把对象的成员函数包起来。
3996906 2005-01-11
  • 打赏
  • 举报
回复
看怎么封装了,也可以整个类引出来,不过偶觉得不好

还是一个个引吧

代码多了,没看你的例子~~~~~~~

导出类:class __declspec(dllexport) ExportType ClassName{...}

class __declspec(dllexport) __stdcall MyDllClass { //导出类
public:
MyDllClass();
void CreateAForm();
TDllFrm* DllMyForm;
};
空中猎手 2005-01-11
  • 打赏
  • 举报
回复
BCB可以直接导出类,不过这个的DLL就只有BCB能用类。
具体如下写法:

class __declspec(dllexport) CTest
{
public:
char m_Msg[20];
public:
void PrintMessage();
void PrintMessage(char *msg);
CTest(){};
CTest(char *msg){
strcpy(m_Msg,msg);
}
~CTest(){};
};
void CTest::PrintMessage()
{
MessageBox(NULL,"CTest::PrintMessage()","信息",MB_ICONINFORMATION);
}

void CTest::PrintMessage(char *msg)
{
if(msg!=NULL)
strcpy(m_Msg,msg);
MessageBox(NULL,m_Msg,"信息",MB_ICONINFORMATION);
}

13,874

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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