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
对根据类名创建对象是有好处的)
参考资料:
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
对根据类名创建对象是有好处的)
相关文章推荐
- c++动态加载dll中的类(用于实现依据字符串类名创建对象)
- 仿MFC实现c++按名动态创建对象之续(瘦身以及解决其在dll中使用的问题)
- 仿MFC实现c++的按名动态创建对象功能
- 三十一、反射、C++动态对象创建实现
- C++ 类工厂实现动态对象创建
- 动态加载dll,并创建类对象放入到list中。
- 从零开始学C++之模板(四):用模板实现单例模式(线程安全)、模板方式实现动态创建对象
- [C++学习笔记14]动态创建对象(定义静态方法实现在map查找具体类名对应的创建函数,并返回函数指针,map真是一个万能类)good
- 从零开始学C++之模板(四):用模板实现单例模式(线程安全)、模板方式实现动态创建对象
- C++实现反射(根据类名动态创建对象)
- C++实现只能动态或者静态创建对象
- 从零开始学C++之模板(四):用模板实现单例模式、模板方式实现动态创建对象
- C++动态加载dll
- C++对象动态生成(Dynamic Create)的简单实现
- C++--如何实现SDI程序使用CSplitterWnd创建的多个视图的动态地显示和关闭视图
- 自己实现动态创建,和运行时对象识别
- 通过Oracle 9i的DBMS_METADATA包得到DLL语句 可以用于提取对象创建的DDL语句
- c++实现加载so动态库中的资源
- C++如何实现类对象只能动态分配或只能静态分配
- C++对象动态生成(Dynamic Create)的简单实现