簡體   English   中英

Windows-FMX-無效的類別Typecast C ++

[英]Windows - FMX - Invalid Class Typecast C++

嘗試通過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。 消息為“ Invalid class typecast”的異常類EInvalidCast。 處理Project1.exe(7476)

我已經找到了問題的確切位置。 在使用“備注”->“行數”->“計數”與for結構進行比較時。 為了確保我創建了一個整數變量,並嘗試與Count屬性進行相等並將其用於for(甚至轉換為int(Memo-> Lines-> Count))。 但是我也得到了錯誤。 (現在使用調試器)。 我堅信一旦屬性Count返回一個整數值(並且我多次使用此表達式),就不會發生這種情況。

從現在開始,非常感謝。

這是一個RTL錯誤。 自從我使用XE8版本以來,它在System.Classes文件中帶有一個錯誤。 您可以在這里檢查:

西雅圖RAD Studio 10的錯誤修復列表

您將必須搜索QP#(RSP-11445)

對不起,麻煩您了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM