2016-01-24 63 views
0

我在嘗試通過DLL運行函數時遇到了一些麻煩。 執行該功能時,我得到以下錯誤(它通常編譯):Windows - FMX - 無效的類類型轉換C++

無效類類型轉換

下面是代碼:

#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); 

Debuger描述:

第一次機會異常在$ 77303E28。異常類EInvalidCast與 消息'無效類類型轉換'。 Process Project1.exe(7476)

我發現問題的確切位置。當使用Memo-> Lines-> Count來比較for結構時。爲了確保我創建了一個整型變量並試圖使用Count屬性進行均衡並將其用於(甚至像int(Memo-> Lines-> Count))。但是我也有錯誤。 (現在使用調試器)。我堅信它不應該發生,一旦屬性Count返回一個整數值(並且我多次使用這個表達式)。

從現在開始,非常感謝。

+0

您是否嘗試過使用調試器來確定引發異常的位置,如果不是,爲什麼不呢? –

+0

它只是顯示錯誤的地址,但我不知道如何識別它。所以,我決定在代碼的每一步中放入try塊,並在運行時拋出異常。 – mauroaraujo

+2

發佈了一個完整但很小的例子,讀者可以嘗試 –

回答

0

這是一個RTL錯誤。由於我使用的是XE8版本,因此在System.Classes文件中出現了一個錯誤。您可以點擊此處查看:

Bug fix list for RAD Studio 10 Seattle

你將不得不搜索QP#(RSP-11445)

我很抱歉給您添麻煩了。