5 de maio de 2009

Chamando funções e classes C++ no Delphi

Devido às suas características de linguagem próxima à linguagem de máquina, o C/ C++ é bastante popular entre os desenvolvedores de bibliotecas que buscam - ou precisam de - performance na execução de seus códigos. Basta uma pesquisa no popular site de hospedagem de softwares de código aberto SourceForge para ver a quantidade de projetos em C ou C++, abrangendo as mais diversas áreas : há brokers, servidores web, bibliotecas para renderização de gráficos 3D, tratamento de XML, etc.

Publiquei há alguns dias um texto sobre como encapsular chamadas C++ num código gerenciado (como, por exemplo, C#) mas chamar funções C/C++ ou utilizar classes C++ em Delphi é bem mais simples. Apesar de diferenças óbvias entre as duas linguagens, elas guardam muitas semelhanças que facilitam o intercâmbio. A maioria dos tipos de dados é igual, a tabela de funções virtuais de classes funciona igual, ambas possuem formas compatíveis de modificar o alinhamento de bytes em estruturas e de modificar a ordem da passagem de parâmetros na chamada de funções (esquerda para a direita ou direita para a esquerda).

Vamos por partes : é preciso mapear funções, estruturas e classes do C/C++ para Delphi, isto é, criar um fonte no Delphi com as definições de tipos e funções em pascal com base nos tipos e funções publicados pela biblioteca C/C++.

1) Os tipos de dados atômicos do C/C++ possuem correlatos em pascal. Por exemplo, considere a struct C/C++ abaixo :
typedef struct {
long id;
double qty;
char name [25];
} TWInfo;

Em pascal, o mapeamento seria como segue :
TWInfo = record
id : longint;
qty : double;
name : array [0..24] of char;
end;

Algo importante a ter em mente ao trabalhar com estruturas nessa situação é que há configuração para regular o alinhamento de bytes, isto é, a forma que o compilador determinará onde cada campo da estrutura será armazenado na memória.

2) A passagem de parâmetros para funções tem diferenças entre C e pascal, principalmente na ordem e no lugar em que os parâmetros são empilhados. Assim, as seguintes declarações de funções em C ...

void FazAlgumaCoisa (TWInfo AParm);
TWInfo* ObtemInfo (int id);

.. podem ser assim mapeadas em Pascal :

Type TWInfoPtr = ^TWInfo;
procedure FazAlgumaCoisa (AParm : TWInfo); cdecl;
function ObtemInfo (id : integer) : TWInfoPtr; cdecl;

onde cdecl instrui o compilador do Delphi a chamar essas funções da mesma forma que o C, seguindo a mesma ordem na hora de passar os parâmetros e escolhendo o mesmo local (stack ou registradores).

Para evitar deixar este post muito comprido, deixo para falar sobre a utilização de classes, tabela de funções virtuais e name mangling num próximo post.

2 comentários :

Jubas disse...

muito bom esse tuto \o/
estava comecando a me interesar por essa linguagem de programacao ^^ ajudou bastante

melojuliano@gmail.com

Jubas disse...

muito util
estava procurando por algo que falasse de Delphi

se tiverem mais sobre linguagens de programacao me avisem no meu email

melojuliano@gmail.com

Postar um comentário

OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.

Observação: somente um membro deste blog pode postar um comentário.