让dll通过发送指针来调用.exe函数

时间:2013-03-09 14:43:06

标签: c++ multithreading winapi dll

这个问题看起来像我之前提出的问题,除了我现在知道你不能从全局对象调用main函数。因此,此代码不适用于main。但是为什么它也会因其他功能而失败?

这是代码。

.EXE
main.cpp中

#include "dll_class.h"
#include <iostream>
int my_main(void)
{
    std::cout << "Enter the my_main code.\n";
    std::getchar();
}

DllClass object(my_main);
int main(void)
{
    std::cout << "Enter the main code.\n";
    std::getchar();
}

的.dll
dll_class.h

#include "platform.h"
#include <iostream>
class DLL_API DllClass //DLL_API is just a macro for import and export.
{
public:
    DllClass(int(*main)(void))
    {
        std::cout << "Start application.\n";
        platform = new Platform(main);
    }
    ~DllClass(void)
    {
        delete platform;
    }
private:
    Platform* platform;
};

platform.h

class DLL_API Platform
{
public:
    Platform(main_t main_tp);
    ~Platform(void){}
};

platform.cpp

#include "platform.h"
#include "Windows.h"
#include <iostream>

HHOOK hookHandle;
int(*main_p)(void);//This will hold a the main function of the the .exe.
LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam);

DWORD WINAPI callMain(_In_  LPVOID lpParameter)
{
    std::cout << "Calling the main function.\n";
    main_p();
    return 0;
}

Platform::Platform(int(*main_tp)(void))
{
    main_p = main_tp;
    CreateThread(NULL, 0, callMain, NULL, 0, NULL);
    std::cout << "Setting hooks.\n";
    hookHandle = SetWindowsHookEx(WH_MOUSE_LL, keyHandler, NULL, 0);
    std::cout << "Enter message loop.\n";
    MSG message;
    while(GetMessage(&message, (HWND)-1, 0, 0) != 0){
        TranslateMessage( &message );
        DispatchMessage( &message );
    }
}

LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam)
{
    std::cout << "Inside the hook function.\n" << std::endl;
    return CallNextHookEx(hookHandle, nCode, wParam, lParam);
}

它运行得很好,直到某个时刻。 这是输出。

Start application.  
Setting hooks.  
Calling the main function.  
Enter message loop.  
Inside the hook function. (A lot of times of course).  

但它从未说过:

Enter the my_main code.
Enter the main code.

让dll调用exe函数是不可能的吗?

2 个答案:

答案 0 :(得分:1)

答案仍然与我给你的另一个问题的答案相同。您的Platform构造函数已挂起。永远不会满足循环终止条件,因此构造函数永远不会返回。并且main函数在构造完所有全局对象之前无法运行。

更新:以上讨论是Enter the main code永不打印的原因。

如果您单步执行my_main功能,则会看到Enter the my_main code的问题:coutgetchar的来电被忽略。这是因为未指定不同翻译单元中全局对象的构造顺序。在主可执行文件中,首先构造object全局对象,这意味着cincout对象可能无法完全构造。这就是为什么cout无法打印以及getchar无法阅读的原因。

答案 1 :(得分:1)

当然,正确的做法是在object内构建main。如果需要,将my_main传递给对象。但这将解决所有“在构建之前尝试使用某些东西”。

这里的密钥(我只是从阅读其他答案的注释中收集的)是cout对象与主可执行文件和DLL不是“相同的”。这导致在您输入cout之前调用main的问题[我在上一个问题中尝试解释 - C运行时库需要初始化某些事情,并且这发生在调用main之前未指定的顺序]。