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