精华内容
下载资源
问答
  • 要搞明白如何让python调用C/C++代码(也就是写python的extension),你需要征服手册中的<>厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他书籍,最终在<&...

    要搞明白如何让python调用C/C++代码(也就是写python的extension),你需要征服手册中的<>厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他书籍,最终在<>书中找到了教程。

    1。 首先要明白的是,所谓的python扩展(也就是你提供给python的c/c++代码,不一定是c/c++代码,可以是其他语言写的代码)是一个dll,并且这个dll放在本机python安装目录下的DLLs目录下(譬如我机器上的路径是:F:/Program Files/Python25/DLLs),假如我们接下来要写的扩展module名为mb,python调用的代码为:import mbmb。

    showMsg("Python's really amazing, I kindda love it!")

    2。 搭建环境,我们要使用python提供的c头文件和lib库来进行扩展的开发。

    在vs 2005下点击菜单 "工具"->"选项", 打开选项对话框,选择"项目和解决方案->VC++目录", 然后在右边"显示以下内容的目录"得comboBox上选择"包含文件”,添加python的include目录(我的机器上是"F:/Program Files/Python25/include"),然后选择库文件,添加python的libs目录(我的机器上是"F:/Program Files/Python25/libs")。

    既然扩展是一个dll,接下来我们要建立一个“动态链接库”工程,然后开始写代码:

    #include //python。h是包含python一些定义的头文件,在python的include目录下/*我的python版本是2。

    5, 因为安装python后它没提供debug下的lib库文件,因此你必须生成release版的dll,

    想要生成dll版本的,你要到python官网上自己去下载python源代码,当然你可以继续生成release版本的dll,但dll中包含调试信息*/#pragma comment(lib, "python25。

    lib")//先不管static PyObject* mb_showMsg(PyObject* self, PyObject *args);/*如果你的扩展是mb,那么必须实现一个initmb函数,并且从dll中导出这个函数,但我们在python中调用import mb时,python会去dll里去调用

    extern "C" __declspec(dllexport) void initmb(){/*当调用mb。

    showMsg("Python's really amazing, I kindda love it!")时, 相当于你告诉python我有一个showMsg函数,我们怎么告诉python去调用我们dll里的mb_showMsg函数呢?技巧就是下面的方式,定义一个字典数据结构,key => showMsg, value =>mb_showMsg,METH_VARARGS是函数调用方式,仔细查手册吧*/static PyMethodDef mbMethods[] = {

    {"showMsg", mb_showMsg, METH_VARARGS},

    {NULL, NULL, NULL} /*sentinel,哨兵,用来标识结束*/};//告诉python我们的模块名叫mb, 模块包含的函数都在mbMethods字典里

    PyObject *m = Py_InitModule("mb", mbMethods);}/*接下来实现核心功能showMsg*///第一个self参数我们用不着,具体查手册,第二个参数是python传给我们的参数,它是一个python的参数tuple

    static PyObject* mb_showMsg(PyObject* self, PyObject *args){//我们的showMsg函数需要的是一个字符串参数

    const char* msg = NULL;/*调用特殊参数解码python传递给我们的参数,s是string,我们传递接收参数的变量地址,

    如果你的功能函数需要两个参数,在PyArg_parseTuple后面继续添加接受参数的变量地址,

    这个函数的原型是类似printf的不定参数的形式

    PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, 。

    。。);*/if (!PyArg_ParseTuple(args, "s", &msg))

    return NULL;//调用MBint r = ::MessageBox(NULL, "hello", "Caption:Form C module", MB_ICONINFORMATION | MB_OK);//返回值return Py_BuildValue("i", r);}将上面这段混杂着大量注释的代码拷贝到你的编辑器里,然后编译生成mb。

    dll,修改后缀成mb。pyd,然后拷贝到python的DLLs目录下,打开idle(python的交互程序),写入代码:import mbmb。showMsg("Python's really amazing, I kindda love it!")。

    全部

    展开全文
  • 要搞明白如何让python调用C/C++代码(也就是写python的extension),你需要征服手册中的<>厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他书籍,最终在<&...

    请采纳我的答案。

    要搞明白如何让python调用C/C++代码(也就是写python的extension),你需要征服手册中的<>厚厚的一章。在昨天花了一个小时看地头晕脑胀,仍然不知道如何写python的extension后,查阅了一些其他书籍,最终在<>书中找到了教程。

    1。 首先要明白的是,所谓的python扩展(也就是你提供给python的c/c++代码,不一定是c/c++代码,可以是其他语言写的代码)是一个dll,并且这个dll放在本机python安装目录下的DLLs目录下(譬如我机器上的路径是:F:/Program Files/Python25/DLLs),假如我们接下来要写的扩展module名为mb,python调用的代码为:import mbmb。

    showMsg("Python's really amazing, I kindda love it!")

    2。 搭建环境,我们要使用python提供的c头文件和lib库来进行扩展的开发。

    在vs 2005下点击菜单 "工具"->"选项", 打开选项对话框,选择"项目和解决方案->VC++目录", 然后在右边"显示以下内容的目录"得comboBox上选择"包含文件”,添加python的include目录(我的机器上是"F:/Program Files/Python25/include"),然后选择库文件,添加python的libs目录(我的机器上是"F:/Program Files/Python25/libs")。

    既然扩展是一个dll,接下来我们要建立一个“动态链接库”工程,然后开始写代码:

    #include //python。h是包含python一些定义的头文件,在python的include目录下/*我的python版本是2。

    5, 因为安装python后它没提供debug下的lib库文件,因此你必须生成release版的dll,

    想要生成dll版本的,你要到python官网上自己去下载python源代码,当然你可以继续生成release版本的dll,但dll中包含调试信息*/#pragma comment(lib, "python25。

    lib")//先不管static PyObject* mb_showMsg(PyObject* self, PyObject *args);/*如果你的扩展是mb,那么必须实现一个initmb函数,并且从dll中导出这个函数,但我们在python中调用import mb时,python会去dll里去调用

    extern "C" __declspec(dllexport) void initmb(){/*当调用mb。

    showMsg("Python's really amazing, I kindda love it!")时, 相当于你告诉python我有一个showMsg函数,我们怎么告诉python去调用我们dll里的mb_showMsg函数呢?技巧就是下面的方式,定义一个字典数据结构,key => showMsg, value =>mb_showMsg,METH_VARARGS是函数调用方式,仔细查手册吧*/static PyMethodDef mbMethods[] = {

    {"showMsg", mb_showMsg, METH_VARARGS},

    {NULL, NULL, NULL} /*sentinel,哨兵,用来标识结束*/};//告诉python我们的模块名叫mb, 模块包含的函数都在mbMethods字典里

    PyObject *m = Py_InitModule("mb", mbMethods);}/*接下来实现核心功能showMsg*///第一个self参数我们用不着,具体查手册,第二个参数是python传给我们的参数,它是一个python的参数tuple

    static PyObject* mb_showMsg(PyObject* self, PyObject *args){//我们的showMsg函数需要的是一个字符串参数

    const char* msg = NULL;/*调用特殊参数解码python传递给我们的参数,s是string,我们传递接收参数的变量地址,

    如果你的功能函数需要两个参数,在PyArg_parseTuple后面继续添加接受参数的变量地址,

    这个函数的原型是类似printf的不定参数的形式

    PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, 。

    。。);*/if (!PyArg_ParseTuple(args, "s", &msg))

    return NULL;//调用MBint r = ::MessageBox(NULL, "hello", "Caption:Form C module", MB_ICONINFORMATION | MB_OK);//返回值return Py_BuildValue("i", r);}将上面这段混杂着大量注释的代码拷贝到你的编辑器里,然后编译生成mb。

    dll,修改后缀成mb。pyd,然后拷贝到python的DLLs目录下,打开idle(python的交互程序),写入代码:import mbmb。showMsg("Python's really amazing, I kindda love it!")。

    全部

    展开全文
  • c++调用matlab函数

    2019-07-20 21:04:55
    第一步:在MATLAB中的命令行窗口中输入mex -setup 第二步:点击界面中的“mex -setup C++”,点击Microsoft Visual C++ 2015 Professional 第三步:对function进行编译了,编译的命令为:mcc -W cpplib:pc -T link:...

    第一步:在MATLAB中的命令行窗口中输入mex -setup

    第二步:点击界面中的“mex -setup C++”,点击Microsoft Visual C++ 2015 Professional

    第三步:对function进行编译了,编译的命令为:mcc -W cpplib:pc -T link:lib rectify

    注意:rectify为函数名。这条命令中pc表示的是想要生成的库的名称,可以自己定,最后面的rectify表示的是要编译的函数的名,注意函数名后面不要加.m后缀。其他的参数都不用改。
    在这里插入图片描述
    第四步:经过上面的编译后,在该文件夹下就会生成.h .cpp .lib .dll这四个文件,因为我设置的输出的库名称为pc,因此我这里生成pc.h pc.cpp pc.lib pc.dll这四个文件。

    展开全文
  • C++析构函数

    2016-08-02 13:38:48
    之前一直想看C++中,子类、基类的析构函数的调用过程,使用编辑器VS时,要使运行窗口不消失就需要在main函数中的return 0;语句之前加上system(“pasue”)或getch();之类的语句,这种方式使得一直无法执行到析构函数...

    一、一个困扰了楼主一段时间的问题的解决

    之前一直想看C++中,子类、基类的析构函数的调用过程,使用编辑器VS时,要使运行窗口不消失就需要在main函数中的return 0;语句之前加上system(“pasue”)或getch();之类的语句,这种方式使得一直无法执行到析构函数,无法查看析构函数的调用过程

    解决方法:Ctrl+F5运行程序后会生成.exe文件,将.exe文件在DOS命令行中运行,即可以查看析构函数的调用过程

    二、参考

    [参考](http://www.cnblogs.com/daoluanxiaozi/archive/2011/12/09/2281796.html)
    

    三、析构函数调用

    对象在构造的时候系统会分配内存资源,对一些数据成员进行初始化或赋值;一个良好的class需要有资源回收的机制而这一操作便落在了析构函数的头上,析构函数负责类内的资源的free

    自动调用,直接声明一个对象,会自动调用构造函数和析构函数

    声明一个指针对象,在给指针对象赋值时会调用构造函数,但是在main函数返回时,不会自动调用析构函数,必须要手动的删除这个对象才会调用析构函数

     class MyClass{  
        public:  
            MyClass(){  
                cout << "构造函数" <<endl;  
            }  
            ~MyClass(){  
                cout << "析构函数" << endl;  
            }  
        };  
        int main(){  
        //直接声明一个对象,在声明的时候,直接调用类的构造函数,在主函数结束之前的那一刻,也自动调用了这个类的析构函数  
            MyClass mc;  
        //直接声明一个对象指针(知识声明),既不自动调用构造函数,也不自动调用析构函数  
            MyClass *mc1;  
        //对指针进行赋值,在主函数结束时,只会调用构造函数,不会调用析构函数  
            mc1 = new MyClass();  
        //C++:你提醒我给一个对象分配空间,那也得麻烦你提醒我将它释放  
            delete mc1;  
        /*所以如果是指针在new之后需要手动释放资源。在较大型的工程当中,资源的释放很重要,因为涉及的数据量比较多,稍有不慎就会造成资源的浪费和泄露等问题,从现在开始就应该养成把握资源的好习惯 
        */  
            return 0;  
        }  
    没有添加delete mc1的执行结果 添加delete mc1的执行结果

    四、宁以pass-by-reference-to-const替换pass-by-value ——-Scott Meyers

        class MyClass{  
        public:  
            MyClass(){  
                cout << "构造函数" <<endl;  
            }  
            MyClass(const MyClass &mc){  
                cout << "复制构造函数"<<endl;  
            }  
            ~MyClass(){  
                cout << "析构函数" << endl;  
            }  
        };  
        //void function(MyClass mc)  
        //{  
        //}  
        void function(MyClass &mc)  
        {  
        }  
    
        int main()  
        {  
            MyClass mc;  
            function(mc);  
            //不加&运行结果:构造函数 复制构造函数  析构函数  析构函数  
            //加了&运行结果:构造函数  析构函数  
        /* 
        结果很明朗,function函数内对myclass类的对象mc作了一次复制(浅复制而已)而造出了另一个对象,也就是函数内的对象副本;调用函数的时候,如果选择是传值调用,那么会有参数副本被复制到函数的栈区。因为这里调用的myclass类默认的copy构造函数,而不是调用上面myclass类的构造函数,但我们都明白,无论是哪种,都了构造,都是需要花费时间的,先不管时间有多短;遇上析构函数那是必然的。再者,如果myclass类有n个父类,而它的父类又有几个参数需要构造析构,最后还需要层层析构,那这个花费的时间可就不能四舍五入啦。 
        */  
            return 0;  
        }  

    五、总结

    在使用多态时,使用delete后才会调用基类的析构函数,基类析构函数定义为virtual时才能够调用子类的析构函数
    
    展开全文
  • C++回调函数和this指针的实例

    千次阅读 2016-03-09 17:26:00
    在做到界面开发的过程中,往往需要通过子窗口去操作父窗口的问题。方法很多,大致实现下回调函数和类静态对象的使用。 在类的非静态函数的形参列表里,有个隐含的this指针,但是静态成员函数没有this指针,所以类的...
  •  (让程序等待你按下任意键,再继续执行下面的语句)C++:1.包含头文件时: #include /*header file,因为在stdlib.h头文件中定义了system()函数*/2.在最后一句加上:system("PAUSE");//system函数,Paus
  • 《LLH-Graphics C++图形函数库》使用说明 1 前言 博大纾深而又高度灵活的C++语言的对于程序设计的初学者来说是一座难以翻越的高幱。不仅如此,他们还要在很长一段时间内忍受让人厌恶的控制台(Console)界面,...
  • 动态dll还是需要vs不是...C++生成动态链接库 教程 教训,这个h和dll文件放置位置是在代码这个文件夹,不是debug文件夹。。。https://blog.csdn.net/shuimanting520/article/details/78715615 VS查看dll声明的函数 ...
  • Visual C++窗口标题改变的几种方法 在论坛中,经常有人会问到这个问题,所以今天整理了几种方法用来改变窗口标题,希望对这些朋友有所帮助。  一•单文档接口(SDI)类型窗口标题的改变  首先,我们来看Windows ...
  • vs环境下C++dll生成和使用(基础篇)

    万次阅读 2017-05-27 17:13:20
    动态库和静态库:**动态库:全名动态链接库,用于将你的函数封装,让别人只能调用,不能看你的实现代码。由引入库和dll组成:引入库包含导出的函数和变量名,dll...User32.dll:包含用于执行用户界面任务,如窗口和消
  • 文章目录说明工具及环境基本图形绘制生成图形窗口绘制点绘制线绘制矩形绘制圆文字输出贴图操作声明 IMAGE 类型变量载入图片输出图片 说明     C++语言图形编程最基本的几个函数,简略代码,仅介绍函数及参数,并...
  • 在我们之前的程序中并没有见到窗口函数,因为我们在显示图像时如果没有主动定义图像窗口,程序会自动生成一个窗口用于显示图像,然而有时我们需要在显示图像之前对图像窗口进行操作,例如添加滑动条,此时就需要提前...
  • #include <afxwin.h> #include "resource.h" //载入资源文件所使用的头文件 class MyFrame:public CFrameWnd //建框架视窗 第二步 { private: ... MyFrame() //构造函数 { Create(N...
  • C++ -- 探索虚函数

    2018-05-03 16:20:36
    一.虚函数表 1.虚函数:类的成员函数前面加上virtual关键字...(1)一个类中含有虚函数,其对象监视窗口如下,可以看到A类的对象a1中含有一个虚表指针(_vfptr),这个虚表指针指向了一个虚表,虚表里面含有两个元...
  • c/c++生成的exe文件,无法打开

    千次阅读 2014-09-26 22:50:22
    c/c++ 编程生成的.exe文件无法打开。  只能在编译器上才可以打开,一旦关了编译器,自己编译生成的exe文件就打不开了。  自己编译的程序有时运气好的话。exe文件可以打开。但是大多数打不开(出现闪动一下黑窗口...
  • 参考: 1、https://docs.opencv.org/3.2.0/ ...使用随机数生成器类(cv :: RNG)以及如何从统一分布中获得一个随机数。 通过使用函数cv :: putText在OpenCV窗口上显示文本 代码 在前面的教程(Basic
  • 主题 软件开发 Windows编程之注册窗口类 介绍了 注册窗口类。... 我们用Visual Studio创建一个win32项目上会自动生成一个创建窗体函数。如下:  // // 函数: InitInstance(HINSTANCE, int) /
  • 比如现在有一个函数叫MyFunc,现在想通过函数名调用该函数,该怎么办呢? 2.概述 这个问题需要用到c++动态库dll的创建和解析,通过这两个知识点,可以解决以上问题,下里面我们详细讲述 3.dll库的动态调用和...
  • C++支持缺省参数值并非仅仅为了函数调用灵活 与其说C++支持缺省参数值是为了让巨人写的函数适用于各种小人,不如说是为了让巨人写的类适用于各种小人。 带有缺省参数值的函数最常见的是构造函数。构造函数是...
  • 这是图书管理系统的 一部分,有Course数据类和Teachercaozuo类,现在程序能正常运行,但是运行窗口输入数据后数据没了,程序也没反应,我检查了一下应该是操作类的问题。</p><p>图一是一开始的,图二输入数据回车后...
  • 运行程序: Ctrl + F5 或调试 &gt;“开始执行(不调试)”菜单 ... 使用输出窗口查看生成输出和其他消息  4. 使用错误列表窗口查看错误  5. 转到“项目”&gt;“添加新项”以创建新的代码文...
  •  用我的理解通俗地解释一下什么是C++中的Thunk技术吧! Thunk技术就是申请一段可执行的内存, 并... 你曾经初学C++时, 如果我没猜错的话, 肯定尝试过用C++封装一个窗口类(因为我也尝试过 :-) ),在封装窗口类的时候...
  • Cbitmap* userGetBitmap(HWND hwnd,int nBMPWIDTH,int nBMPHEIGHT); hwnd需要显示当前图像的窗口句柄 ... C++的DLL中有如上函数,请问,用C#如何接招。如何用C#要根据上面的函数生成一个图片并在控件中显示。
  • C++Windows编程之注册窗口

    千次阅读 2013-01-15 20:28:55
    我们用Visual Studio创建一个win32项目上会自动生成一个注册窗口类。如下: // // 函数: MyRegisterClass() // // 目的: 注册窗口类。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 450
精华内容 180
关键字:

c++窗口生成函数

c++ 订阅