1

这个问题看起来像我之前问的一个问题,只是我现在知道你不能从全局对象调用主函数。所以这段代码不适用于main。但是为什么其他功能也会失败呢?

这是代码。

.exe
主要.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;
};

平台.h

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

平台.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函数吗?

4

2 回答 2

1

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

更新:上面的讨论是为什么Enter the main code从不打印。

如果您单步执行您的my_main函数,您会看到以下问题: 对andEnter the my_main code的调用被忽略。这是因为不同翻译单元中全局对象的构造顺序是未指定的。在主可执行文件中,首先构造的是全局对象,这意味着和对象可能没有完全构造。这就是为什么不能打印和不能阅读的原因。coutgetcharobjectcincoutcoutgetchar

于 2013-03-09T15:51:35.207 回答
1

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

这里的关键(我只是从阅读另一个答案的评论中收集到的)是cout主可执行文件和 DLL 的对象不是“同一个”。cout这会导致调用在你进入之前所做的事情的问题main[我也试图在上一个问题中解释——C 运行时库需要初始化某些事情,并且在main调用之前以未指定的顺序发生]。

于 2013-03-09T17:43:18.120 回答