Получение ошибки: запрос на член 'at' в 'data', который имеет неклассовый тип 'const char *' | ошибка - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь установить данные буфера обмена на основе некоторых условий, сначала проверив длину строки и первый символ строки в буфере обмена. Если это вернет true, тогда я хотел бы установить текст буфера обмена на другую строку, а затем получить и отобразить новое значение на моей консоли. Вот мой Clipbpard.h

#include <iostream>
#include <windows.h>
#include <cstring>

namespace Diall_ClipBoard_catch
{
    class ClipBoard
    {
    private:
        ::HANDLE dHDat;
        ::std::string tmpstringsign;
        bool isopen;
        char* dHbuffer;
        char* dHbuffertemp;
        char* dNtoken;
    public:
        ClipBoard(void)
        {
            this->dHbuffer = const_cast <char*>("");
            this->dHbuffertemp = const_cast <char*>("");
            this->tmpstringsign = "dnb_4554_2102";
            this->isopen = false;
        };
        ~ClipBoard(void)
        {

        }
        char* GetData(void)
        {
            this->Start();
            if (this->isopen)
            {
                this->dHDat = ::GetClipboardData(CF_TEXT);

                if (this->dHDat)
                {
                    this->dHbuffer = (char*)::GlobalLock(this->dHDat);

                    if (::std::strcmp(this->dHbuffertemp, this->dHbuffer) != 0 && this->dHbuffer != "" && this->dHbuffer != NULL)
                    {
                        this->dHbuffertemp = this->dHbuffer;
                        //::std::cout << this->dHbuffer << "\n";
                        return this->dHbuffer;
                    }

                    ::GlobalUnlock(this->dHDat);
                }
                CloseClipboard();
                this->isopen = FALSE;
                ::Sleep(1000);
            }
        }
        void SetData(void)
        {
            const char* data = this->dHbuffer;
            const char* newstring = "Hello World";
            const size_t len = strlen(data) + 1;
            HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
            memcpy(GlobalLock(hMem), data, len);
            GlobalUnlock(hMem);
            if (!OpenClipboard(NULL))
                {
                    return;
                }
            if(strlen(data) + 1 == 8 && (data.at(0) == 1 || data.at(0) == 7)){
                EmptyClipboard();
                SetClipboardData(CF_TEXT, hMem);
            }
            CloseClipboard();
            this->isopen = TRUE;
        }
    private:
        void Start(void)
        {
            if (!OpenClipboard(NULL))
            {
                return;
            }
            this->isopen = true;
        }
    };
}

А вот мой главный. cpp

#include "Clipboard.h"

int main()
{
    ::Diall_ClipBoard_catch::ClipBoard* clipboard = new Diall_ClipBoard_catch::ClipBoard();
    int temp1 = 0, temp2 = 0;
    EmptyClipboard();
    while (1)
    {
        temp1 = GetClipboardSequenceNumber();
        if (temp1!= temp2)
        {
            clipboard->SetData();
            std::cout << clipboard->GetData() << std::endl;
        }

        temp2 = temp1;
    }
    return 0;
}

Мне удалось заставить его работать без SetData (), вызвав только GetData ( ). проблема, с которой я столкнулся, заключается в том, что она возвращает строку, скопированную в буфер обмена, и после этого я не могу получить какие-либо данные из буфера обмена, т.е. она работает только один раз, когда я запускаю программу, но я хочу, чтобы она была непрерывной для каждой скопированной строки и соответствует условию.

Теперь я изменил data.at (0) на data [0], и мой код смог скомпилироваться без ошибок. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что мои условия всегда возвращают ложное значение, даже когда оно должно возвращать истинное значение. То, что я пытаюсь сделать, это проверить, является ли данные буфера обмена длиной 8 символов и начинается ли она с «1» или «3», но всегда возвращает false. Я перешел к изменению

const char* data = this->dHbuffer;

на

const char* data[] = this->dHbuffer;

Что еще я заметил, так это то, что strlen (data) возвращает 1 в качестве значения. Мой вопрос сейчас таков; Есть ли способ получить фактическую длину строки в виде строки, а не размер массива?

но я получил ошибку; Clipboard.h | 55 | ошибка: инициализатор не может определить размер «данных» | ps Я абсолютный новичок в c ++, и я только начал посещать занятия только на прошлой неделе. Я не совсем понимаю концепцию классов в c ++

1 Ответ

0 голосов
/ 23 апреля 2020

Проблема в том, что вы определили data здесь как

const char* data = this->dHbuffer;

, что означает, что data - это const char*, необработанный указатель на некоторые символы. Однако позже вы пишете

if (strlen(data) + 1 == 8 && (data.at(0) == 1 || data.at(0) == 7)) {
                              ^^^^^^^^^^         ^^^^^^^^^^

, который обрабатывает data, как если бы это был std::string. Чтобы исправить это, вместо этого напишите

if (strlen(data) + 1 == 8 && (data[0] == 1 || data[0] == 7)) {
                              ^^^^^^^         ^^^^^^^

Может быть, здесь, независимо, есть и другие ошибки, но это ошибка проксимального компилятора, с которой вы столкнулись.

...