我正在尝试提供一些代码here的Windows版本,用于记录Qt(4.7)事件。目标应用程序是基于Qt的,执行注入的代码是fwiw。 linux版本使用库预加载来覆盖QWidget :: x11event作为录制代码的起点。
我尝试过这样做,使用winEvent作为x11event的相应等价物。我正在使用dll注入,据我所知,这是成功的。 dll在调试器中的已加载模块中列出,加载例程都是成功的。
但是我从来没有看到我的winEvent被调用。我尝试用相同的结果覆盖其他函数。
我是dll创建的新手,更不用说注入了,所以可能在某个地方错过了一个重要的步骤,但是当我构建包含我的winEvent实现的.dll时,我的怀疑是由编译器警告引起的;我得到“警告C4273:'QWidget :: winEvent':不一致的dll链接”。该DLL成功编译。目前我只是
bool QWidget::winEvent ( MSG *message, long *result)
{
// my code
}
在我的.dll中的一个cpp文件中。这够了吗?
答案 0 :(得分:0)
Qt如何使其类导出DLL?
class Q_WIDGETS_EXPORT QWidget : public QObject, public QPaintDevice
或者可能更早的Qt使用以下内容公开同一个类:
class Q_GUI_EXPORT QWidget : public QObject, public QPaintDevice
什么是Q_WIDGETS_EXPORT?毕竟#ifdef / #define重定向动态Qt你应该得到它的值:
__declspec(dllexport)
这是通过普通的Qt应用程序项目设置的。对于那个DLL注入项目(我猜)在包含Qt头之前你可能会尝试:
#define Q_WIDGETS_EXPORT __declspec(dllexport)
或
#define Q_GUI_EXPORT __declspec(dllexport)
或 弄清楚如何使值Q_GUI_EXPORT为__declspec(dllexport)
你应该仔细检查你试图用你的DLL注入的特定Qt版本的宏Q_WIDGETS_EXPORT。我偷看了Qt 5.3.2源代码。
Mind DLL导出和导入范例,对于您导入的DLL公开函数,它是导入的应用程序项目。就像国际贸易一样。