您的位置:首页 > 编程语言 > C语言/C++

c++动态加载dll中的类(用于实现依据字符串类名创建对象)

2011-12-06 10:52 706 查看
查看原文

参考资料:

http://blog.csdn.net/yysdsyl/archive/2008/07/08/2626033.aspx

用来生成dll的文件:

view plain

////////////////////////////Test.h

class Test

{

public:

Test(void);

public:

virtual ~Test(void);

public:

virtual void DoSth()=0;

};

--------------------------------------------



view plain

///////////////////TTest.h

/////////////TTest继承自Test

class TTest :

public Test

{

public:

TTest(void);

public:

~TTest(void);

public:

virtual void DoSth(){std::cout<<"TTest:do sth/n";};

};

view plain

///////////关键





extern "C" __declspec(dllexport) Test* CreateTTestPtr();

extern "C" __declspec(dllexport) void DeleteTTestPtr(Test* t);



--------------------------------------------------

view plain

////////////////TTest.cpp

#include "TTest.h"



TTest::TTest(void)

{

}



TTest::~TTest(void)

{

std::cout<<"destruct TTest/n";

}



Test* CreateTTestPtr()

{

return new TTest();

}



void DeleteTTestPtr(Test* t)

{

if(t!=NULL)

delete t;

}

view plain

测试程序:

view plain

<pre class="csharp" name="code">#include "Test.h"

#include <Windows.h>



typedef Test* (CREATEFN)();

typedef void (DELETEFN)(Test* );





int _tmain(int argc, _TCHAR* argv[])

{

HINSTANCE hd=::LoadLibrary("AnotherDll.dll");



CREATEFN* pfn;

DELETEFN* xfn;



pfn=(CREATEFN *)::GetProcAddress(hd,"CreateTTestPtr");

xfn=(DELETEFN *)::GetProcAddress(hd,"DeleteTTestPtr");



Test* t=(*pfn)();

t->DoSth();

(*xfn)(t);



getchar();

return 0;

}

view plain



view plain



view plain



view plain

-------------------------------------------------------------------

view plain



view plain

向dll中添加新的继承于Test基类时,实现自身的同时实现下面的两函数

view plain

extern "C" __declspec(dllexport) Test* CreateXXXPtr();

extern "C" __declspec(dllexport) void DeleteXXXPtr(Test* t);

view plain



view plain

(其中XXX表示新添加的类的类名,当然命名可以随意,只要你能在应用程序中找到这两导出函数,不过统一的命名规则

view plain

对根据类名创建对象是有好处的)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: