سؤال

لدي QTimer متصل ب TimerHandler وظيفة.ال TimerHandler يجب أن تفعل بلدي SendKeys الوظيفة التي أعلنتها في القسم العام من رأسي.إذا كنت اكتب يدويا في النص ل SendKeys وظيفة أنه يعطي الإخراج الصحيح.ولكن إذا كنت تمرير النص من محددة مسبقا LPSTR يخرج القمامة.هنا هو رمز بلدي:

مشروعي.h

#ifndef MYPROJECT_H
#define MYPROJECT_H

#include <QtGui/QMainWindow>
#include "ui_myproject.h"
#include <qtimer.h>
#include <qmessagebox.h>
#include <Windows.h>

class MyProject : public QMainWindow
{
    Q_OBJECT

public:
    MyClass(QWidget *parent = 0, Qt::WFlags flags = 0);
    Ui::MyProjectClass ui;
    QTimer* SpamTimer;

    void SendText(char* message, int size)
    {
        int lc=0;
        do{
        keybd_event(VkKeyScan(message[lc]),0,KEYEVENTF_EXTENDEDKEY,0);
        keybd_event(VkKeyScan(message[lc]),0,KEYEVENTF_KEYUP,0);
        lc=lc+1;
        }while(lc<size);
        keybd_event(VK_RETURN,0,KEYEVENTF_EXTENDEDKEY,0);
        keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
    }

public slots:
    void StartBTNClick();
    void StopBTNClick();
    void TimerHandler();
};
#endif // MYPROJECT_H

مشروعي.حزب الشعب الكمبودي

#include "MyProject.h"

LPSTR txtMessage; // Message for SendKeys function.
int buffer;
bool TimerEnabled = 0;

MyClass::MainWindow(QWidget *parent, Qt::WFlags flags) // Intializing MainWindow
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);
    statusBar()->showMessage("Status: Idle.");
    connect(ui.StartBTN, SIGNAL(clicked()), this, SLOT(StartBTNClick()));
    connect(ui.StopBTN, SIGNAL(clicked()), this, SLOT(StopBTNClick()));
}

void MyClass::StartBTNClick() // Starts the timer.
{
    int delay; // delay for QTimer
    bool ok;
    std::string convertme;

    QString TextMSG = ui.TextBox->text(); // Get text from 'line edit' for txtMessage.
    QString TimeMSG = ui.TimeBox->text(); // Get text from 2nd 'line edit' for delay.
    convertme = TextMSG.toStdString();
    txtMessage = const_cast<char*> (convertme.c_str()); // converted QString to LPSTR.
    buffer = strlen(txtMessage);
    delay = TimeMSG.toInt(&ok, 10); // converted QString to int.
    if (delay > 0)
    {
        QtTimer = new QTimer(this);
        connect(QtTimer, SIGNAL(timeout()), this, SLOT(TimerHandler()));
        TimerEnabled = 1;
        QtTimer->start(delay);
        statusBar()->showMessage("Status: Running.");
    }
    else if (delay < 0)
    {
        QMessageBox::warning(this, "Warning!", "Delay can't be \"0\" or lower than \"0\"!");
    }
    else
    {
        QMessageBox::warning(this, "Warning!", "Delay was not specified properly.");
    }
}

void MyClass::StopBTNClick() // Stops the timer.
{
    if (TimerEnabled == 1)
    {
        QtTimer->stop();
        disconnect(QtTimer, SIGNAL(timeout()), this, SLOT(TimerHandler()));
        TimerEnabled = 0;
        statusBar()->showMessage("Status: Idle.");
    }
}

void MyClass::TimerHandler() // Timer handles the SendKeys function
{
    SendText(txtMessage, buffer);
}

وهذا يجعل بلدي القمامة الناتج الموقت بدلا من النص داخل txtMessage.إذا كنت تستخدم

SendText("test message", strlen("test message"));

بدلا من ذلك ، فإنه يخرج الرسالة بشكل صحيح.هل هناك شيء خاطئ مع قانون بلدي?

حاولت التصريح LPSTR txtMessage داخل صفي في القسم العام في MyProject.h لكن هذا أيضا لم ينجح.

هل كانت مفيدة؟

المحلول

جعل txtMessage a string كائن (std::string أو QString, ، منذ كنت تستخدم كيو تي) ، وليس مؤشر.احصل على المؤشر من هذا الكائن مباشرة قبل إجراء المكالمة إلى SendText أو ، حتى أسهل ، فقط اصنع SendText خذ كائن سلسلة بدلا من المؤشر.

void SendText(const QString& str)
{
  const char* message = str.c_str();
  // whatever else you want to do
}

المشكلة هي أنك تقوم بتخزين مؤشر للبيانات في كائن مؤقت (convertme).هذا الكائن يخرج من نطاق ويتم تدمير ويحصل على إعادة كتابة الذاكرة.السبب في أنها تعمل مع "رسالة الاختبار" هو ذلك يتم تخزين حرفية السلسلة بشكل مختلف.تحتاج إلى الاحتفاظ بالرسالة التي تحاول تخزينها في الذاكرة طوال الوقت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top