让DLL用函数指针调用exe函数

时间:2013-03-08 23:20:54

标签: c++ multithreading winapi

谁能告诉我我做错了什么? 我正在尝试在不同的线程上运行自定义主程序。

这是代码。

.EXE
main.cpp中

#include "dll_class.h"
#include <iostream>
int main(void);
DllClass object(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 main code.

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

2 个答案:

答案 0 :(得分:2)

从共享库中调用可执行文件中的函数是非常可能的。但是,如其他答案中所述,C标准不允许您拨打main。这与以下事实有关:C运行时[防止语言律师:插入“有时”在这里]依赖于某种顺序,如果你试图在C运行时完成之前调用main正确初始化在main之前,你会遇到问题。

如果您的目标是实际颠覆main所做的事情,那么您将不得不找到一种不同的方法来实现这一点 - 至少如果您希望它能用于多个特定的可执行文件。

答案 1 :(得分:1)

C ++标准不允许调用main()或获取其地址,这就是你在这里所做的。请参阅引用第一行和第一节的this主题。所以,你正在做的事情是未定义的。