none
Wrapper - Conflito de tipos de dados - Erro: Unable to cast COM object of type 'System.__ComObject' to interface RRS feed

  • Pergunta

  • Olá Fórum, para resolver uma questão em que preciso utilizar um componente Com, em uma ferramenta Case que suporta apenas lib .Net, e onde vou ter que alterar alguns métodos para tratar o que preciso, verifiquei que seria melhor fazer conforme o Pattern Adapter

    Então, seguindo o Pattern, criei as 2 classe referentes a classe do componente Com com os métodos e propriedades que vou trabalhar:

    namespace SapDiAPI
    {
        public interface ICompany
        {
            int Connect();
            string GetLastErrorDescription();
            SapDiAPI.IRecordSet GetRecordSet();
        }
    
        public class Company : ICompany
        {
            private SAPbobsCOM.CompanyClass referenceOfCompany;
    
            public Company()
            {
                this.referenceOfCompany = new SAPbobsCOM.CompanyClass();
            }
    
            public int Connect()
            {
                return referenceOfCompany.Connect();
            }
    
            public string GetLastErrorDescription()
            {
                return referenceOfCompany.GetLastErrorDescription();
            }
    
            public SapDiAPI.IRecordSet GetRecordSet()
            {
                SAPbobsCOM.Recordset oRecordSet = null;
                oRecordSet = (SAPbobsCOM.Recordset)referenceOfCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset);
                return (SapDiAPI.IRecordSet)oRecordSet;
            }
        }
    }
    namespace SapDiAPI
    {
        public interface IRecordSet
        {
            void DoQuery(string querySql);
            bool BoF{get;}
        }
    
        public class RecordSet : IRecordSet
        {
            private SAPbobsCOM.RecordsetClass referenseOfRecordSet;
    
            public RecordSet()
            {
                this.referenseOfRecordSet = new SAPbobsCOM.RecordsetClass();
            }
    
            public bool BoF
            {
                get { return referenseOfRecordSet.BoF; }
            }
    
            public void DoQuery(string querySql)
            {
                referenseOfRecordSet.DoQuery(querySql);
            }
        }
    }

    O problema está para Iniciar o objeto RecordSet, que usando apenas o componente Com seria:

    SAPbobsCOM.Recordset oRecordSet = null;
    oRecordSet = (SAPbobsCOM.Recordset)oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset);

    Ele sempre precisa iniciar desta forma, a partir do objeto oCompnay que foi conectado, problema que este método retorna um objeto do tipo SAPbobsCOM.Recordset (fazendo um Cast), e no meu Wrapper eu tenho o SapDiAPI.IRecordSet. Tentei fazer um Cast como está no método GetRecordSet() da classe Company, mas mesmo criando a referencia da classe a partir do componente Com, ocorre o erro:

    Unable to cast COM object of type 'System.__ComObject' to interface type 'SapDiAPI.IRecordSet'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{442B9F01-C032-3C6D-85DD-E95B30746340}' failed due to the following error: Não há suporte para esta interface (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

    "

    Não sei como eu poderia fazer este Cast. Alguém teria alguma ideia?

    Agradeço,


    Diego Rodrigo

    quarta-feira, 6 de junho de 2012 18:31