精华内容
下载资源
问答
  • C语言注册回调实例

    千次阅读 2017-08-17 15:12:14
    前言:在其他的帖子里面写过C++的注册回调实例,今天再把c的注册回调写进去,注册回调在实际的项目过程中有很大的用处 注册回调函数hpp文件: #ifndef __API_H_ #define __API_H_ typedef enum { STUDENT_...

    前言:在其他的帖子里面写过C++的注册回调实例,今天再把c的注册回调写进去,注册回调在实际的项目过程中有很大的用处


    注册回调函数hpp文件:

    #ifndef __API_H_
    #define __API_H_
    
    typedef enum
    {
    	STUDENT_INFO,
    	TEACHER_INFO,
    
    }StructType;
    
    
    typedef void(*GuiCallBack)(void *, StructType);
    
    
    typedef struct
    {
    	char name[100];
    	int age;
    	int  grade;
    
    }struStudent;
    
    
    
    typedef struct
    {
    	char name[100];
    	int age;
    	
    
    }struTeacher;
    
    
    
    static GuiCallBack guiCallBack = (GuiCallBack)0;
    
    
    void onInit(GuiCallBack pCallBack)
    {
    	if (guiCallBack == nullptr)
    	{
    		guiCallBack = pCallBack;
    	}
    }
    
    
    void SetStudentinfo()
    {
    	struStudent student;
    	//student.name[100] = "DF";
    	strcpy_s(student.name, "DF");
    	student.age = 27;
    	student.grade = 5;
    	guiCallBack(&student, STUDENT_INFO);
    }
    
    void SetTeacherInfo()
    {
    	struTeacher teacher;
    	//teacher.name[100] = 'ZH';
    	strcpy_s(teacher.name,"ZH");
    	teacher.age = 33;
    	guiCallBack(&teacher,TEACHER_INFO);
    }
    
    
    
    #endif

    主函数调用实例:

    // RegisterCallback.cpp : 定义控制台应用程序的入口点。

    //
    
    #include "stdafx.h"
    #include"TestCall.hpp"
    #include"API.hpp"
    
    using namespace std;
    void  onGuiCallBack(void *data, StructType type)
    {
    	switch ( type)
    	{
    	case STUDENT_INFO:
    	{
    		struStudent *info = (struStudent *)data;
    		cout <<"studentinfo: "<< info->name << "  " << info->age << " " << info->grade << endl;
    	}
    	break;
    	case TEACHER_INFO:
    	{
    		struTeacher *info = (struTeacher *)data;
    		cout << "TeachInfo:" << info->name << "  " << info->age << endl;
    	}
    	break;
    	default:
    		break;
    	}
    }
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	onInit(onGuiCallBack);
    	SetStudentinfo();
    	SetTeacherInfo();
    
    	system("pause");
    	return 0;
    }
    




    展开全文
  • 如何用注册回调实现监听

    千次阅读 2016-08-22 14:53:55
    前提:在上一篇文章中,自己简单写了一个注册回调的例子(c++ 注册回调函数研究),以及自己对注册回调一些理解,在后面的研究过程中,特别是做项目的时候越来越发现注册回调在项目中占有非常重要的重用,在目前自己...


    前提:在上一篇文章中,自己简单写了一个注册回调的例子(c++ 注册回调函数研究),以及自己对注册回调一些理解,在后面的研究过程中,特别是做项目的时候越来越发现注册回调在项目中占有非常重要的重用,在目前自己所做的项目中,基本上每一个模块都使用了注册回调,所以自己在以现在所做项目为背景又写了一个简单的例子,过程写的有些粗糙,主要是为了实现这种架构模式。


    代码 实例背景:在一个基类的基础上诞生了两个子类,分别是分别是视频类(Video) 和音频类(Audio),在音频和视频切换的时候需要做相关显示界面的切换,以及相关播放视频控制的切换。实现切换的过程在基类中实现。


    代码示例:

    (0) 实现监听程序

    #pragma once
    #include<list>
    
    class Listener
    {
    public:	
    	Listener(){};
    	~Listener(){};
    	virtual void update(const int &mask, const void *message) = 0;
    };
    
    class  Subject
    
    {
    public:
    	Subject()
    	{
    	
    	}
    	~ Subject()
    	{
    	
    	}
    
    	void addNotifyListener(Listener *listener)
    	{
    		if(listener != nullptr)
    		{
    			m_Listeners.push_back(listener);
    		}
    	}
    
    	void removeListener(Listener *listener)
    	{
    		if(listener != nullptr)
    		{
    			m_Listeners.remove(listener);
    		}
    	}
    
    	void clearListener()
    	{
    		LISTENERLIST::iterator it  =  m_Listeners.begin();
    		LISTENERLIST::iterator end =  m_Listeners.end();
    
    		while (it!= end)
    		{
    			Listener* l = *it; 
    			delete l;
    			l = nullptr;
    			it++;
    		}
    
    		m_Listeners.clear();	
    	}
    
    	void notify(const int &mask, const void *message  = nullptr)
    	{
    		LISTENERLIST::iterator it  =  m_Listeners.begin();
    		LISTENERLIST::iterator end =  m_Listeners.end();
    
    		while (it!= end)	
    		{
    			(*it)->update(mask,message);
    			it++;
    		}
    	}
    
    
    private:
    	typedef std::list<Listener *> LISTENERLIST;
    	LISTENERLIST m_Listeners;
    };
    
    


    (1) 首先定义全局消息 ,(Message.h 文件)

    #pragma once
    
    enum
    {
    	SHOW_VIDOE = 2,
    	SHOW_AUIDO  = 3,
    };
    	 
    (2)  定义基类文件 (parentA.hpp)

    #pragma once
    #include"stdafx.h"
    #include<iostream>
    #include"Listener.h"
    #include"Messsage.h"
    
    class  ParentA:public Subject
    {
    public:
    	void showParentAll(int value) //
    	{
    		if(value == 1)
    		{
    			this->notify(SHOW_AUIDO);
    		}
    		else if(value ==2)
    		{
    			this->notify(SHOW_VIDOE);
    		}
    
    		//std::cout<<"This is Parent"<<std::endl;
    	}
    private:
    
    };

    (3) 定义两个子类文件

    // ChildA_1

    #pragma once 
    #include"stdafx.h"
    #include"parentA.hpp"
    #include"Messsage.h"
    class  ChildA_1 :public ParentA
    {
    public:
    	 ChildA_1()
    	 {
    		 
    	 }
    	~ ChildA_1()
    	{
    	
    	}
    
    	void showChildAudio()
    	{
    		//
    	}
    
    private:
    
    };
    
     


    //ChildA_2

    #pragma once 
    #include"stdafx.h"
    #include"parentA.hpp"
    #include"Messsage.h"
    class  ChildA_1 :public ParentA
    {
    public:
    	 ChildA_1()
    	 {
    		 
    	 }
    	~ ChildA_1()
    	{
    	
    	}
    
    	void showChildAudio()
    	{
    		//
    	}
    
    private:
    
    };
    (4) 定义调用用程序

    #pragma once
    #include"stdafx.h"
    #include"parentA.hpp"
    #include"ChildA_1.hpp"
    #include"ChildA_2.hpp"
    #include"Listener.h"
    
    
    using namespace std;
    class MainWindow:public Listener
    {
    public:
    	MainWindow()
    	{
    		m_childAuido = new ChildA_1();
    		m_childVideo = new ChildA_2();
    		m_childAuido->addNotifyListener(this);
    		m_childVideo->addNotifyListener(this);
    	}
    	~MainWindow()
    	{
    		
    	}
    
    
    	void update(const int &mask, const void *message)
    	{
    		if(mask == SHOW_AUIDO)
    		{
    			cout<<"AUdio"<<endl;
    			
    		}
    		else if(mask == SHOW_VIDOE)
    		{
    			cout<<"VIdeo" <<endl;
    		
    		}
    	}
    
    
    	void TestListener()
    	{
    		for(int  i =1;i < 4 ; i++)
    		{
    			if( i == 1 )
    			{
    				m_parent = m_childAuido;
    				m_parent->showParentAll(i);
    			}
    			else if(i ==2)
    			{
    				m_parent = m_childVideo;
    				m_parent->showParentAll(i);
    			}
    		}
    	}
    
    
    
    
    private:
    	ParentA *m_parent;
    	ChildA_1 *m_childAuido;
    	ChildA_2 *m_childVideo;
    };
    

    (测试主程序)

    #include "stdafx.h"
    #include"MainWindowcpp.cpp"
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	MainWindow m_mainWindow;
    
    	m_mainWindow.TestListener();
    	system("Pause");
    	return 0;
    }
    

    总结:上面的过程比较简单,主要是想把主要的设计思想体现出来,望大家见谅。



     


    展开全文
  • c++ 注册回调函数研究

    万次阅读 2016-08-19 15:18:03
    一 何为注册回调   注册回调简单解释就是一个高层调用底层,底层再回过头来调用高层,这个过程就叫注册回调, 连接高层和底层就叫注册回调函数。高层程序C1调用底层程序C2,而在底层程序C2 又调用了高层程序C2的...

    一 何为注册回调 

       注册回调简单解释就是一个高层调用底层,底层再过头来用高层,这个过程就叫注册回调, 连接高层和底层就叫注册回调函数。高层程序C1调用底层程序C2,而在底层程序C2 又调用了高层程序C2的callback函数,那么这个callback函数对于高层程序C1来说就是回调函数。 在设计模式中这个方式叫回调模式。


    二 注册回调函数的实例:

    //底层程序 C2

    #include<iostream>
    
    using namespace std;
    
    class CCallback
    {
    public:
    	virtual void onCallbackFunc(int value,int type) =0;	
    };
    
    class ClassA
    {
    public: 
    	ClassA(CCallback *pCallbackFunc)
    	{
    		m_pCallBack = pCallbackFunc;	
    	}
    
    	void showValue()
    	{
    		m_pCallBack->onCallbackFunc(15,0);
    		m_pCallBack->onCallbackFunc(17,1);
    	}
    private:
    	CCallback *m_pCallBack;
    
    };
    

    //高层程序 C1

    #include<iostream>
    #include"ClassA.hpp"
    using namespace std;
    
    class ClassB : public CCallback
    {
    public:
    	ClassB()
    	{
    		m_ClassA = new ClassA(this);				
    	}
    
    	void onCallbackFunc(int value,int type)
    	{
    		if(type == 0)
    		{
    			cout<<"Typ_ZERO =  "<< value<<endl;
    		}
    		else
    		{
    			cout<<"Typ_Other =  "<< value<<endl;
    		}
    	}
    
    	void TestShowData()
    	{
    		m_ClassA->showValue();
    	}
    public:
    	ClassA * m_ClassA;
    };
    


    //主程序 main 

    #include "stdafx.h"
    #include"ClassB.hpp"
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	ClassB *m_classB =new ClassB();
    	
    	m_classB->TestShowData();
    
    	system("pause:");
    	return 0;
    }
    

    测试结果:



    上面就是一个简单的注册回调的过程。


    三 : 注册回调有何作用

     注册回调 可以让调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。





    展开全文
  • 注册回调函数实现方法

    千次阅读 2019-04-12 12:34:07
    回调函数(callback):回调函数就是在框架设计之初留下一个还未实现的接口,供后来人去实现(不实现也没事)。也可以理解在别人的函数中“插一脚”,有一种“你的过去我来不及参与,你的未来我奉陪到底”。 看代码...

    前言

    回调函数(callback):回调函数就是在框架设计之初留下一个还未实现的接口,供后来人去实现(不实现也没事)。也可以理解在别人的函数中“插一脚”,有一种“你的过去我来不及参与,你的未来我奉陪到底”。 看代码的时候是不是总能看到api提供了一个注册函数,这个被封装,你是否好奇他是如何实现的?

    话不多说,上代码

    回调函数是由函数指针来实现的,在看这个之前先要了解函数指针哦

    int (*p[5])() = {NULL};  // 创建一个函数指针数组
    int main(int argc, char * argv[])  // 这个一般情况时官方封装成一个库函数,上电就会一直运行,类似守护进程
    {
    		register_hook_callback(test01);
    		register_hook_callback(test02);
    		 while(1)
    	    {
    	        hook();
    	        printf("=====运行========\n");
    	        Sleep(1000);
    	    }
    }
    
    int hook()  // 官方封装起来
    {
        int i = 0;
        for(i=0; i<5; i++)
        {
            if(p[i] != NULL)
            {
                p[i]();
            }
        }
    }
    
    int register_hook_callback(int (*p_callback)())  // 只是提供一个注册函数
    {
        int i = 0;
        for(i=0; i<5; i++)
        {
            if(p[i] == NULL)
            {
                p[i] = p_callback;
                break;
            }
        }
    }
    
    int test01()  // 用户自己要添加的注册函数的函数
    {
        printf("\ntest01 callback\n");
    }
    int test02()
    {
        printf("\ntest02 callback\n");
    }
    

    运行结果

    test01 callback
    
    test02 callback
    =====运行========
    
    test01 callback
    
    test02 callback
    =====运行========
    

    后言

    相信有人注意到这个回调函数怎么无法传递参数呢!!! 0.0 还没研究到呢 过几天弄好了在分享一下,需要的关注下

    展开全文
  • android aidl 注册回调接口为空

    千次阅读 2018-01-16 18:12:01
    在使用aidl时遇到成功绑定服务端后注册回调接口时为空的问题。 项目需要:将aidl进程间通信封装成独立的lib(jar包),供其他应用使用。 因对aidl只是一知半解,使用上出现了令我无比头痛的问题:在通过aidl绑定...
  • C++的函数代码如下,注册接口为cppfunction,回调函数为pFunc,其参数为PARA结构体。 ``` void cppfunction(void (*pFunc)(PARA*)) ``` 通过动态注册JNI的方式,cppfunction的函数签名该如何书写?直接将其参数标为...
  • #region 获取回调URL里面的参数 //url中的签名 string msgSignature = context.Request["signature"]; //url中的时间戳 string timeStamp = context.Request["timestamp"]; //url中的随机字符串 string...
  • 前些日子捣鼓了下VFW,里面注册回调(callback)函数是通过sendmessage函数实现的,也就是把回调函数的指针作为参数发送给hWnd即可。折腾了不少时间,下面是代码这是C/C++代码 typedef struct videohdr_tag { LPBYTE ...
  • C语言注册回调函数例子

    千次阅读 2018-08-27 14:56:26
    #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } /...
  • GLUT-注册回调函数

    千次阅读 2011-12-16 11:26:16
    void glutDisplayFunc(void (*func)(void) );为当前窗口设置显示回调函数...注册当前窗口的重叠层的显示回调函数void glutReshapeFunc(void (*Func)(int width, int height) );指定当窗口的大小改变时调用的函数void
  • GLUT函数说明--注册回调

    千次阅读 2010-05-23 12:58:00
    void glutDisplayFunc(void (*func)(void) );为当前窗口设置显示回调函数void ...注册当前窗口的重叠层的显示回调函数void glutReshapeFunc(void (*Func)(int width, int height) );指定当窗口的大小改变
  • C语言中的注册回调函数_onexit()

    千次阅读 2014-04-27 23:16:30
    注册一个退出回调函数。 返回值: 成功返回一个指针,否则返回NULL。 参数: 回调函数的指针。 例子: #include #include int fn1(void), fn2(void), fn3(void), fn4 (void); void main( ...
  • 注册回调函数处理SQLITE_BUSY错误

    千次阅读 2010-06-01 18:34:00
     这个函数设置了一个回调函数,当试图打开一个在另一个线程或进程中被锁住的表时,该回调函数可能会被调用。 (译注:这里用的是"可能"被调用,后面会有解译) 当遇到数据库被锁时,如果回调函数是NULL,那么...
  • LUA和C/C++交互-注册回调函数

    千次阅读 2014-10-09 16:37:29
    //lua 脚本注册回调函数 lua_State *L = luaL_newstate();  if (L) { luaopen_base(L); luaL_openlibs(L); lua_register(L, "IsLastTradeDate", LUA_Func::IsLastTradeDate); lua_register...
  • c的注册回调浅谈

    千次阅读 2018-10-21 20:19:08
    注册回调的作用 在设计模式中注册回调的方式叫做回调模式。在SDK开发中,为增强开发者的SDK通用性,排序或者一些算法逻辑需要使用者进行编写。这时候就需要向SDK传递回调函数。 注册回调的流程 SDK的接口会提供一个...
  • 回调函数 注册

    千次阅读 2016-05-14 15:48:14
    C语言回调函数–注册 续接上一节 回调函数数组...1、首先按照CBDemo格式声明结构体变量demo,用于注册回调函数,再对k赋值。  按照Data格式声明结构体变量data,用于存储回调函数要用的数据,再对i,j赋值。 2、硬件
  • C++的注册回调

    千次阅读 2019-07-02 09:10:00
    注册回调的作用  在设计模式中注册回调的方式叫做回调模式。在SDK开发中,为增强开发者的SDK通用性,排序或者一些算法逻辑需要使用者进行编写。这时候就需要向SDK传递回调函数。注册回调能使下层主动与上层通信。...
  • 定义注册回调函数在A中需要:1.定义回调函数2.调用B的注册回调函数使用回调函数的几个步骤:1.在B中,约定借口规范,定义回调函数a()的原型这里回调函数原型的定义最好遵循typedef void (*SCT_XXX)(LPVOID lp, const ...
  • 回调函数

    千次阅读 2019-08-31 13:14:26
    2、注册回调函数:使用回调函数的一方。它定义一个接受函数指针的接口来接受回调函数的地址,在需要的时候调用回调函数。 3、定义回调函数的步骤: (1)确定好回调函数的形参格式。 (2)确定谁写回调函数,谁写...
  • C++调用C#注册回调函数

    千次阅读 2017-12-28 19:12:01
    本文主要讲解C#注册回调函数提供给C++调用,用于异步通知机制。这在编程过程中是经常需要用到的模式。 此过程需要创建三个工程: 1. C++动态库工程 2. C++ CLR 托管动态库工程 3. C# 测试工程 接着前文C++封装...
  • 注册回调

    千次阅读 2017-03-20 15:23:35
    何为回调(callback) 所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。 ...
  • C#在C++编写的DLL中注册函数并回调

    千次阅读 2015-08-22 13:12:39
    一个简单的Demo 描述了C#在C++中注册回调函数的过程
  • C回调函数

    千次阅读 2019-05-21 19:03:14
    回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针(地址)作为...1、首先使用回调函数,就会用到怎么注册回调函数这个问题。你需要告诉底层代码,它需要调用的函数是什么,那么就得事先定义好回调函数...
  • CEF:注册JS回调

    千次阅读 2019-06-12 17:42:33
    前面我们学习了C++和JS的基本交互。...但是在实际应用过程中可能我们事先并不知道函数原型,而是使用的函数指针来回调结果。例如: do_event(call_back,parama1,parama2,....paramaN) 此时需要使用CEF::Exe...
  • C语言 — 函数的注册回调

    千次阅读 2019-09-03 23:21:11
    函数注册回调函数 1、什么是函数注册回调 回调函数无非是对函数指针的应用,说白了就是通过使用函数指针来调用一个函数,而函数注册就是把函数指针作为参数传递出去便于别的模块使用的过程。所以函数注册就是...
  • 回调函数 结构体

    千次阅读 2016-05-07 19:08:05
    C语言回调函数–结构体 续接上一节 回调函数的一种概括 应用于异步事件的... 回调函数的注册实际上就是将回调函数的信息填写到一个用于注册回调函数的结构体变量中。回调函数结构体简介一、声明被回调函数原型 格
  • 本贴不讨论mfc是否过时...,难道窗口上控件都是共用同一个窗口回调函数的吗,但是在创建这些组件时也没有显示注册窗口过程为父窗口的回调函数啊,这些控件的回调函数在哪里,为啥没有注册窗口过程也能工作的好好的?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 278,390
精华内容 111,356
关键字:

注册回调