视窗 - FMX - 无效的类类型转换C++

Windows - FMX - Invalid Class Typecast C++

本文关键字:类型转换 C++ 无效 FMX 视窗      更新时间:2023-10-16

尝试通过 DLL 运行函数时,我遇到了一点麻烦。执行函数时出现以下错误(正常编译):

无效的类类型转换

这是代码:

#include <fmx.h>
#define CRIPTNSDLL_EXPORTS
#include "CriptLib.h"
#include <FMX.Memo.hpp>
#include <System.Classes.hpp>
#include <string.h>
#pragma hdrstop
#pragma argsused
//---------------------------------------------------------------------------
void Cript_BasicoM (String Original, String Chave, TMemo* Memo){
    if (Original.Length() != Chave.Length()) {
        throw Exception (L"Não é possível encriptar o conteúdo.nO tamanho das palaras chave e original não podem ser diferentes.");
    }
    for (int i = 0; i < Chave.Length(); i++) {
        for (int p = 0; p < Chave.Length(); p++) {
            if (Chave.c_str()[i] == Chave.c_str()[p] && p != i) {
                throw Exception (L"Não é possível encriptar o conteúdo.nA chave não pode ter dois caracteres iguais.");
            }
        }
    }
    for (int i = 0; i < Original.Length(); i++) {
        for (int p = 0; p < Original.Length(); p++) {
            if (Original.c_str()[i] == Original.c_str()[p] && p != i) {
                throw Exception (L"Não é possível encriptar o conteúdo.nA palavra original não pode ter dois caracteres iguais.");
            }
        }
    }
    String Linha = NULL;
    Memo->BeginUpdate();
    for (int i = 0; i < Original.Length(); i++) {
        for (int k = 0; k < Memo->Lines->Count; k++) {
            Linha = Memo->Lines->Strings[k];
            for (int l = 0; l < Linha.Length(); l++) {
                if (Linha.c_str()[l] == Original.c_str()[i]) Linha.c_str()[l] = Chave.c_str() [i];
                else if (Linha.c_str()[l] == Chave.c_str()[i]) Linha.c_str()[l] = Original.c_str() [i];
            }
            Memo->Lines->Strings[k] = Linha;
        }
    }
    Memo->Lines->Add(Original);
    Memo->Lines->Add("CriptB");
    Memo->EndUpdate();
    Memo->Repaint();
}

头文件:

#ifndef CriptLibH
#define CriptLibH
#ifdef CRIPTNSDLL_EXPORTS
#define CRIPTLIB_API __declspec(dllexport)
#else
#define CRIPTLIB_API __declspec(dllimport)
#endif
#ifdef __cplusplus
#include <fmx.h>
#include <FMX.Dialogs.hpp>
#include <System.Classes.hpp>
#include <string.h>
#include <FMX.Memo.hpp>
extern "C" {
#endif
    CRIPTLIB_API void Cript_BasicoM(String Original, String Chave, TMemo* Memo);
    CRIPTLIB_API void Cript_BasicoL(String Original, String Chave, TStringList* Lista);
    CRIPTLIB_API void Cript_BasicoS(String Original, String Chave, String Linha);
    CRIPTLIB_API void Decript_BasicoM(String Chave, TMemo* Memo);
    CRIPTLIB_API void Decript_BasicoL(String Chave, TStringList* Lista);
    CRIPTLIB_API void Decript_BasicoS(String Original, String Chave, String Linha);
    CRIPTLIB_API String VerProg();
#ifdef __cplusplus
}
namespace CriptLib
{
    class Encriptar
    {
    public:
        static void Subst(String Original, String Chave, TMemo* Memo) { Cript_BasicoM(Original, Chave, Memo); }
        static void Subst(String Original, String Chave, TStringList* Lista) { Cript_BasicoL(Original, Chave, Lista); }
        static void Subst(String Original, String Chave, String Linha) { Cript_BasicoS(Original, Chave, Linha); }
    };
    class Decriptar
    {
    public:
        static void Subst(String Chave, TMemo* Memo) { Decript_BasicoM(Chave, Memo); }
        static void Subst(String Chave, TStringList* Lista) { Decript_BasicoL(Chave, Lista); }
        static void Subst(String Original, String Chave, String Linha) { Decript_BasicoS(Original, Chave, Linha); }
    };
    class Info
    {
    public:
        static String Ver() { return VerProg(); }
    };
}
#endif
#endif

调用函数(也引发异常):

CriptLib::Encriptar::Subst(edtOriginal->Text, edtKey->Text, memoContent);

调试器说明:

第一次机会例外在 $77303E28。异常类 EInvalidCast with 消息"无效的类类型转换"。工艺项目1.exe (7476)

我已经找到了问题的确切位置。这是在使用备忘录>行->计数进行比较时 for 结构。为了确保我创建了一个整数变量并尝试与 Count 属性相等并将其用于 for(甚至像 int(Memo->Lines->Count))一样强制转换)。但是我也得到了错误。(现在使用调试器)。我坚信,一旦属性 Count 返回整数值(并且我多次使用这个表达式),它就不应该发生。

从现在开始,非常感谢。

这是一个

RTL 错误。由于我使用的是XE8版本,因此在System.Classes文件中有一个错误。你可以在这里查看:

RAD Studio 10 西雅图的错误修复列表

您必须搜索 QP# (RSP-11445)

很抱歉给您带来麻烦。