这个问题看起来像我之前提出的问题,除了我现在知道你不能从全局对象调用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函数是不可能的吗?
答案 0 :(得分:1)
答案仍然与我给你的另一个问题的答案相同。您的Platform
构造函数已挂起。永远不会满足循环终止条件,因此构造函数永远不会返回。并且main
函数在构造完所有全局对象之前无法运行。
更新:以上讨论是Enter the main code
永不打印的原因。
如果您单步执行my_main
功能,则会看到Enter the my_main code
的问题:cout
和getchar
的来电被忽略。这是因为未指定不同翻译单元中全局对象的构造顺序。在主可执行文件中,首先构造object
全局对象,这意味着cin
和cout
对象可能无法完全构造。这就是为什么cout
无法打印以及getchar
无法阅读的原因。
答案 1 :(得分:1)
当然,正确的做法是在object
内构建main
。如果需要,将my_main
传递给对象。但这将解决所有“在构建之前尝试使用某些东西”。
这里的密钥(我只是从阅读其他答案的注释中收集的)是cout
对象与主可执行文件和DLL不是“相同的”。这导致在您输入cout
之前调用main
的问题[我在上一个问题中尝试解释 - C运行时库需要初始化某些事情,并且这发生在调用main
之前未指定的顺序]。