CMakeLists.txt

project(virtual) # 创建工程 virtual

add_library(virtual SHARED virtual.cpp) # 创建动态连接库 libvirtual.dll

add_executable(main main.cpp) # 创建运行程序 main.exe

target_link_libraries(main virtual) # 让 main.exe 连接 libvirtual.dll

virtual.h

#pragma once // 只编译一次

#ifndef VIRTUAL_VIRTUAL_H // 头文件定义
#define VIRTUAL_VIRTUAL_H
#endif #ifdef BUILD_VIRTUAL_DLL // 导入导出标志,使其在 DLL 定义时声明为导出,再 DLL 调用时声明为导入
#define IO_VIRTUAL_DLL __declspec(export) // 导出定义
#else
#define IO_VIRTUAL_DLL __declspec(import) // 导入定义
#endif extern "C" // 标准 C 格式,防止导出函数名变化
{
IO_VIRTUAL_DLL char *hello(char *pChar); // 导出函数 hello
}

virtual.cpp

#define BUILD_VIRTUAL_DLL // 声明为导出

#include "virtual.h" // 包含头文件

class Base // 纯虚函数基类
{
public:
virtual char *hello(char *pChar) = 0;
}; class Derived : public Base // 纯虚函数继承类
{
public:
char *hello(char *pChar);
}; char *Derived::hello(char *pChar) // 继承类需写函数体,否则仍为纯虚类
{
return pChar;
} IO_VIRTUAL_DLL char *hello(char *pChar) // 导出函数定义,函数头为头文件导出名,函数体调用纯虚类以实例化
{
Base *pClass; // 声明基类指针
pClass = new Derived(); // 指针初始化继承类
pClass->hello(pChar); // 实例化
}

main.cpp

#include "virtual.h"
#pragma comment(a, "C:\Users\Perelman\.CLion2016.1\system\cmake\generated\virtual-24998182\24998182\Debug\libvirtual.dll.a")
#include <iostream>
using namespace std;
int main()
{
cout << hello("Hello world!\n") << endl;
return 0;
}

virtual.py

import ctypes
# extern "C" 格式的用 CDLL 加载库
hDLL = ctypes.CDLL("C:\\Users\\Perelman\\.CLion2016.1\\system\\cmake\\generated\\virtual-24998182\\24998182\\Debug\\libvirtual.dll")
# 定义输入 C 格式
hDLL.hello.argtype = ctypes.c_char_p
# 定义输出 C 格式
hDLL.hello.restype = ctypes.c_char_p
# 返回指针
pointer = hDLL.hello("Hello world!\n")
print("pointer = \n", pointer, "\n")
# 返回指针指向的值,取值 [pointer],解码 .decode("utf-8")
value = [pointer][0].decode("utf-8")
print("value = \n", value, "\n")

C++ 纯虚函数接口,标准 C 导出 DLL 函数的用法的更多相关文章

  1. Linux常用C函数-接口处理篇(网络通信函数)

    接口处理篇accept,bind,connect,endprotoent,endservent,getsockopt,htonl,htons,inet_addr,inet_aton,inet_ntoa ...

  2. 在C++/CLI环境下,千万不要把普通全局函数当标准C/C++的函数指针传递给native的库使用

    先上一个简单代码: #include <cstdlib> #include <cstdio> // native apis extern "C" { typ ...

  3. C++虚函数virtual,纯虚函数pure virtual和Java抽象函数abstract,接口interface与抽象类abstract class的比较

    由于C++和Java都是面向对象的编程语言,它们的多态性就分别靠虚函数和抽象函数来实现. C++的虚函数可以在子类中重写,调用是根据实际的对象来判别的,而不是通过指针类型(普通函数的调用是根据当前指针 ...

  4. C++中虚函数和纯虚函数的区别与总结

    首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数. 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数. 定义一个函数为纯虚函数,才代表函数没有被实现. 定义纯虚函数是为了实 ...

  5. dll的概念 dll导出变量 函数 类

    1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别:   (1)静态链接 ...

  6. 使用Java函数接口及lambda表达式隔离和模拟外部依赖更容易滴单测

    概述 单测是提升软件质量的有力手段.然而,由于编程语言上的支持不力,以及一些不好的编程习惯,导致编写单测很困难. 最容易理解最容易编写的单测,莫过于独立函数的单测.所谓独立函数,就是只依赖于传入的参数 ...

  7. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念

      本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程?   java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...

  8. 探寻main函数的“标准”写法,以及获取main函数的参数、返回值

    main函数表示法        很多同学在初学C或者C++时,都见过各种各样的main函数表示法: main(){/*...*/} void main(){/*...*/} int main(){/ ...

  9. Java 8 函数接口详细教程

    ay = new byte[array.length]; for (int i = 0; i < array.length; i++) { transformedArray[i] = funct ...

随机推荐

  1. Ceph浅析”系列之四——Ceph的结构

    本文将从逻辑结构的角度对Ceph进行分析. Ceph系统的层次结构 Ceph存储系统的逻辑层次结构如下图所示[1]. Ceph系统逻辑层次结构 自下向上,可以将Ceph系统分为四个层次: (1)基础存 ...

  2. secureCRT背景颜色设置

    1. Options->Global Options->Advanced select 'Monochrome'  click 'Edit' button normal: Backgrou ...

  3. 【CodeVS 1037】取数游戏

    http://codevs.cn/problem/1037/ Alice必胜是Alice将硬币移向边权为0的一端并且把经过的边变为0,让BoB无路可走. 这样只要起点到两个方向最近的0边权的端点的边数 ...

  4. 【POJ 2187】Beauty Contest 凸包+旋转卡壳

    xuán zhuǎn qiǎ ké模板题 是这么读吧(≖ ‿ ≖)✧ 算法挺简单:找对踵点即可,顺便更新答案. #include<cstdio> #include<cstring&g ...

  5. caffe使用

    训练时, solver.prototxt中使用的是train_val.prototxt ./build/tools/caffe/train -solver ./models/bvlc_referenc ...

  6. 如何更新firefox中的flash

    要了解当前安装的版本是否为最新版本,请访问 插件检查页面http://www.mozilla.com/plugincheck/  ,如果该页面告诉你 Flash 插件需要更新,请手动安装最新版本. 使 ...

  7. 【HDU 3746】Simpsons’ Hidden Talents(KMP求循环节)

    求next数组,(一般有两种,求循环节用的见代码)求出循环节的长度. #include <cstdio> #define N 100005 int n,next[N]; char s[N] ...

  8. c# 读取嵌入式文件

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Reflect ...

  9. 二叉查找树 C++实现(含完整代码)

    一般二叉树的查找是通过遍历整棵二叉树实现,效率较低.二叉查找树是一种特殊的二叉树,可以提高查找的效率.二叉查找树又称为二叉排序树或二叉搜索树. 二叉查找树的定义 二叉排序树(Binary Search ...

  10. Arraylist Vector Linkedlist区别和用法 (转)

    ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢 ...