c++ 调用dl里的导出类
来源:http://blog.csdn.net/yysdsyl/article/details/2626033
动态dll的类导出:CPPDll2->test.h
#pragma once
//#include "boost/shared_ptr.hpp"
class Test {
public:
virtual ~Test() {}
virtual void DoIt() =;
}; //
extern "C" _declspec(dllexport) std::auto_ptr<Test> CreateTest(); //
extern "C" _declspec(dllexport) boost::shared_ptr<Test> CreateTest();
extern "C" _declspec(dllexport) Test* CreateTestPtr();
extern "C" _declspec(dllexport) void DeleteTestPtr(Test*);
动态dll的类导出的实现:CPPDll2->test.cpp
//test.cpp
#include "stdafx.h"
#include "Test.h"
#include <stdio.h> //
#include <memory> //
#include "boost/shared_ptr.hpp"
class CTest : public Test
{
public:
virtual void DoIt()
{
printf("Should do something/n");
}
}; //
std::auto_ptr<Test> CreateTest() //
{ //
return std::auto_ptr<Test>(new CTest); //
} //
boost::shared_ptr<Test> CreateTest() //
{ //
return boost::shared_ptr<Test>(new CTest); //
}
Test* CreateTestPtr()
{
return new CTest();
}
void DeleteTestPtr(Test* t)
{
if(t !=NULL)
{
delete t;
t =NULL;
}
}
对loadlibrary的分装,可以作为tools:
//library.h
#pragma once
#include <windows.h>
#include <string>
#include <assert.h>
class Library
{
public:
explicit Library(const wchar_t* name)
{
m_handle = LoadLibrary(name);
assert(m_handle);
if (!m_handle)
throw std::runtime_error(std::string("Could not find library file:"));
}
~Library()
{
FreeLibrary(m_handle);
}
void* GetProc(const char* name)
{
void* proc = ::GetProcAddress(m_handle, name);
assert(proc);
return proc;
}
private:
HMODULE m_handle;
};
client的调用:
#include "stdafx.h"
#include "library.h"
#include "../CppDll2/test.h"
int _tmain(int argc, _TCHAR* argv[])
{
typedef Test* (*CREATE)();
typedef void (*DEL)(Test*);
Library lib(L"CppDll2.dll");
std::auto_ptr<Test> test = ((std::auto_ptr<Test> ) lib.GetProc("CreateTest"));
Test* test = (((CREATE)(lib.GetProc("CreateTestPtr")))());
test->DoIt();
((DEL)(lib.GetProc("DeleteTestPtr")))(test);
return ;
}
c++ 调用dl里的导出类的更多相关文章
- VS后台程序无法调用App_Code里的公共类解决方案
在Web应用程序中不能通过右键项目-〉”添加“-〉”添加ASP.NET文件夹“方式添加 .因为Web应用程序中App_Code就不存在 .不过可以通过手动的方式创建,添加一个文件夹命名为App_Cod ...
- 如何调用DLL中的导出类
之前在网上一直查不到关于把类打包成dll文件的程序,今天自己写了个测试程序,供大家参考 一.生成类的dll文件 1.我是在vs2008上测试的,建立工程,在选择建立何种类型的工程的时候,勾上appli ...
- C#调用C++导出类(转)
由于使用别人的Dll,导出的是一个实体类,在C#里封送很难,百度下,有个朋友回复一篇英文的,虽然不一定使用,但可以作为一个知识点,现把原文贴下: c#调用C++写的dll导出类,包含继承,重载等详细介 ...
- C#调用C++导出类的一个实例
一直认为带导出类dll的只有VC自己可以调用,其它编程语言无法调用,今天看到一篇文章才知道自己错了.https://blog.csdn.net/huiyouyongdeyu2011/article/d ...
- VC++导入导出类
一.导出类 VC++中导出类很简单,下面列出了两个等价的方法: 方法1: class __declspec(dllexport) CTest { public: int m_nValue ...
- DLL导出类避免地狱问题的完美解决方案
DLL动态链接库是程序复用的重要方式,DLL可以导出函数,使函数被多个程序复用,DLL中的函数实现可以被修改而无需重新编译和连接使用该DLL的应用程序.作为一名面向对象的程序员,希望DLL可以导出类, ...
- DLL的概念、dll导出类(转贴)
1. DLL的概念DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用.静态链接库与动态链接库的区别:(1)静态链接库与动态链 ...
- (转)C++类库开发之导出类设计原则
上一篇博客详细陈述了类库开发的各个知识点(http://blog.csdn.net/z702143700/article/details/45989993),本文将进一步陈述,对于类库开发过程中导出类 ...
- C++ DLL导出类 知识大全
在公司使用C++ 做开发,公司的大拿搭了一个C++的跨平台开发框架.在C++开发领域我还是个新手,有很多知识要学,比如Dll库的开发. 参考了很多这方面的资料,对DLL有一个基本全面的了解.有一个问题 ...
随机推荐
- NewTonJson.Net的使用
1.引用“Newtonsoft.Json” 4.0 版本 2.基础类 using System; using System.Collections.Generic; using System.Linq ...
- IOC:AutoFac使用demo
使用autofac 实现依赖注入 1.引用 autofac.dll 和 autofac.configuration.dll 2.新增接口 IDAL using System; using System ...
- UVa 10925 - Krakovia
题目大意:关于大数的加法和除法的,用Java的BigInteger可以方便地解决. import java.io.*; import java.util.*; import java.math.*; ...
- Repository 设计模式介绍(转)
在DDD设计中大家都会使用Repository pattern来获取domain model所需要的数据. 1.什么事Repository? "A Repository mediates b ...
- swift Alamofire请求数据与SwiftJson解析
一直在研究swift 程序最重要的是什么???答案当然是数据啦. 数据对一个程序的影响有多大自己想去吧!!!如果你非要说不重要,那你现在就可以关网页了 哈哈哈哈哈 我呢 swift新手 菜鸟一 ...
- 程序启动缓慢-原来是hbm.xml doctype的原因
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "h ...
- Hibernate最简单教程
其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西, ...
- doubango(4)--SIP协议栈传输层的启动
协议栈的默认传输结构 对于一个刚启动的协议栈来说,它需要有一个传输层,支持若干的传输结点.每一个传输结点对应于一个端口,若采用TCP连接,一个传输结点就针对于一个点到点的连接,这个连接负责sip信令的 ...
- pureMVC介绍及学习
1 简介 Pure MVC是在基于模型.视图和控制器MVC模式建立的一个轻量级的应用框架,这种开源框架是免费的,它最初是执行的ActionScript 3语言使用的Adobe Flex.Flash ...
- oracle与sqlserver利用函数生成年月日加流水号
最近在做oracle相关的项目,刚接触oracle,与sqlserver语法上还是有区别的 sqlserver : 示例:FX+当前年月日+00001 如下图流水号实力所示 原理: 首先 'FX'是固 ...