cha*_*m15 0 c c++ qt dynamic-loading
为什么以下程序崩溃?
#include <QApplication>
#include <windows.h>
#include <QFrame>
uint MSGFLT_ADD = 1;
uint WM_COPYGLOBALDATA = 0x0049;
int main(int argc, char *argv[])
{
BOOL (*ChangeWindowMessageFilter)(UINT,DWORD) = NULL;
HINSTANCE hDLL = LoadLibraryA("User32.dll"); // Handle to DLL
if (hDLL != NULL){
ChangeWindowMessageFilter = (BOOL (*)(UINT,DWORD))GetProcAddress(hDLL, "ChangeWindowMessageFilter");
}
if (ChangeWindowMessageFilter != NULL){
if (!(*ChangeWindowMessageFilter)(WM_DROPFILES, MSGFLT_ADD)){
printf("Failed to add exception for WM_DROPFILES\n");
}
if (!(*ChangeWindowMessageFilter)(WM_COPYDATA, MSGFLT_ADD)){
printf("Failed to add exception for WM_COPYDATA");
}
if (!(*ChangeWindowMessageFilter)(WM_COPYGLOBALDATA, MSGFLT_ADD)){
printf("Failed to add exception for WM_COPYGLOBALDATA");
}
printf("Added filters\n");
fflush(0);
}
if (hDLL != NULL){
FreeLibrary(hDLL);
}
QApplication a(argc, argv);
QFrame w; //debug crashes here
w.show();
return a.exec();
}Run Code Online (Sandbox Code Playgroud)
QFrame::QFrame(QWidget* parent, Qt::WindowFlags f)
: QWidget(*new QFramePrivate, parent, f) //on this line in particular
{
Q_D(QFrame);
d->init();
}
编辑:
if (!(*ChangeWindowMessageFilter)(WM_COPYDATA, MSGFLT_ADD)){ //if i disable this everything works
printf("Failed to add exception for WM_COPYDATA");
}
Run Code Online (Sandbox Code Playgroud)
BOOL (*ChangeWindowMessageFilter)(UINT,DWORD) = NULL;
Run Code Online (Sandbox Code Playgroud)
您的函数指针声明是错误的.Winapi函数总是__stdcall.毫无疑问,您的编译器使用默认的__cdecl.通过函数指针调用时获得的堆栈不平衡可能会产生许多副作用.如果您使用MSVC++并运行Debug构建,那么您将始终立即获得诊断.固定:
BOOL (WINAPI * ChangeWindowMessageFilter)(UINT,DWORD) = NULL;
Run Code Online (Sandbox Code Playgroud)
Fwiw,如果这是为了实现拖放+升级程序,那么只需删除所有这些,它将无法正常工作.D + D是基于COM的,它不使用消息.