C++ 如何在c+中从dll与调用应用程序通信+;

C++ 如何在c+中从dll与调用应用程序通信+;,c++,windows,dll,hook,C++,Windows,Dll,Hook,我创建了一个系统范围的钩子dll,在我的dll中,我试图在每次创建或销毁新进程时得到通知。 当检测到新进程时,我希望能够向调用程序发送消息,无论是布尔值还是自定义对象。 我该怎么做? 目前我正在使用一个文件来记录所有的名字!这太可怕了 这是迄今为止的代码: def文件 ;LIBRARY ; Def file EXPORTS InstallHook UninstallHook dllapi.h void InstallHook(void); void UninstallHook(

我创建了一个系统范围的钩子dll,在我的dll中,我试图在每次创建或销毁新进程时得到通知。
当检测到新进程时,我希望能够向调用程序发送消息,无论是布尔值还是自定义对象。 我该怎么做?
目前我正在使用一个文件来记录所有的名字!这太可怕了 这是迄今为止的代码:

def文件

;LIBRARY
; Def file
EXPORTS
    InstallHook
    UninstallHook
dllapi.h

void InstallHook(void);
void UninstallHook(void);
dllmain.cpp

#include "stdafx.h" 

using namespace std;
HINSTANCE currentProcessHandle;
HHOOK hookID;
string str = "1";
BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call,LPVOID lpReserved)
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
        currentProcessHandle = hModule;
    return TRUE;
}

LRESULT CALLBACK HookProcedure(int nCode, WPARAM wparam, LPARAM lparam)
{

    if (nCode < 0) return CallNextHookEx(hookID, nCode, wparam, lparam);

    std::ofstream outfile;
    CBT_CREATEWND   *CBTHOOKCREATE;
    RECT            *CBTRECTPTR;
    RECT            CBTRECT;
    wstring         Message;

    CBTHOOKCREATE = (CBT_CREATEWND*) lparam;
    LPWSTR str = L"                     ";
    outfile.open(("d:\\test.txt"), std::ios_base::app);

    if (nCode >= 0) {
        switch (nCode)
        {
        case HCBT_CREATEWND:
            outfile << *(CBTHOOKCREATE->lpcs->lpszName) << " " << CBTHOOKCREATE->lpcs->lpszName << " Created!~ " << endl;
            //cout << "Created!~" << endl;
            break;
        case HCBT_DESTROYWND:
            outfile << "Destroied!~" << endl;
            //cout << "Destroied!~" << endl;
            break;
        default:
            //cout << "sth else" << endl;
            break;
        }
    }
    outfile.close();
    return 0;
}

void InstallHook(void)
{
    hookID = SetWindowsHookEx(WH_CBT, HookProcedure, currentProcessHandle, 0);
}

void UninstallHook(void)
{ 
    UnhookWindowsHookEx(hookID);
}
#包括“stdafx.h”
使用名称空间std;
HINSTANCE-ProcessHandle;
HHOOK-hookID;
字符串str=“1”;
BOOL APIENTRY DllMain(HMODULE HMODULE,DWORD ul_呼叫原因,LPVOID LPREFERED)
{
if(ul\u调用的原因==DLL\u进程\u附加)
currentProcessHandle=hModule;
返回TRUE;
}
LRESULT回调过程(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
if(nCode<0)返回CallNextHookEx(hookID、nCode、wparam、lparam);
std::出流管;
CBT_CREATEWND*CBTHOOKCREATE;
RECT*CBTRECTPTR;
直视CT;
wstring消息;
CBTHOOKCREATE=(CBT_CREATEWND*)lparam;
LPWSTR str=L”“;
outfile.open(((“d:\\test.txt”),std::ios\u base::app);
如果(nCode>=0){
开关(nCode)
{
案例HCBT_CREATEWND:

outfile lpcs->lpszName)lpszName钩子DLL由Windows加载到钩子进程的地址空间中。您必须使用IPC。有关启动程序,请参阅

在这种情况下,可以使用一个简单的IPC

请注意,数据复制要求接收线程中有一个活动(泵送)消息队列

实现这一点的一种可能方法(许多其他可能方法):

您向EXE中添加了一个辅助线程,其中包含一个压缩的消息队列。在新线程中,您将创建一个具有特定类名的虚拟不可见窗口

这方面的代码是一个非常经典的序列:
RegisterClass
CreateWindow
而GetMessage DispatchMessage

在钩子DLL中,您将有一个全局
HWND
变量。当想要使用
WM_COPYDATA
时,如果全局变量为null,请使用
FindWindow
检索
HWND
,并存储它以备下次使用。该代码将在每个钩子进程中至少执行一次

您可能希望使用API发送
WM\u COPYDATA
消息

请注意,如果快速停止/重新启动exe,某些进程可能会在全局变量中存储无效的HWND。请检查Send API的返回值,如果返回值为“无效HWND”,请重新执行
FindWindow
(不确定这种行为是否确实可行,但无论如何…)

还要注意的是,在安装钩子之前,主线程应该等待在次线程中正确创建虚拟窗口

如果你的挂接EXE是一个窗口化的,你不需要一个辅助线程,但你必须构建一个GUI。你也可以只使用“一个线程”并设法处理一些API,同时拥有一个活动的消息队列和你的
getchar
代码,但我不建议这样做

// Hook Executer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "..\Dll\dllapi.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int num = -1;
    cout << "1.Install Hook"<<endl
        << "2.Unistall Hook"<<endl
        << "0.Exit";
    do{
        cin >> num;
        if (num ==1)
        {
            InstallHook();

        }
        else
        {
            UninstallHook();
        }
        getchar();
        system("cls");
        cout << "1.Install Hook" << endl
            << "2.Unistall Hook" << endl
            << "0.Exit";
    } while (num != 0 && num < 3);


    return 0;
}