Sie sind auf Seite 1von 6

FUNES DO EXTEND SYSTEM

INTRODUO
Desculpem-me por essa encheo de saco inicial, mas sou muito grato a muitas pessoas e muitas delas merecem ser colocadas nessa minha apostila. Primeiramente agradeo a minha esposa que tanto me agenta nessas madrugadas em que passo escrevendo ou fazendo pesquisas na Internet, ou quando estou com excesso de servio me traz um caf quente e reconfortante. Depois agradeo a minha filha de sete anos pelas burradas que ela faz e me faz dar muita risada. A meu pai pela gravadora de CDs que ele me deu de presente. A minha me por encher o saco do meu pai para ele me dar a gravadora de CDs de presente. E a todos os amigos que eu cativei e vou cativando pela Internet e que agora vo comear a receber os pedaos de minha apostila. A todos vocs um abrao e que Deus os abenoe. Nesta primeira parte vou descrever como programar funes em Assembler e C e integr-las no Clipper de maneira simples e usando programas encontrados inclusive como sharewares ou freewares. Os programas que estou usando atualmente so Borland C++ 5.0 (distribudo gratuitamente na prpria pgina da Borland) e para compilar alguns de meus programas em Assembler um programa chamado A86 microassembler que eu distribuo em minha pgina em http://www.geocities.com/evolver_master . Primeiramente precisamos compreender o seguinte, o Clipper se utiliza internamente de funes j criadas em C ou Assembler (vocs podem ver isso editando em hexadecimal as libs ou objs que vem com o Clipper). Para isso funcionar bem e sem conflitos (lembremos do ruWindows para isso) deve haver uma padronizao no formato com que os dados so passados entre essas funes. Apesar do que falam os programadores visuais ou de outras linguagens acadmicas e que torcem o nariz para o Clipper, esse sistema usado extremamente estvel e depende apenas de um bom programador para fazer a integrao (minhas funes em assembler esto funcionando muito bem e ainda no tive problemas com elas). Esse mtodo permite que programadores possam suprir os espaos faltantes do Clipper com seu prprio suor, sangue e lgrimas1. Essas funces so chamadas de APIs e podem ser usadas integradas com qualquer prg. Alm da apostila estou mandando junto algumas funes escritas em Assembler para que todos possam estud-las e brincar a vontade com elas. Quanto a funes escritas em C vou ficar devendo um pouco pois no sou muito bom nessa linguagem e apenas vou repassar o servio de outros amigos.

PRIMEIRA PARTE RECEBENDO DADOS


Agora chega de aporrinhao tch, e vamos partir pr vaca fria.

_PARINFA(ParamNum, IndiceVetor)
Determina o tamanho ou tipo de elemento de um vetor. O ParamNum representa a posio do parmetro dentro da lista de parmetros, ou seja, _parinfa(2) significa o segundo argumento. O IndiceVetor opcional e representa o nmero de ndice do elemento dentro da matriz, ou seja, _parinfa(1,3) significa o terceiro elemento dentro do primeiro argumento.

Isso ocorre quando sua funo de formatao de disquetes formata seu HD, voc sua frio, sangra os dedos tentando digitar comandos e mais comandos para recuperar seu dados e chora quando no consegue

Tabela 1 Tipo Clipper Nil Caractere Numrico Lgico Data Passado por Referncia Memo Vetor (Matriz) Exemplo em C: #include extend.h int tam; int tipo; tam = _parinfa(1,0); tipo = _parinfa(1,1); Exemplo em Assembler: (em assembler as funes usam dois caracteres de sublinhado) EXTRN __parinfa:FAR mov push mov push call add mov push push call add ax,0 ax ax,1 ax __parinfa sp,4 ax,1 ax ax __parinfa sp,4 Valor 0 1 2 4 8 32 65 512 Constante UNDEF CARACTER NUMERIC LOGICAL DATE MPTR MEMO ARRAY

_PARINFO(ParamNum)
Determina o nmero de parmetros ou o tipo de um parmetro. O ParamNum representa a posio do parmetro dentro da lista de parmetros, ou seja, _parinfo(2) significa o segundo argumento. (Ver Tabela 1) Exemplo em C: #include extend.h int contar; int tipo; contar = _parinfo(0); tipo = parinfo(1);

Exemplo em Assembler: EXTRN __parinfo:Far mov push call add mov push call add ax,0 ax __parinfo sp,2 ax,1 ax __parinfo sp,2

_PARL(ParamNum,IndiceVetor)
Recupera um parmetro lgico (.t. ou .f.) como inteiro (1 ou 0). Exemplo em C: #include extend.h int logico; logico = _parl(1); Exemplo em Assembler: AX (AL) conter o valor lgico EXTRN __parl:Far mov push call add ax,1 ax __parl sp,2

_PARNI(ParamNum, IndiceVetor)
Recupera um parmetro numrico como inteiro Exemplo em C: #include extend.h int inteiro; inteiro = _parni(1); Exemplo em Assembler: AX conter o valor inteiro EXTRN __parni:Far mov push call add ax,1 ax __parni sp,2

_PARNL(ParamNum, IndiceVetor)
Recupera um parametro nmerico como long Exemplo em C: #include extend.h long longo; longo = _parnl(1);

Exemplo em Assembler: AX:BX conter o valor EXTRN __parnl:Far mov push call add ax,1 ax __parnl sp,2

_PARND(ParamNum, IndiceVetor)
Recupera um parametro nmerico como Double (ponto flutuante) Exemplo em C: #include extend.h double duplo; duplo = _parnd(1); Exemplo em Assembler: AX:BX:CX:DX conter o valor EXTRN __parnd:Far mov push call add mov mov mov mov mov mov ax,1 ax __parnd sp,2 es,dx si,ax ax,es:[si] bx,es:[si + 2] cx,es:[si + 4] dx,es:[si + 6]

_PARCLEN(ParamNum, IndiceVetor)
Obtm o tamanho de um parmetro caractere como inteiro sem sinal Exemplo em C: #include extend.h unsigned int tam; tam = _parclen(1); Exemplo em Assembler: AX conter o tamanho EXTRN __parclen:Far mov push call add ax,1 ax __parclen sp,2

_PARC(ParamNum, IndiceVetor)
Recupera um valor do tipo caractere (o valor colocado em um endereo de memria portanto no deve ser usado diretamente mas atravs de uma cpia de sua referncia). Exemplo em C: #include extend.h char *linhadetexto;

linhadetexto = _parc(1);

Exemplo em Assembler: DX:AX conter o endereo de memria do parmetro caractere EXTRN __parc:Far mov push call add ax,1 ax __parc sp,2

Das könnte Ihnen auch gefallen