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;
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;
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);
TWInfo* ObtemInfo (int id);
.. podem ser assim mapeadas em Pascal :
Type TWInfoPtr = ^TWInfo;
procedure FazAlgumaCoisa (AParm : TWInfo); cdecl;
function ObtemInfo (id : integer) : TWInfoPtr; cdecl;
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 :
muito bom esse tuto \o/
estava comecando a me interesar por essa linguagem de programacao ^^ ajudou bastante
melojuliano@gmail.com
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.