zoukankan      html  css  js  c++  java
  • 回调函数(C/C++)

    回调函数,就是自己写一个函数自己不调用,而是其他程序调用,下面举例exe调用dll函数,反过来,dll也调用exe函数,模拟杀毒软件查杀调用。

    exe代码:

    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    
    using namespace std;
    
    #define  Log(str) {{printf("[Kill]%s
    ",str);}}
    typedef void(*pFunc)(DWORD addrFunc,char * msg);
    typedef bool(*pFuncScan)();
    
    pFunc dllCallBack;
    pFuncScan dllScan;
    
    void showResult(char * msg)
    {
        Log(msg);
    }
    
    int main(int argc,char * argv[])
    {
        HMODULE hDll = LoadLibrary("CallBackDll.dll");
    
        if (!hDll)
        {
            Log("LoadLibrary Failed");
            return 0;
        }
    
        dllCallBack = (pFunc)GetProcAddress(hDll, "RegCallBack");
    
        if (!dllCallBack)
        {
            Log("GetProcAddress Failed");
            return 0;
        }
    
        dllScan = (pFuncScan)GetProcAddress(hDll, "ScanVirus");
        dllCallBack((DWORD)showResult, "Main Virus");
    
        if (dllScan())
        {
            Log("Main Scan OK");
        }
    
        system("pause");
        return 0;
    }

    dll 代码:

    #include <windows.h>
    #include <stdio.h>
    
    //Log Print
    #define  Log(str) {{printf("[Kill]%s
    ",str);}}
    
    //Function Pointer
    typedef void (* pFunc)(char * argument);
    char * argument = NULL;
    
    pFunc callback;
    
    //Register CallBack Function
    extern "C" __declspec(dllexport) void  RegCallBack(DWORD addrFunc,char * msg)
    {
        callback = (pFunc)addrFunc;
        argument = msg;
    }
    
    //Real Scan(Real Kill Function)
    bool ScanMain()
    {
        Log("Virus....");
        Sleep(1000);
        return true;
    }
    
    //Scan Show
    extern "C" __declspec(dllexport) bool ScanVirus()
    {
        Log("Scanning Begin...");
        Sleep(3000);
    
        if (ScanMain())
        {
            callback(argument);
            Sleep(1000);
        }
    
        Log("Scanning End...");
    
        return TRUE;
    }
    
    //Dll Main
    BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
        }
    
        return TRUE;
    }
  • 相关阅读:
    2013年2月最后一周
    linux虚拟机与winodows共享文件夹linux安装VMware tools
    汇编语言 手记8
    汇编语言 手记9
    虚拟机vmware与本地磁盘共享方法
    生活里多少会有些迷茫
    《恋爱厚黑学》杨冰阳
    2012年读书目录
    2013年2月第2个周末
    JBOSSJNDI日常
  • 原文地址:https://www.cnblogs.com/DeeLMind/p/7595549.html
Copyright © 2011-2022 走看看